feat: Refactor tag interaction handling to use unified handlers

This commit is contained in:
2025-12-09 01:00:54 +01:00
parent 4f28230243
commit ebc7ce67a1
7 changed files with 47 additions and 25 deletions
@@ -1,6 +1,9 @@
import { useEffect } from 'react';
import type { MutableRefObject } from 'react';
import { isTagTransferEvent } from '../features/tagging/tagTransfer';
import {
isTagTransferEvent,
getActiveDragState,
} from '../features/tagging/tagTransfer';
interface UseWorkspaceDragDropArgs {
shellRef: MutableRefObject<HTMLElement | null>;
@@ -16,21 +19,58 @@ const useWorkspaceDragDrop = ({
return;
}
// Allow drop on workspace
// Allow drop on workspace (global app shell)
const handleTagDragOver = (event: DragEvent) => {
if (!isTagTransferEvent(event)) {
return;
}
event.preventDefault();
if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';
const { sourceDocId } = getActiveDragState();
// Only allow "Move" (removal) if the tag came from a document
if (sourceDocId) {
event.preventDefault(); // Necessary to allow dropping
if (event.dataTransfer) {
event.dataTransfer.dropEffect = 'move';
}
}
};
const handleTagDragEnter = (event: DragEvent) => {
if (!isTagTransferEvent(event)) {
return;
}
const { sourceDocId } = getActiveDragState();
if (sourceDocId) {
event.preventDefault();
if (event.dataTransfer) {
event.dataTransfer.dropEffect = 'move';
}
}
};
const handleTagDrop = (event: DragEvent) => {
if (!isTagTransferEvent(event)) {
return;
}
const { sourceDocId } = getActiveDragState();
if (sourceDocId) {
// Consume the event so the browser reports 'move' back to the source
event.preventDefault();
}
};
// Use bubbling (false) so children can stopPropagation
host.addEventListener('dragenter', handleTagDragEnter, false);
host.addEventListener('dragover', handleTagDragOver, false);
host.addEventListener('drop', handleTagDrop, false);
return () => {
host.removeEventListener('dragenter', handleTagDragEnter, false);
host.removeEventListener('dragover', handleTagDragOver, false);
host.removeEventListener('drop', handleTagDrop, false);
};
}, [shellRef]);