Files
kandev/apps/web/hooks/use-task-crud.ts
T
2026-02-16 13:48:58 +00:00

76 lines
2.1 KiB
TypeScript

'use client';
import { useCallback, useState } from 'react';
import { useAppStore, useAppStoreApi } from '@/components/state-provider';
import { useTaskActions } from '@/hooks/use-task-actions';
import type { Task } from '@/components/kanban-card';
import type { KanbanState } from '@/lib/state/slices';
/**
* Custom hook that extracts task CRUD operations from the Kanban component.
* Manages dialog state and provides handlers for create, edit, and delete operations.
*
* @returns Object with dialog state and task operation handlers
*/
export function useTaskCRUD() {
const [isDialogOpen, setIsDialogOpen] = useState(false);
const [editingTask, setEditingTask] = useState<Task | null>(null);
const [deletingTaskId, setDeletingTaskId] = useState<string | null>(null);
const { deleteTaskById } = useTaskActions();
const kanban = useAppStore((state) => state.kanban);
const store = useAppStoreApi();
const handleCreate = useCallback(() => {
setEditingTask(null);
setIsDialogOpen(true);
}, []);
const handleEdit = useCallback((task: Task) => {
setEditingTask(task);
setIsDialogOpen(true);
}, []);
const handleDelete = useCallback(
async (task: Task) => {
if (!kanban.workflowId) return;
setDeletingTaskId(task.id);
try {
await deleteTaskById(task.id);
// Update UI AFTER successful delete
store.getState().hydrate({
kanban: {
...store.getState().kanban,
tasks: store.getState().kanban.tasks.filter(
(item: KanbanState['tasks'][number]) => item.id !== task.id
),
},
});
} finally {
setDeletingTaskId(null);
}
},
[deleteTaskById, kanban.workflowId, store]
);
const handleDialogOpenChange = useCallback((open: boolean) => {
setIsDialogOpen(open);
if (!open) {
setEditingTask(null);
}
}, []);
return {
isDialogOpen,
setIsDialogOpen,
editingTask,
setEditingTask,
handleCreate,
handleEdit,
handleDelete,
handleDialogOpenChange,
deletingTaskId,
};
}