返回 oh-my-ppt
useSessionReorderPages.ts
根目录 / src / renderer / src / components / session-detail / hooks / useSessionReorderPages.ts
1 import { useState } from 'react'
2 import { ipc } from '@renderer/lib/ipc'
3 import { useGenerateStore, useSessionDetailUiStore, useToastStore } from '@renderer/store'
4 import { useT } from '@renderer/i18n'
5
6 /**
7 * Shared page-reorder side-effects. Sidebar and browse mode both commit on
8 * drag end, so the persist + history-version path stays in one place.
9 *
10 * Behavior mirrors the original `usePageSidebarController.handleReorderPages`.
11 */
12 export function useSessionReorderPages(sessionId: string): {
13 reorder: (orderedPageIds: string[], selectedPageId?: string) => Promise<boolean>
14 isReordering: boolean
15 } {
16 const t = useT()
17 const toastError = useToastStore((state) => state.error)
18 const [isReordering, setIsReordering] = useState(false)
19
20 const reorder = async (
21 orderedPageIds: string[],
22 selectedPageId?: string
23 ): Promise<boolean> => {
24 if (!sessionId) return false
25 useSessionDetailUiStore.getState().setIsManagingPages(true)
26 setIsReordering(true)
27 try {
28 const result = await ipc.reorderSessionPages({
29 sessionId,
30 orderedPageIds,
31 selectedPageId
32 })
33 useGenerateStore.getState().setPages(result.generatedPages)
34 useSessionDetailUiStore.getState().setSelectedPageId(result.selectedPageId)
35 void ipc
36 .clearSpeechScript(sessionId)
37 .catch((err) => console.warn('[speech] clearSpeechScript failed', err))
38 return true
39 } catch (error) {
40 toastError(error instanceof Error ? error.message : t('pageManagement.reorderFailed'))
41 return false
42 } finally {
43 useSessionDetailUiStore.getState().setIsManagingPages(false)
44 setIsReordering(false)
45 }
46 }
47
48 return { reorder, isReordering }
49 }
50
50 lines TYPESCRIPT