| 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 |