fix(dnd): avoid parsing during dragover; only inspect types; parse on drop with guards and log raw length
This commit is contained in:
parent
b534485bde
commit
4e123d2597
@ -143,27 +143,22 @@ const PlaylistItem: React.FC<PlaylistItemProps> = React.memo(({
|
|||||||
}
|
}
|
||||||
onDragOver={(e) => {
|
onDragOver={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
// Only highlight if payload looks like songs
|
const types = Array.from((e.dataTransfer.types || []) as any);
|
||||||
const json = e.dataTransfer.getData('application/json') || e.dataTransfer.getData('text/plain');
|
const hasOurType = types.includes('application/json') || types.includes('text/plain');
|
||||||
try {
|
if (hasOurType) {
|
||||||
const parsed = JSON.parse(json);
|
|
||||||
if (parsed?.type === 'songs') {
|
|
||||||
setIsDragOver(true);
|
setIsDragOver(true);
|
||||||
}
|
}
|
||||||
console.debug('[DnD] dragover folder', node.name, parsed);
|
console.debug('[DnD] dragover folder types', node.name, types);
|
||||||
} catch (err) {
|
|
||||||
console.debug('[DnD] dragover folder parse failed', node.name, err);
|
|
||||||
}
|
|
||||||
}}
|
}}
|
||||||
onDragLeave={() => setIsDragOver(false)}
|
onDragLeave={() => setIsDragOver(false)}
|
||||||
onDrop={(e) => {
|
onDrop={(e) => {
|
||||||
try {
|
try {
|
||||||
const json = e.dataTransfer.getData('application/json') || e.dataTransfer.getData('text/plain');
|
const json = e.dataTransfer.getData('application/json') || e.dataTransfer.getData('text/plain');
|
||||||
const parsed = JSON.parse(json);
|
const parsed = json ? JSON.parse(json) : null;
|
||||||
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);
|
console.debug('[DnD] drop folder', node.name, parsed, 'raw len', json?.length || 0);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.debug('[DnD] drop folder parse failed', node.name, err);
|
console.debug('[DnD] drop folder parse failed', node.name, err);
|
||||||
}
|
}
|
||||||
@ -232,26 +227,22 @@ const PlaylistItem: React.FC<PlaylistItemProps> = React.memo(({
|
|||||||
position="relative"
|
position="relative"
|
||||||
onDragOver={(e) => {
|
onDragOver={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const json = e.dataTransfer.getData('application/json') || e.dataTransfer.getData('text/plain');
|
const types = Array.from((e.dataTransfer.types || []) as any);
|
||||||
try {
|
const hasOurType = types.includes('application/json') || types.includes('text/plain');
|
||||||
const parsed = JSON.parse(json);
|
if (hasOurType) {
|
||||||
if (parsed?.type === 'songs') {
|
|
||||||
setIsDragOver(true);
|
setIsDragOver(true);
|
||||||
}
|
}
|
||||||
console.debug('[DnD] dragover playlist', node.name, parsed);
|
console.debug('[DnD] dragover playlist types', node.name, types);
|
||||||
} catch (err) {
|
|
||||||
console.debug('[DnD] dragover playlist parse failed', node.name, err);
|
|
||||||
}
|
|
||||||
}}
|
}}
|
||||||
onDragLeave={() => setIsDragOver(false)}
|
onDragLeave={() => setIsDragOver(false)}
|
||||||
onDrop={(e) => {
|
onDrop={(e) => {
|
||||||
try {
|
try {
|
||||||
const json = e.dataTransfer.getData('application/json') || e.dataTransfer.getData('text/plain');
|
const json = e.dataTransfer.getData('application/json') || e.dataTransfer.getData('text/plain');
|
||||||
const parsed = JSON.parse(json);
|
const parsed = json ? JSON.parse(json) : null;
|
||||||
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 playlist', node.name, parsed);
|
console.debug('[DnD] drop playlist', node.name, parsed, 'raw len', json?.length || 0);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.debug('[DnD] drop playlist parse failed', node.name, err);
|
console.debug('[DnD] drop playlist parse failed', node.name, err);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user