refactor(web): converge PlaylistTrackRow drag-reorder onto @neodrag/svelte (B4)

This commit is contained in:
2026-05-08 11:22:23 -04:00
parent 3e34f1f7b3
commit 5a174c9ef0
2 changed files with 40 additions and 26 deletions
+11 -16
View File
@@ -31,20 +31,16 @@
const playlistQuery = $derived($playlistStore);
const isOwner = $derived(user.value?.id === playlistQuery?.data?.user_id);
let dragFromPos = $state<number | null>(null);
async function onDrop(toPos: number) {
if (dragFromPos === null || !playlistQuery?.data) {
return;
}
if (dragFromPos === toPos) {
dragFromPos = null;
return;
}
const cur = playlistQuery.data.tracks.map((t) => t.position);
const moved = cur.splice(dragFromPos, 1)[0];
cur.splice(toPos, 0, moved);
dragFromPos = null;
async function onMove(fromPos: number, toPos: number) {
if (!playlistQuery?.data) return;
const tracks = playlistQuery.data.tracks;
// Clamp toPos so a drag past the list edges resolves cleanly to the
// first/last slot rather than producing an out-of-range index.
const clamped = Math.max(0, Math.min(tracks.length - 1, toPos));
if (fromPos === clamped) return;
const cur = tracks.map((t) => t.position);
const moved = cur.splice(fromPos, 1)[0];
cur.splice(clamped, 0, moved);
try {
await reorderPlaylist(id, cur);
await queryClient.invalidateQueries({ queryKey: qk.playlist(id) });
@@ -268,8 +264,7 @@
isOwner={isOwner ?? false}
onRemove={onRemove}
onPlay={onPlay}
onDragStart={(p) => (dragFromPos = p)}
onDrop={(_, p) => onDrop(p)}
onMove={onMove}
/>
{/each}
{/if}