refactor: extract handleDocDrag from setupDocInteraction

Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com>
This commit is contained in:
google-labs-jules[bot] 2026-09-04 07:10:03 +00:00
parent 37cfd2144b
commit 44778ae74d

View file

@ -140,20 +140,20 @@ function reorderDoc(srcId: string, targetId: string): void {
renderDocList(); renderDocList();
} }
function setupDocInteraction(el: HTMLElement, doc: DocMeta, list: HTMLElement): void { function handleDocDrag(
// Reordering uses plain mouse tracking, not the native HTML5 drag API — e: MouseEvent,
// Tauri's window-level file-drop hook (dragDropEnabled, needed for el: HTMLElement,
// dropping .numi files from Explorer) intercepts WebView2's own drag doc: DocMeta,
// sessions, so draggable="true" elements never get a valid drop target list: HTMLElement,
// and the OS always shows a "not allowed" cursor. setDraggingState: (isDragging: boolean) => void,
let dragging = false; setSuppressClick: (suppress: boolean) => void,
let suppressClick = false; ): void {
el.addEventListener("mousedown", (e) => {
if ((e.target as HTMLElement).closest("button")) return; if ((e.target as HTMLElement).closest("button")) return;
const startY = e.clientY; const startY = e.clientY;
let cachedItems: { el: HTMLElement; top: number; bottom: number }[] | null = let cachedItems: { el: HTMLElement; top: number; bottom: number }[] | null = null;
null;
let prevOver: HTMLElement | undefined; let prevOver: HTMLElement | undefined;
let dragging = false;
const onMove = (ev: MouseEvent) => { const onMove = (ev: MouseEvent) => {
if (!cachedItems) { if (!cachedItems) {
const domItems = [...list.querySelectorAll<HTMLElement>(".doc-item")]; const domItems = [...list.querySelectorAll<HTMLElement>(".doc-item")];
@ -165,7 +165,8 @@ function setupDocInteraction(el: HTMLElement, doc: DocMeta, list: HTMLElement):
if (!dragging) { if (!dragging) {
if (Math.abs(ev.clientY - startY) < 4) return; if (Math.abs(ev.clientY - startY) < 4) return;
dragging = true; dragging = true;
suppressClick = true; setDraggingState(true);
setSuppressClick(true);
el.classList.add("dragging"); el.classList.add("dragging");
document.body.style.cursor = "grabbing"; document.body.style.cursor = "grabbing";
} }
@ -190,9 +191,11 @@ function setupDocInteraction(el: HTMLElement, doc: DocMeta, list: HTMLElement):
} }
prevOver = newOver; prevOver = newOver;
}; };
const onScroll = () => { const onScroll = () => {
cachedItems = null; cachedItems = null;
}; };
const onUp = () => { const onUp = () => {
window.removeEventListener("mousemove", onMove); window.removeEventListener("mousemove", onMove);
window.removeEventListener("mouseup", onUp); window.removeEventListener("mouseup", onUp);
@ -206,11 +209,30 @@ function setupDocInteraction(el: HTMLElement, doc: DocMeta, list: HTMLElement):
if (target?.dataset.docId) reorderDoc(doc.id, target.dataset.docId); if (target?.dataset.docId) reorderDoc(doc.id, target.dataset.docId);
} }
dragging = false; dragging = false;
setDraggingState(false);
}; };
window.addEventListener("mousemove", onMove); window.addEventListener("mousemove", onMove);
window.addEventListener("mouseup", onUp); window.addEventListener("mouseup", onUp);
list.addEventListener("scroll", onScroll); list.addEventListener("scroll", onScroll);
}
function setupDocInteraction(el: HTMLElement, doc: DocMeta, list: HTMLElement): void {
// Reordering uses plain mouse tracking, not the native HTML5 drag API —
// Tauri's window-level file-drop hook (dragDropEnabled, needed for
// dropping .numi files from Explorer) intercepts WebView2's own drag
// sessions, so draggable="true" elements never get a valid drop target
// and the OS always shows a "not allowed" cursor.
let dragging = false;
let suppressClick = false;
el.addEventListener("mousedown", (e) => {
handleDocDrag(e, el, doc, list,
(d) => { dragging = d; },
(s) => { suppressClick = s; }
);
}); });
el.addEventListener("click", () => { el.addEventListener("click", () => {
if (suppressClick) { if (suppressClick) {
suppressClick = false; suppressClick = false;