返回 oh-my-ppt
DeletePageDialog.tsx
根目录 / src / renderer / src / components / session-detail / modal / DeletePageDialog.tsx
1 import { useT } from '@renderer/i18n'
2 import { ipc } from '@renderer/lib/ipc'
3 import { useGenerateStore, useSessionDetailUiStore, useToastStore } from '@renderer/store'
4 import { Button } from '../../ui/Button'
5 import {
6 Dialog,
7 DialogContent,
8 DialogDescription,
9 DialogFooter,
10 DialogHeader,
11 DialogTitle
12 } from '../../ui/Dialog'
13
14 interface DeletePageDialogProps {
15 sessionId: string
16 }
17
18 export function DeletePageDialog({ sessionId }: DeletePageDialogProps): React.JSX.Element {
19 const t = useT()
20 const pageId = useSessionDetailUiStore((state) => state.deleteConfirmPageId)
21 const selectedPageId = useSessionDetailUiStore((state) => state.selectedPageId)
22 const isManagingPages = useSessionDetailUiStore((state) => state.isManagingPages)
23 const setPageId = useSessionDetailUiStore((state) => state.setDeleteConfirmPageId)
24 const toastError = useToastStore((state) => state.error)
25 const open = Boolean(pageId)
26
27 const handleOpenChange = (nextOpen: boolean): void => {
28 if (!nextOpen && !isManagingPages) setPageId(null)
29 }
30
31 const handleConfirmDeletePage = async (): Promise<void> => {
32 if (!sessionId || !pageId) return
33 useSessionDetailUiStore.getState().setIsManagingPages(true)
34 try {
35 const result = await ipc.deleteSessionPages({
36 sessionId,
37 pageIds: [pageId],
38 selectedPageId: selectedPageId || undefined
39 })
40 useGenerateStore.getState().setPages(result.generatedPages)
41 useSessionDetailUiStore.getState().setSelectedPageId(result.selectedPageId)
42 useSessionDetailUiStore.getState().bumpPreviewKey()
43 setPageId(null)
44 void ipc
45 .clearSpeechScript(sessionId)
46 .catch((err) => console.warn('[speech] clearSpeechScript failed', err))
47 } catch (error) {
48 toastError(error instanceof Error ? error.message : t('pageManagement.deleteFailed'))
49 } finally {
50 useSessionDetailUiStore.getState().setIsManagingPages(false)
51 }
52 }
53
54 return (
55 <Dialog open={open} onOpenChange={handleOpenChange}>
56 <DialogContent showClose={false}>
57 <DialogHeader>
58 <DialogTitle>{t('pageManagement.deleteConfirmTitle')}</DialogTitle>
59 <DialogDescription>{t('pageManagement.deleteConfirmDescription')}</DialogDescription>
60 </DialogHeader>
61 <DialogFooter>
62 <Button
63 type="button"
64 variant="outline"
65 size="sm"
66 onClick={() => handleOpenChange(false)}
67 disabled={isManagingPages}
68 >
69 {t('common.cancel')}
70 </Button>
71 <Button
72 type="button"
73 variant="destructive"
74 size="sm"
75 onClick={() => void handleConfirmDeletePage()}
76 disabled={isManagingPages}
77 >
78 {t('pageManagement.deleteConfirmAction')}
79 </Button>
80 </DialogFooter>
81 </DialogContent>
82 </Dialog>
83 )
84 }
85
85 lines Plain Text