From a7c4d1e45072cec6a557650bfc89db83a1d93798 Mon Sep 17 00:00:00 2001 From: codytseng Date: Sun, 17 Aug 2025 17:01:21 +0800 Subject: [PATCH] feat: support dnd to reorder mailbox relays --- package-lock.json | 71 +++++++++++++++++ package.json | 4 + .../MailboxSetting/MailboxRelay.tsx | 38 +++++++-- src/components/MailboxSetting/index.tsx | 77 ++++++++++++++++--- 4 files changed, 172 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index e093b1fc..776999c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,10 @@ "version": "0.1.0", "license": "MIT", "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/modifiers": "^9.0.0", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", "@getalby/bitcoin-connect-react": "^3.7.0", "@noble/hashes": "^1.6.1", "@radix-ui/react-alert-dialog": "^1.1.4", @@ -1627,6 +1631,73 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/modifiers": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-9.0.0.tgz", + "integrity": "sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", diff --git a/package.json b/package.json index 024e3921..96118830 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,10 @@ "preview": "vite preview" }, "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/modifiers": "^9.0.0", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", "@getalby/bitcoin-connect-react": "^3.7.0", "@noble/hashes": "^1.6.1", "@radix-ui/react-alert-dialog": "^1.1.4", diff --git a/src/components/MailboxSetting/MailboxRelay.tsx b/src/components/MailboxSetting/MailboxRelay.tsx index 56d7a87c..8854ce16 100644 --- a/src/components/MailboxSetting/MailboxRelay.tsx +++ b/src/components/MailboxSetting/MailboxRelay.tsx @@ -8,8 +8,10 @@ import { } from '@/components/ui/select' import { toRelay } from '@/lib/link' import { TMailboxRelay, TMailboxRelayScope } from '@/types' -import { CircleX } from 'lucide-react' +import { CircleX, GripVertical } from 'lucide-react' import { useTranslation } from 'react-i18next' +import { useSortable } from '@dnd-kit/sortable' +import { CSS } from '@dnd-kit/utilities' import RelayIcon from '../RelayIcon' export default function MailboxRelay({ @@ -24,14 +26,34 @@ export default function MailboxRelay({ const { t } = useTranslation() const { push } = useSecondaryPage() + const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ + id: mailboxRelay.url + }) + + const style = { + transform: CSS.Transform.toString(transform), + transition, + opacity: isDragging ? 0.5 : 1 + } + return ( -
-
push(toRelay(mailboxRelay.url))} - > - -
{mailboxRelay.url}
+
+
+
+ +
+
push(toRelay(mailboxRelay.url))} + > + +
{mailboxRelay.url}
+