import { useState, useCallback } from "react"; export interface ParsedTask { name: string; description?: string; group?: string; order: number; completed: boolean; dependencies: string[]; } interface TaskDerivationPreviewProps { tasks: ParsedTask[]; groups: string[]; fileName: string; onCreateTasks: (selectedTasks: ParsedTask[]) => void; onCancel: () => void; loading?: boolean; } export function TaskDerivationPreview({ tasks, groups, fileName, onCreateTasks, onCancel, loading = false, }: TaskDerivationPreviewProps) { const [selectedIndices, setSelectedIndices] = useState>( new Set(tasks.map((_, i) => i)) // Select all by default ); const toggleTask = useCallback((index: number) => { setSelectedIndices((prev) => { const newSet = new Set(prev); if (newSet.has(index)) { newSet.delete(index); } else { newSet.add(index); } return newSet; }); }, []); const selectAll = useCallback(() => { setSelectedIndices(new Set(tasks.map((_, i) => i))); }, [tasks]); const selectNone = useCallback(() => { setSelectedIndices(new Set()); }, []); const handleCreate = useCallback(() => { const selectedTasks = tasks.filter((_, i) => selectedIndices.has(i)); onCreateTasks(selectedTasks); }, [tasks, selectedIndices, onCreateTasks]); // Group tasks by their group property const tasksByGroup = tasks.reduce((acc, task, index) => { const groupKey = task.group || "Ungrouped"; if (!acc[groupKey]) { acc[groupKey] = []; } acc[groupKey].push({ task, index }); return acc; }, {} as Record); const selectedCount = selectedIndices.size; const totalCount = tasks.length; return (
{/* Header */}

Create Tasks from Document

Source: {fileName}

|
{/* Task List */}
{groups.length > 0 ? ( // Grouped view Object.entries(tasksByGroup).map(([groupName, groupTasks]) => (

{groupName}

{groupTasks.map(({ task, index }) => ( toggleTask(index)} /> ))}
)) ) : ( // Flat view tasks.map((task, index) => ( toggleTask(index)} /> )) )}
{/* Footer */}
{selectedCount} of {totalCount} tasks selected
{/* Chaining info */} {selectedCount > 1 && (

Tasks will be chained: each task continues from the previous one's work

)}
); } function TaskItem({ task, index, selected, onToggle, }: { task: ParsedTask; index: number; selected: boolean; onToggle: () => void; }) { return ( ); }