import { memo, useCallback, useMemo } from "react"; import { GripVertical } from "lucide-react"; import { Button } from "~/components/ui/button"; import { Badge } from "~/components/ui/badge"; import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, } from "@dnd-kit/core"; import type { DragEndEvent } from "@dnd-kit/core"; import { arrayMove, SortableContext, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy, } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; interface QueueSectionProps { queue: Array<{ id: string; participantId: string; }>; availableParticipants: Array<{ id: string; name: string; sport: { name: string }; }>; canPick: boolean; onRemoveFromQueue: (queueId: string) => void; onReorder: (participantIds: string[]) => void; onMakePick?: (participantId: string) => void; } // Sortable queue item component const SortableQueueItem = memo(function SortableQueueItem({ item, index, participantName, sportName, canPick, onRemove, onDraft, }: { item: { id: string; participantId: string }; index: number; participantName: string; sportName?: string; canPick: boolean; onRemove: (queueId: string) => void; onDraft?: (participantId: string) => void; }) { const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging, } = useSortable({ id: item.id }); const style = { transform: CSS.Transform.toString(transform), transition, opacity: isDragging ? 0.5 : 1, }; return (
{index + 1}

{participantName}

{sportName &&

{sportName}

}
{canPick && onDraft && (
)}
); }); export const QueueSection = memo(function QueueSection({ queue, availableParticipants, canPick, onRemoveFromQueue, onReorder, onMakePick, }: QueueSectionProps) { const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { distance: 8 }, }), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates, }) ); const participantMap = useMemo( () => new Map(availableParticipants.map((p) => [p.id, p])), [availableParticipants] ); const queueIds = useMemo(() => queue.map((item) => item.id), [queue]); const handleDragEnd = useCallback( (event: DragEndEvent) => { const { active, over } = event; if (over && active.id !== over.id) { const oldIndex = queue.findIndex((item) => item.id === active.id); const newIndex = queue.findIndex((item) => item.id === over.id); const reorderedQueue = arrayMove(queue, oldIndex, newIndex); onReorder(reorderedQueue.map((item) => item.participantId)); } }, [queue, onReorder] ); return (
{/* Queue List */} {queue.length === 0 ? (

Click participants in Available to add to your queue

) : (
{queue.map((item, index) => { const participant = participantMap.get(item.participantId); return ( ); })}
)}
); });