chore(dnd): remove debug logs and globals; keep clean drag/drop with proper handlers and UX; no functional changes
This commit is contained in:
parent
e622219e12
commit
91fd5077d4
@ -250,9 +250,7 @@ const RekordboxReader: React.FC = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const updatedFullTree = applyAdd(fullTree);
|
const updatedFullTree = applyAdd(fullTree);
|
||||||
console.debug('[DnD] saving playlists with added tracks', { playlistName, addCount: songIds.length });
|
|
||||||
await api.savePlaylists(updatedFullTree);
|
await api.savePlaylists(updatedFullTree);
|
||||||
console.debug('[DnD] playlists saved');
|
|
||||||
|
|
||||||
// Reload structure for UI counters
|
// Reload structure for UI counters
|
||||||
const structure = await api.getPlaylistStructure();
|
const structure = await api.getPlaylistStructure();
|
||||||
@ -261,7 +259,6 @@ 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) {
|
||||||
@ -274,10 +271,7 @@ const RekordboxReader: React.FC = () => {
|
|||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
const target = findNode(playlists);
|
const target = findNode(playlists);
|
||||||
if (!target) {
|
if (!target) return;
|
||||||
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));
|
||||||
|
|
||||||
@ -289,12 +283,8 @@ 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) {
|
if (finalIds.length === 0) return;
|
||||||
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}"`,
|
||||||
|
|||||||
@ -243,18 +243,11 @@ export const PaginatedSongList: React.FC<PaginatedSongListProps> = memo(({
|
|||||||
e.dataTransfer.setData('application/json', JSON.stringify(payload));
|
e.dataTransfer.setData('application/json', JSON.stringify(payload));
|
||||||
e.dataTransfer.setData('text/plain', JSON.stringify(payload));
|
e.dataTransfer.setData('text/plain', JSON.stringify(payload));
|
||||||
e.dataTransfer.effectAllowed = 'copyMove';
|
e.dataTransfer.effectAllowed = 'copyMove';
|
||||||
try {
|
|
||||||
(window as any).__rbDragPayload = payload;
|
|
||||||
} catch {}
|
|
||||||
try {
|
|
||||||
console.debug('[DnD] dragstart payload', payload);
|
|
||||||
} catch {}
|
|
||||||
}, [selectedSongs]);
|
}, [selectedSongs]);
|
||||||
|
|
||||||
const handleDragEnd = useCallback(() => {
|
const handleDragEnd = useCallback(() => {
|
||||||
setIsDragging(false);
|
setIsDragging(false);
|
||||||
dragSelectionRef.current = null;
|
dragSelectionRef.current = null;
|
||||||
try { (window as any).__rbDragPayload = null; } catch {}
|
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// Memoized song items to prevent unnecessary re-renders
|
// Memoized song items to prevent unnecessary re-renders
|
||||||
|
|||||||
@ -150,7 +150,6 @@ const PlaylistItem: React.FC<PlaylistItemProps> = React.memo(({
|
|||||||
try { e.dataTransfer.dropEffect = 'copy'; } catch {}
|
try { e.dataTransfer.dropEffect = 'copy'; } catch {}
|
||||||
setIsDragOver(true);
|
setIsDragOver(true);
|
||||||
}
|
}
|
||||||
console.debug('[DnD] dragover folder types', node.name, types);
|
|
||||||
}}
|
}}
|
||||||
onDragLeave={() => setIsDragOver(false)}
|
onDragLeave={() => setIsDragOver(false)}
|
||||||
onDrop={(e) => {
|
onDrop={(e) => {
|
||||||
@ -162,10 +161,7 @@ const PlaylistItem: React.FC<PlaylistItemProps> = React.memo(({
|
|||||||
if (parsed?.type === 'songs' && Array.isArray(parsed.songIds) && onDropSongs) {
|
if (parsed?.type === 'songs' && Array.isArray(parsed.songIds) && onDropSongs) {
|
||||||
onDropSongs(node.name, parsed.songIds);
|
onDropSongs(node.name, parsed.songIds);
|
||||||
}
|
}
|
||||||
console.debug('[DnD] drop folder', node.name, parsed, 'raw len', json?.length || 0);
|
} catch {}
|
||||||
} catch (err) {
|
|
||||||
console.debug('[DnD] drop folder parse failed', node.name, err);
|
|
||||||
}
|
|
||||||
setIsDragOver(false);
|
setIsDragOver(false);
|
||||||
}}
|
}}
|
||||||
boxShadow={isDragOver ? 'inset 0 0 0 1px var(--chakra-colors-blue-400)' : 'none'}
|
boxShadow={isDragOver ? 'inset 0 0 0 1px var(--chakra-colors-blue-400)' : 'none'}
|
||||||
@ -240,7 +236,6 @@ const PlaylistItem: React.FC<PlaylistItemProps> = React.memo(({
|
|||||||
try { e.dataTransfer.dropEffect = 'copy'; } catch {}
|
try { e.dataTransfer.dropEffect = 'copy'; } catch {}
|
||||||
setIsDragOver(true);
|
setIsDragOver(true);
|
||||||
}
|
}
|
||||||
console.debug('[DnD] dragover playlist types', node.name, types);
|
|
||||||
}}
|
}}
|
||||||
onDragLeave={() => setIsDragOver(false)}
|
onDragLeave={() => setIsDragOver(false)}
|
||||||
onDrop={(e) => {
|
onDrop={(e) => {
|
||||||
@ -252,25 +247,11 @@ const PlaylistItem: React.FC<PlaylistItemProps> = React.memo(({
|
|||||||
let parsed: any = null;
|
let parsed: any = null;
|
||||||
if (json && json.trim().length > 0) {
|
if (json && json.trim().length > 0) {
|
||||||
parsed = JSON.parse(json);
|
parsed = JSON.parse(json);
|
||||||
} 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) {
|
if (parsed?.type === 'songs' && Array.isArray(parsed.songIds) && onDropSongs) {
|
||||||
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);
|
|
||||||
} catch (err) {
|
|
||||||
console.debug('[DnD] drop playlist parse failed', node.name, err);
|
|
||||||
}
|
}
|
||||||
|
} catch {}
|
||||||
setIsDragOver(false);
|
setIsDragOver(false);
|
||||||
}}
|
}}
|
||||||
boxShadow={isDragOver ? 'inset 0 0 0 1px var(--chakra-colors-blue-400)' : 'none'}
|
boxShadow={isDragOver ? 'inset 0 0 0 1px var(--chakra-colors-blue-400)' : 'none'}
|
||||||
@ -366,6 +347,7 @@ export const PlaylistManager: React.FC<PlaylistManagerProps> = ({
|
|||||||
onPlaylistDelete,
|
onPlaylistDelete,
|
||||||
onFolderCreate,
|
onFolderCreate,
|
||||||
onPlaylistMove,
|
onPlaylistMove,
|
||||||
|
onDropSongs,
|
||||||
}) => {
|
}) => {
|
||||||
const { isOpen: isPlaylistModalOpen, onOpen: onPlaylistModalOpen, onClose: onPlaylistModalClose } = useDisclosure();
|
const { isOpen: isPlaylistModalOpen, onOpen: onPlaylistModalOpen, onClose: onPlaylistModalClose } = useDisclosure();
|
||||||
const { isOpen: isFolderModalOpen, onOpen: onFolderModalOpen, onClose: onFolderModalClose } = useDisclosure();
|
const { isOpen: isFolderModalOpen, onOpen: onFolderModalOpen, onClose: onFolderModalClose } = useDisclosure();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user