diff --git a/app/components/draft/QueueSection.tsx b/app/components/draft/QueueSection.tsx index b68193e..6fbb38e 100644 --- a/app/components/draft/QueueSection.tsx +++ b/app/components/draft/QueueSection.tsx @@ -1,4 +1,5 @@ -import { memo } from "react"; +import { memo, useCallback, useMemo } from "react"; +import { GripVertical } from "lucide-react"; import { Button } from "~/components/ui/button"; import { Badge } from "~/components/ui/badge"; import { AutodraftSettings } from "~/components/AutodraftSettings"; @@ -46,7 +47,7 @@ interface QueueSectionProps { } // Sortable queue item component -function SortableQueueItem({ +const SortableQueueItem = memo(function SortableQueueItem({ item, index, participantName, @@ -60,13 +61,14 @@ function SortableQueueItem({ participantName: string; sportName?: string; canPick: boolean; - onRemove: () => void; - onDraft?: () => void; + onRemove: (queueId: string) => void; + onDraft?: (participantId: string) => void; }) { const { attributes, listeners, setNodeRef, + setActivatorNodeRef, transform, transition, isDragging, @@ -82,29 +84,20 @@ function SortableQueueItem({
-
-
- - - - +
+
+ + {index + 1}
- {index + 1}

{participantName}

{sportName &&

{sportName}

} @@ -116,7 +109,7 @@ function SortableQueueItem({ variant="default" size="sm" className="h-7 text-xs bg-electric text-background hover:bg-electric/90" - onClick={onDraft} + onClick={() => onDraft(item.participantId)} > Draft @@ -125,7 +118,7 @@ function SortableQueueItem({ variant="ghost" size="icon" className="h-7 w-7 text-destructive hover:text-destructive hover:bg-destructive/10" - onClick={onRemove} + onClick={() => onRemove(item.id)} title="Remove from queue" > × @@ -133,7 +126,7 @@ function SortableQueueItem({
); -} +}); export const QueueSection = memo(function QueueSection({ queue, @@ -149,24 +142,33 @@ export const QueueSection = memo(function QueueSection({ onMakePick, }: QueueSectionProps) { const sensors = useSensors( - useSensor(PointerSensor), + useSensor(PointerSensor, { + activationConstraint: { distance: 8 }, + }), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates, }) ); - const handleDragEnd = (event: DragEndEvent) => { - const { active, over } = event; + const participantMap = useMemo( + () => new Map(availableParticipants.map((p) => [p.id, p])), + [availableParticipants] + ); - 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 queueIds = useMemo(() => queue.map((item) => item.id), [queue]); - const reorderedQueue = arrayMove(queue, oldIndex, newIndex); - const participantIds = reorderedQueue.map((item) => item.participantId); - onReorder(participantIds); - } - }; + 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 (
@@ -182,24 +184,22 @@ export const QueueSection = memo(function QueueSection({ onDragEnd={handleDragEnd} > item.id)} + items={queueIds} strategy={verticalListSortingStrategy} >
{queue.map((item, index) => { - const participant = availableParticipants.find( - (p) => p.id === item.participantId - ); + const participant = participantMap.get(item.participantId); return ( onRemoveFromQueue(item.id)} - onDraft={onMakePick ? () => onMakePick(item.participantId) : undefined} + onRemove={onRemoveFromQueue} + onDraft={onMakePick} /> ); })}