diff --git a/packages/frontend/src/App.tsx b/packages/frontend/src/App.tsx index fec6507..e7c91f0 100644 --- a/packages/frontend/src/App.tsx +++ b/packages/frontend/src/App.tsx @@ -261,6 +261,7 @@ const RekordboxReader: React.FC = () => { // Handle drop from song list into playlist (with duplicate check and user choice) const handleDropSongsToPlaylist = async (playlistName: string, songIds: string[]) => { + console.debug('[DnD] App received drop', { playlistName, count: songIds?.length, songIds }); // Find target playlist current tracks const findNode = (nodes: PlaylistNode[]): PlaylistNode | null => { for (const n of nodes) { @@ -273,7 +274,10 @@ const RekordboxReader: React.FC = () => { return null; }; const target = findNode(playlists); - if (!target) return; + if (!target) { + console.debug('[DnD] target playlist not found', playlistName); + return; + } const existing = new Set(target?.tracks || []); const dupes = songIds.filter(id => existing.has(id)); @@ -285,8 +289,12 @@ const RekordboxReader: React.FC = () => { } const finalIds = proceedMode === 'skip' ? songIds.filter(id => !existing.has(id)) : songIds; - if (finalIds.length === 0) return; + if (finalIds.length === 0) { + console.debug('[DnD] nothing to add after duplicate filter'); + return; + } await handleAddSongsToPlaylist(finalIds, playlistName); + console.debug('[DnD] add completed'); toast({ title: 'Songs Added', description: `${finalIds.length} song${finalIds.length === 1 ? '' : 's'} added to "${playlistName}"`, diff --git a/packages/frontend/src/components/PlaylistManager.tsx b/packages/frontend/src/components/PlaylistManager.tsx index a095696..fab6554 100644 --- a/packages/frontend/src/components/PlaylistManager.tsx +++ b/packages/frontend/src/components/PlaylistManager.tsx @@ -255,9 +255,17 @@ const PlaylistItem: React.FC = React.memo(({ } else if ((window as any).__rbDragPayload) { parsed = (window as any).__rbDragPayload; } + console.debug('[DnD] drop playlist handler presence', node.name, Boolean(onDropSongs)); if (parsed?.type === 'songs' && Array.isArray(parsed.songIds) && onDropSongs) { console.debug('[DnD] invoking onDropSongs', node.name, parsed.songIds.length); onDropSongs(node.name, parsed.songIds); + } else { + console.debug('[DnD] drop playlist no action', node.name, { + hasParsed: Boolean(parsed), + type: parsed?.type, + isArray: Array.isArray(parsed?.songIds), + hasHandler: Boolean(onDropSongs) + }); } console.debug('[DnD] drop playlist', node.name, parsed, 'raw len', json?.length || 0); } catch (err) { @@ -448,6 +456,7 @@ export const PlaylistManager: React.FC = ({ onPlaylistDelete={onPlaylistDelete} onPlaylistMove={onPlaylistMove} allFolders={allFolders} + onDropSongs={onDropSongs} /> ))}