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; emptyMessage?: string; } // 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 (
{participantName}
{sportName &&{sportName}
}{emptyMessage}
) : (