import React, { useMemo, useCallback } from 'react'; import { FixedSizeList as List } from 'react-window'; import { IProjectTask } from '@/types/project/projectTasksViewModel.types'; import EnhancedKanbanTaskCard from './EnhancedKanbanTaskCard'; import './VirtualizedTaskList.css'; interface VirtualizedTaskListProps { tasks: IProjectTask[]; height: number; itemHeight?: number; activeTaskId?: string | null; overId?: string | null; onTaskRender?: (task: IProjectTask, index: number) => void; } const VirtualizedTaskList: React.FC = ({ tasks, height, itemHeight = 80, activeTaskId, overId, onTaskRender, }) => { // Memoize task data to prevent unnecessary re-renders const taskData = useMemo( () => ({ tasks, activeTaskId, overId, onTaskRender, }), [tasks, activeTaskId, overId, onTaskRender] ); // Row renderer for virtualized list const Row = useCallback( ({ index, style }: { index: number; style: React.CSSProperties }) => { const task = tasks[index]; if (!task) return null; // Call onTaskRender callback if provided onTaskRender?.(task, index); return ( ); }, [tasks, activeTaskId, overId, onTaskRender] ); // Memoize the list component to prevent unnecessary re-renders const VirtualizedList = useMemo( () => ( {Row} ), [height, tasks.length, itemHeight, taskData, Row] ); if (tasks.length === 0) { return (
No tasks in this group
); } return VirtualizedList; }; export default React.memo(VirtualizedTaskList);