"use client"; import { countGroupTasks, type SidebarGroup } from "@/lib/sidebar/apply-view"; import { SortableTaskLevel, SortableTaskNode } from "./task-switcher-subtask-dnd"; import { GroupHeader } from "./task-switcher-group"; import { TaskRow, type SubtaskToggleInfo, type TaskRowProps } from "./task-switcher-row"; import type { TaskSwitcherItem } from "./task-switcher-types"; export type TaskRowBaseProps = Omit< TaskRowProps, "task" | "subtaskToggle" | "isPinned" | "isSubTask" | "depth" >; type TaskTreeContext = { subTasksByParentId: Map; collapsedSubs: Set; onToggleSubtasks?: (parentTaskId: string) => void; pinnedSet: Set; rowProps: TaskRowBaseProps; onReorderGroup?: (groupTaskIds: string[]) => void; onReorderSubtasks?: (parentTaskId: string, orderedSubtaskIds: string[]) => void; }; function TaskTreeNode({ task, depth, ctx, isDraggable, }: { task: TaskSwitcherItem; depth: number; ctx: TaskTreeContext; isDraggable: boolean; }) { const subs = ctx.subTasksByParentId.get(task.id); const hasSubs = !!subs?.length; const subsHidden = hasSubs && !!ctx.onToggleSubtasks && ctx.collapsedSubs.has(task.id); const toggleInfo: SubtaskToggleInfo | undefined = hasSubs && ctx.onToggleSubtasks ? { subtaskCount: countGroupTasks(subs, ctx.subTasksByParentId), subtasksCollapsed: subsHidden, onToggleSubtasks: () => ctx.onToggleSubtasks!(task.id), } : undefined; const isRoot = depth === 0; const handle = ( ); const nested = !subsHidden && hasSubs ? ( ) : undefined; return ( ); } function TaskTreeLevel({ parentTaskId, tasks, depth, ctx, }: { parentTaskId: string | null; tasks: TaskSwitcherItem[]; depth: number; ctx: TaskTreeContext; }) { const onReorder = getReorderHandler(parentTaskId, ctx); return ( ( )} /> ); } function getReorderHandler(parentTaskId: string | null, ctx: TaskTreeContext) { if (parentTaskId === null) return ctx.onReorderGroup; if (!ctx.onReorderSubtasks) return undefined; return (ids: string[]) => ctx.onReorderSubtasks!(parentTaskId, ids); } export type GroupSectionProps = { group: SidebarGroup; subTasksByParentId: Map; rowProps: TaskRowBaseProps; pinnedSet: Set; isCollapsed: boolean; onToggleCollapsed: () => void; collapsedSubtaskParentIds?: string[]; onToggleSubtasks?: (parentTaskId: string) => void; showHeader: boolean; onReorderGroup?: (groupTaskIds: string[]) => void; onReorderSubtasks?: (parentTaskId: string, orderedSubtaskIds: string[]) => void; }; export function GroupSection({ group, subTasksByParentId, rowProps, pinnedSet, isCollapsed, onToggleCollapsed, collapsedSubtaskParentIds, onToggleSubtasks, showHeader, onReorderGroup, onReorderSubtasks, }: GroupSectionProps) { const totalCount = countGroupTasks(group.tasks, subTasksByParentId); const ctx: TaskTreeContext = { subTasksByParentId, collapsedSubs: new Set(collapsedSubtaskParentIds ?? []), onToggleSubtasks, pinnedSet, rowProps, onReorderGroup, onReorderSubtasks, }; return (
{showHeader && ( )} {!isCollapsed && ( )}
); }