fix(dnd): robust drop parsing with window fallback; keep previous sidebar border look; add global payload for reliability
This commit is contained in:
parent
8394f4b42f
commit
5a6710b0eb
@ -243,6 +243,9 @@ 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 {
|
try {
|
||||||
console.debug('[DnD] dragstart payload', payload);
|
console.debug('[DnD] dragstart payload', payload);
|
||||||
} catch {}
|
} catch {}
|
||||||
@ -251,6 +254,7 @@ export const PaginatedSongList: React.FC<PaginatedSongListProps> = memo(({
|
|||||||
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
|
||||||
|
|||||||
@ -224,9 +224,8 @@ const PlaylistItem: React.FC<PlaylistItemProps> = React.memo(({
|
|||||||
borderRight="1px solid"
|
borderRight="1px solid"
|
||||||
borderRightColor="whiteAlpha.200"
|
borderRightColor="whiteAlpha.200"
|
||||||
position="relative"
|
position="relative"
|
||||||
border="1px solid"
|
border={selectedItem === node.name ? '1px solid' : undefined}
|
||||||
borderColor={selectedItem === node.name ? 'blue.800' : 'transparent'}
|
borderColor={selectedItem === node.name ? 'blue.800' : undefined}
|
||||||
_hover={{ ...(selectedItem === node.name ? {} : { borderColor: 'whiteAlpha.300' }) }}
|
|
||||||
onDragOver={(e) => {
|
onDragOver={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const types = Array.from((e.dataTransfer.types || []) as any);
|
const types = Array.from((e.dataTransfer.types || []) as any);
|
||||||
@ -239,8 +238,14 @@ const PlaylistItem: React.FC<PlaylistItemProps> = React.memo(({
|
|||||||
onDragLeave={() => setIsDragOver(false)}
|
onDragLeave={() => setIsDragOver(false)}
|
||||||
onDrop={(e) => {
|
onDrop={(e) => {
|
||||||
try {
|
try {
|
||||||
const json = e.dataTransfer.getData('application/json') || e.dataTransfer.getData('text/plain');
|
let json = e.dataTransfer.getData('application/json');
|
||||||
const parsed = json ? JSON.parse(json) : null;
|
if (!json) json = e.dataTransfer.getData('text/plain');
|
||||||
|
let parsed: any = null;
|
||||||
|
if (json && json.trim().length > 0) {
|
||||||
|
parsed = JSON.parse(json);
|
||||||
|
} else if ((window as any).__rbDragPayload) {
|
||||||
|
parsed = (window as any).__rbDragPayload;
|
||||||
|
}
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user