import React, { useState, useCallback, useRef, useEffect } from 'react'; import { Box } from '@mantine/core'; import styles from '../PageEditor.module.css'; interface DragDropItem { id: string; splitBefore?: boolean; } interface DragDropGridProps { items: T[]; selectedItems: string[]; selectionMode: boolean; isAnimating: boolean; onDragStart: (itemId: string) => void; onDragEnd: () => void; onDragOver: (e: React.DragEvent) => void; onDragEnter: (itemId: string) => void; onDragLeave: () => void; onDrop: (e: React.DragEvent, targetId: string | 'end') => void; onEndZoneDragEnter: () => void; renderItem: (item: T, index: number, refs: React.MutableRefObject>) => React.ReactNode; renderSplitMarker?: (item: T, index: number) => React.ReactNode; draggedItem: string | null; dropTarget: string | null; multiItemDrag: {itemIds: string[], count: number} | null; dragPosition: {x: number, y: number} | null; } const DragDropGrid = ({ items, selectedItems, selectionMode, isAnimating, onDragStart, onDragEnd, onDragOver, onDragEnter, onDragLeave, onDrop, onEndZoneDragEnter, renderItem, renderSplitMarker, draggedItem, dropTarget, multiItemDrag, dragPosition, }: DragDropGridProps) => { const itemRefs = useRef>(new Map()); // Global drag cleanup useEffect(() => { const handleGlobalDragEnd = () => { onDragEnd(); }; const handleGlobalDrop = (e: DragEvent) => { e.preventDefault(); }; if (draggedItem) { document.addEventListener('dragend', handleGlobalDragEnd); document.addEventListener('drop', handleGlobalDrop); } return () => { document.removeEventListener('dragend', handleGlobalDragEnd); document.removeEventListener('drop', handleGlobalDrop); }; }, [draggedItem, onDragEnd]); return (
{items.map((item, index) => ( {/* Split marker */} {renderSplitMarker && item.splitBefore && index > 0 && renderSplitMarker(item, index)} {/* Item */} {renderItem(item, index, itemRefs)} ))} {/* End drop zone */}
onDrop(e, 'end')} >
Drop here to
move to end
{/* Multi-item drag indicator */} {multiItemDrag && dragPosition && (
{multiItemDrag.count} items
)}
); }; export default DragDropGrid;