'use client' import { useState, useRef, useCallback } from 'react' import { usePartyStore } from '@/store/partyStore' export default function QueueCard() { const { queue, curIdx, setCurIdx, generateMix, reorderQueue } = usePartyStore() const [open, setOpen] = useState(false) const dragSrcIdx = useRef(null) const handleQueueClick = (e: React.MouseEvent, idx: number) => { if ((e.target as HTMLElement).closest('.drag-handle')) return setCurIdx(idx) } const onDragStart = useCallback((idx: number, el: HTMLElement) => { dragSrcIdx.current = idx el.classList.add('dragging') }, []) const onDragEnd = useCallback((el: HTMLElement) => { el.classList.remove('dragging') document.querySelectorAll('.q-item').forEach((i) => i.classList.remove('drag-over')) }, []) const onDragOver = useCallback((e: React.DragEvent, el: HTMLElement) => { e.preventDefault() document.querySelectorAll('.q-item').forEach((i) => i.classList.remove('drag-over')) el.classList.add('drag-over') }, []) const onDrop = useCallback( (e: React.DragEvent, tgtIdx: number, el: HTMLElement) => { e.preventDefault() el.classList.remove('drag-over') if (dragSrcIdx.current === null || dragSrcIdx.current === tgtIdx) return reorderQueue(dragSrcIdx.current, tgtIdx) dragSrcIdx.current = null }, [reorderQueue], ) if (!queue.length) return null return (
setOpen((o) => !o)} className="flex items-center justify-between px-4 py-3 cursor-pointer hover:bg-surface2 transition-colors duration-100 select-none sm:px-3" >
Очередь · {queue.length} треков
{queue.map((item, i) => { const active = i === curIdx return (
handleQueueClick(e, i)} onDragStart={(e) => onDragStart(i, e.currentTarget)} onDragEnd={(e) => onDragEnd(e.currentTarget)} onDragOver={(e) => onDragOver(e, e.currentTarget)} onDrop={(e) => onDrop(e, i, e.currentTarget)} >
{active ? (
) : ( {i + 1} )} {item.img ? ( ((e.target as HTMLImageElement).style.display = 'none')} /> ) : (
)} {item.title} {item.owner}
) })}
) }