import React, { useMemo, useCallback } from 'react'; import { FixedSizeList as List } from 'react-window'; import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'; import { useSelector } from 'react-redux'; import { taskManagementSelectors } from '@/features/task-management/task-management.slice'; import { Task } from '@/types/task-management.types'; import TaskRow from './task-row'; interface VirtualizedTaskGroupProps { group: any; projectId: string; currentGrouping: 'status' | 'priority' | 'phase'; selectedTaskIds: string[]; onSelectTask: (taskId: string, selected: boolean) => void; onToggleSubtasks: (taskId: string) => void; height: number; width: number; } const VirtualizedTaskGroup: React.FC = React.memo(({ group, projectId, currentGrouping, selectedTaskIds, onSelectTask, onToggleSubtasks, height, width }) => { const allTasks = useSelector(taskManagementSelectors.selectAll); // Get tasks for this group using memoization for performance const groupTasks = useMemo(() => { return group.taskIds .map((taskId: string) => allTasks.find((task: Task) => task.id === taskId)) .filter((task: Task | undefined): task is Task => task !== undefined); }, [group.taskIds, allTasks]); const TASK_ROW_HEIGHT = 40; const GROUP_HEADER_HEIGHT = 40; const COLUMN_HEADER_HEIGHT = 40; const ADD_TASK_ROW_HEIGHT = 40; // Calculate total height for the group const totalHeight = GROUP_HEADER_HEIGHT + COLUMN_HEADER_HEIGHT + (groupTasks.length * TASK_ROW_HEIGHT) + ADD_TASK_ROW_HEIGHT; // Row renderer for virtualization const Row = useCallback(({ index, style }: { index: number; style: React.CSSProperties }) => { // Header row if (index === 0) { return (
{group.title} ({groupTasks.length})
); } // Column headers row if (index === 1) { return (
Key
Task
Progress
Status
Members
Labels
Priority
Time Tracking
); } // Task rows const taskIndex = index - 2; if (taskIndex >= 0 && taskIndex < groupTasks.length) { const task = groupTasks[taskIndex]; return (
); } // Add task row (last row) if (taskIndex === groupTasks.length) { return (
+ Add task
); } return null; }, [group, groupTasks, projectId, currentGrouping, selectedTaskIds, onSelectTask, onToggleSubtasks]); return (
{Row}
); }); export default VirtualizedTaskGroup;