diff --git a/apps/web/src/components/confirm-dialog.tsx b/apps/web/src/components/confirm-dialog.tsx index 7e36cde..71df019 100644 --- a/apps/web/src/components/confirm-dialog.tsx +++ b/apps/web/src/components/confirm-dialog.tsx @@ -13,7 +13,8 @@ import { } from '@cfdm/ui/components/alert-dialog' interface ConfirmDialogProps { - trigger: ReactElement + /** Optional when using controlled `open` (e.g. open from DropdownMenu) */ + trigger?: ReactElement title: string description?: ReactNode confirmLabel?: string @@ -55,7 +56,7 @@ export function ConfirmDialog({ return ( - + {trigger ? : null} {title} diff --git a/apps/web/src/components/layout/space-switcher.tsx b/apps/web/src/components/layout/space-switcher.tsx index 48bc9a7..1c5c8e2 100644 --- a/apps/web/src/components/layout/space-switcher.tsx +++ b/apps/web/src/components/layout/space-switcher.tsx @@ -50,6 +50,7 @@ export function SpaceSwitcher() { const currentId = spaceId ?? spaces[0]?.id const current = spaces.find((s) => s.id === currentId) ?? spaces[0] const [createOpen, setCreateOpen] = useState(false) + const [deleteOpen, setDeleteOpen] = useState(false) const [name, setName] = useState('') useEffect(() => { @@ -75,9 +76,14 @@ export function SpaceSwitcher() { } function openCreateDialog() { + // After DropdownMenu unmounts — same tick would lose focus/state queueMicrotask(() => setCreateOpen(true)) } + function openDeleteDialog() { + queueMicrotask(() => setDeleteOpen(true)) + } + async function handleCreate() { const n = name.trim() if (!n) return @@ -173,22 +179,13 @@ export function SpaceSwitcher() { Создать пространство {current && current.kind !== MAIN_KIND ? ( - void handleSoftDelete(current)} - trigger={ - e.preventDefault()} - className="text-destructive" - > - - Удалить «{current.name}» - - } - /> + + + Удалить «{current.name}» + ) : null} @@ -218,6 +215,19 @@ export function SpaceSwitcher() { + + {/* Outside DropdownMenu — иначе AlertDialog размонтируется вместе с меню */} + {current && current.kind !== MAIN_KIND ? ( + void handleSoftDelete(current)} + /> + ) : null} ) }