feat: enhance drag-and-drop functionality in CustomSettings component

This commit is contained in:
alexsparkes
2026-01-24 22:41:00 +00:00
parent 9688f0ba96
commit a763ead3ec

View File

@@ -33,7 +33,9 @@ const CustomSettings = memo(() => {
const [urlError, setUrlError] = useState(''); const [urlError, setUrlError] = useState('');
const [currentBackgroundIndex, setCurrentBackgroundIndex] = useState(0); const [currentBackgroundIndex, setCurrentBackgroundIndex] = useState(0);
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
const [isDragging, setIsDragging] = useState(false);
const customDnd = useRef(null); const customDnd = useRef(null);
const dragCounter = useRef(0);
// Load backgrounds from IndexedDB on mount // Load backgrounds from IndexedDB on mount
useEffect(() => { useEffect(() => {
@@ -157,10 +159,35 @@ const CustomSettings = memo(() => {
const handleDragOver = (e) => { const handleDragOver = (e) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation();
};
const handleDragEnter = (e) => {
e.preventDefault();
e.stopPropagation();
dragCounter.current++;
console.log('Drag enter, counter:', dragCounter.current);
if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {
setIsDragging(true);
console.log('Setting isDragging to true');
}
};
const handleDragLeave = (e) => {
e.preventDefault();
e.stopPropagation();
dragCounter.current--;
if (dragCounter.current === 0) {
setIsDragging(false);
}
}; };
const handleDrop = (e) => { const handleDrop = (e) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation();
setIsDragging(false);
dragCounter.current = 0;
const files = Array.from(e.dataTransfer.files); const files = Array.from(e.dataTransfer.files);
const settings = {}; const settings = {};
@@ -213,13 +240,15 @@ const CustomSettings = memo(() => {
}; };
dnd.ondragover = handleDragOver; dnd.ondragover = handleDragOver;
dnd.ondragenter = handleDragOver; dnd.ondragenter = handleDragEnter;
dnd.ondragleave = handleDragLeave;
dnd.ondrop = handleDrop; dnd.ondrop = handleDrop;
return () => { return () => {
if (dnd) { if (dnd) {
dnd.ondragover = null; dnd.ondragover = null;
dnd.ondragenter = null; dnd.ondragenter = null;
dnd.ondragleave = null;
dnd.ondrop = null; dnd.ondrop = null;
} }
}; };
@@ -237,7 +266,20 @@ const CustomSettings = memo(() => {
return ( return (
<> <>
<div className="dropzone" ref={customDnd}> <div
className={`dropzone ${isDragging ? 'dragging' : ''}`}
ref={customDnd}
style={
isDragging
? {
outline: '2px dashed #ff5c25',
outlineOffset: '-2px',
backgroundColor: 'rgba(255, 92, 37, 0.1)',
transition: 'all 0.2s ease',
}
: {}
}
>
<div className="imagesTopBar"> <div className="imagesTopBar">
<div> <div>
<MdAddPhotoAlternate /> <MdAddPhotoAlternate />