fix(dnd): pass onDropSongs into top-level PlaylistItem instances as well (not only nested)
This commit is contained in:
parent
dc11487a9f
commit
e622219e12
@ -261,6 +261,7 @@ const RekordboxReader: React.FC = () => {
|
|||||||
|
|
||||||
// Handle drop from song list into playlist (with duplicate check and user choice)
|
// Handle drop from song list into playlist (with duplicate check and user choice)
|
||||||
const handleDropSongsToPlaylist = async (playlistName: string, songIds: string[]) => {
|
const handleDropSongsToPlaylist = async (playlistName: string, songIds: string[]) => {
|
||||||
|
console.debug('[DnD] App received drop', { playlistName, count: songIds?.length, songIds });
|
||||||
// Find target playlist current tracks
|
// Find target playlist current tracks
|
||||||
const findNode = (nodes: PlaylistNode[]): PlaylistNode | null => {
|
const findNode = (nodes: PlaylistNode[]): PlaylistNode | null => {
|
||||||
for (const n of nodes) {
|
for (const n of nodes) {
|
||||||
@ -273,7 +274,10 @@ const RekordboxReader: React.FC = () => {
|
|||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
const target = findNode(playlists);
|
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 existing = new Set(target?.tracks || []);
|
||||||
const dupes = songIds.filter(id => existing.has(id));
|
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;
|
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);
|
await handleAddSongsToPlaylist(finalIds, playlistName);
|
||||||
|
console.debug('[DnD] add completed');
|
||||||
toast({
|
toast({
|
||||||
title: 'Songs Added',
|
title: 'Songs Added',
|
||||||
description: `${finalIds.length} song${finalIds.length === 1 ? '' : 's'} added to "${playlistName}"`,
|
description: `${finalIds.length} song${finalIds.length === 1 ? '' : 's'} added to "${playlistName}"`,
|
||||||
|
|||||||
@ -255,9 +255,17 @@ const PlaylistItem: React.FC<PlaylistItemProps> = React.memo(({
|
|||||||
} else if ((window as any).__rbDragPayload) {
|
} else if ((window as any).__rbDragPayload) {
|
||||||
parsed = (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) {
|
if (parsed?.type === 'songs' && Array.isArray(parsed.songIds) && onDropSongs) {
|
||||||
console.debug('[DnD] invoking onDropSongs', node.name, parsed.songIds.length);
|
console.debug('[DnD] invoking onDropSongs', node.name, parsed.songIds.length);
|
||||||
onDropSongs(node.name, parsed.songIds);
|
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);
|
console.debug('[DnD] drop playlist', node.name, parsed, 'raw len', json?.length || 0);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@ -448,6 +456,7 @@ export const PlaylistManager: React.FC<PlaylistManagerProps> = ({
|
|||||||
onPlaylistDelete={onPlaylistDelete}
|
onPlaylistDelete={onPlaylistDelete}
|
||||||
onPlaylistMove={onPlaylistMove}
|
onPlaylistMove={onPlaylistMove}
|
||||||
allFolders={allFolders}
|
allFolders={allFolders}
|
||||||
|
onDropSongs={onDropSongs}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</VStack>
|
</VStack>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user