Skip to content

Commit b6ada1a

Browse files
authored
Merge pull request #6884 from github-roushan/dismiss-dropdown
fix: hide thread dropdown on delete dialog confirmation popup
2 parents cec7bfa + d66136a commit b6ada1a

File tree

2 files changed

+52
-18
lines changed

2 files changed

+52
-18
lines changed

web-app/src/containers/ThreadList.tsx

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
IconStar,
1919
IconFolder,
2020
IconX,
21+
IconTrash,
2122
} from '@tabler/icons-react'
2223
import { useThreads } from '@/hooks/useThreads'
2324
import { useThreadManagement } from '@/hooks/useThreadManagement'
@@ -81,6 +82,7 @@ const SortableItem = memo(
8182
const getMessages = useMessages((state) => state.getMessages)
8283
const { t } = useTranslation()
8384
const [openDropdown, setOpenDropdown] = useState(false)
85+
const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false)
8486
const navigate = useNavigate()
8587
// Check if current route matches this thread's detail page
8688
const matches = useMatches()
@@ -306,14 +308,28 @@ const SortableItem = memo(
306308
</>
307309
)}
308310
<DropdownMenuSeparator />
309-
<DeleteThreadDialog
310-
thread={thread}
311-
onDelete={deleteThread}
312-
onDropdownClose={() => setOpenDropdown(false)}
313-
variant={variant}
314-
/>
311+
<DropdownMenuItem
312+
onSelect={(e) => {
313+
e.preventDefault()
314+
e.stopPropagation()
315+
setDeleteConfirmOpen(true)
316+
setOpenDropdown(false)
317+
}}
318+
>
319+
<IconTrash />
320+
<span>{t('common:delete')}</span>
321+
</DropdownMenuItem>
315322
</DropdownMenuContent>
316323
</DropdownMenu>
324+
<DeleteThreadDialog
325+
thread={thread}
326+
onDelete={deleteThread}
327+
onDropdownClose={() => setOpenDropdown(false)}
328+
variant={variant}
329+
open={deleteConfirmOpen}
330+
onOpenChange={setDeleteConfirmOpen}
331+
withoutTrigger
332+
/>
317333
</div>
318334
</div>
319335
)

web-app/src/containers/dialogs/DeleteThreadDialog.tsx

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,32 +20,48 @@ import { route } from '@/constants/routes'
2020
interface DeleteThreadDialogProps {
2121
thread: Thread
2222
onDelete: (threadId: string) => void
23-
onDropdownClose: () => void
23+
onDropdownClose?: () => void
2424
variant?: 'default' | 'project'
25+
open?: boolean
26+
onOpenChange?: (open: boolean) => void
27+
withoutTrigger?: boolean
2528
}
2629

2730
export function DeleteThreadDialog({
2831
thread,
2932
onDelete,
3033
onDropdownClose,
3134
variant = 'default',
35+
open,
36+
onOpenChange,
37+
withoutTrigger,
3238
}: DeleteThreadDialogProps) {
3339
const { t } = useTranslation()
3440
const navigate = useNavigate()
35-
const [isOpen, setIsOpen] = useState(false)
41+
const [internalOpen, setInternalOpen] = useState(false)
3642
const deleteButtonRef = useRef<HTMLButtonElement>(null)
3743

44+
const isControlled = open !== undefined
45+
const isOpen = isControlled ? !!open : internalOpen
46+
const setOpenSafe = (next: boolean) => {
47+
if (isControlled) {
48+
onOpenChange?.(next)
49+
} else {
50+
setInternalOpen(next)
51+
}
52+
}
53+
3854
const handleOpenChange = (open: boolean) => {
39-
setIsOpen(open)
55+
setOpenSafe(open)
4056
if (!open) {
41-
onDropdownClose()
57+
onDropdownClose?.()
4258
}
4359
}
4460

4561
const handleDelete = () => {
4662
onDelete(thread.id)
47-
setIsOpen(false)
48-
onDropdownClose()
63+
setOpenSafe(false)
64+
onDropdownClose?.()
4965
toast.success(t('common:toast.deleteThread.title'), {
5066
id: 'delete-thread',
5167
description: t('common:toast.deleteThread.description'),
@@ -65,12 +81,14 @@ export function DeleteThreadDialog({
6581

6682
return (
6783
<Dialog open={isOpen} onOpenChange={handleOpenChange}>
68-
<DialogTrigger asChild>
69-
<DropdownMenuItem onSelect={(e) => e.preventDefault()}>
70-
<IconTrash />
71-
<span>{t('common:delete')}</span>
72-
</DropdownMenuItem>
73-
</DialogTrigger>
84+
{!withoutTrigger && (
85+
<DialogTrigger asChild>
86+
<DropdownMenuItem onSelect={(e) => e.preventDefault()}>
87+
<IconTrash />
88+
<span>{t('common:delete')}</span>
89+
</DropdownMenuItem>
90+
</DialogTrigger>
91+
)}
7492
<DialogContent
7593
onOpenAutoFocus={(e) => {
7694
e.preventDefault()

0 commit comments

Comments
 (0)