import { useCallback } from "react"; import { archiveTask, deleteTask, moveTask, updateTask } from "@/lib/api"; import { replaceTaskUrl } from "@/lib/links"; import { useAppStoreApi } from "@/components/state-provider"; import { useTaskRemoval } from "@/hooks/use-task-removal"; type MovePayload = { workflow_id: string; workflow_step_id: string; position: number }; export function useTaskActions() { const moveTaskById = useCallback(async (taskId: string, payload: MovePayload) => { return moveTask(taskId, payload); }, []); const deleteTaskById = useCallback(async (taskId: string, opts?: { cascade?: boolean }) => { return deleteTask(taskId, opts); }, []); const archiveTaskById = useCallback(async (taskId: string, opts?: { cascade?: boolean }) => { return archiveTask(taskId, opts); }, []); const renameTaskById = useCallback(async (taskId: string, title: string) => { return updateTask(taskId, { title }); }, []); return { moveTaskById, deleteTaskById, archiveTaskById, renameTaskById }; } /** * Archives a task and switches to the next available task. * Shared between the PR merged banner and the sidebar archive action. */ export function useArchiveAndSwitchTask(opts?: { useLayoutSwitch?: boolean }) { const store = useAppStoreApi(); const { archiveTaskById } = useTaskActions(); const { removeTaskFromBoard } = useTaskRemoval({ store, useLayoutSwitch: opts?.useLayoutSwitch, }); return useCallback( async (taskId: string, opts?: { cascade?: boolean }) => { const { activeTaskId: wasActiveTaskId, activeSessionId: wasActiveSessionId } = store.getState().tasks; const initialSwitch = await removeTaskFromBoard(taskId, { wasActiveTaskId, wasActiveSessionId, switchOnly: true, }); try { await archiveTaskById(taskId, opts); await removeTaskFromBoard(taskId, { wasActiveTaskId, wasActiveSessionId }); } catch (error) { if ( wasActiveTaskId && initialSwitch.switchedTaskId !== null && store.getState().tasks.activeTaskId === initialSwitch.switchedTaskId ) { if (wasActiveSessionId) { store.getState().setActiveSession(wasActiveTaskId, wasActiveSessionId); } else { store.getState().setActiveTask(wasActiveTaskId); } replaceTaskUrl(wasActiveTaskId); } throw error; } }, [archiveTaskById, removeTaskFromBoard, store], ); }