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();
}
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) => {
function handleDocDrag(
e: MouseEvent,
el: HTMLElement,
doc: DocMeta,
list: HTMLElement,
setDraggingState: (isDragging: boolean) => void,
setSuppressClick: (suppress: boolean) => void,
): void {
if ((e.target as HTMLElement).closest("button")) return;
const startY = e.clientY;
let cachedItems: { el: HTMLElement; top: number; bottom: number }[] | null =
null;
let cachedItems: { el: HTMLElement; top: number; bottom: number }[] | null = null;
let prevOver: HTMLElement | undefined;
let dragging = false;
const onMove = (ev: MouseEvent) => {
if (!cachedItems) {
const domItems = [...list.querySelectorAll<HTMLElement>(".doc-item")];
@ -165,7 +165,8 @@ function setupDocInteraction(el: HTMLElement, doc: DocMeta, list: HTMLElement):
if (!dragging) {
if (Math.abs(ev.clientY - startY) < 4) return;
dragging = true;
suppressClick = true;
setDraggingState(true);
setSuppressClick(true);
el.classList.add("dragging");
document.body.style.cursor = "grabbing";
}
@ -190,9 +191,11 @@ function setupDocInteraction(el: HTMLElement, doc: DocMeta, list: HTMLElement):
}
prevOver = newOver;
};
const onScroll = () => {
cachedItems = null;
};
const onUp = () => {
window.removeEventListener("mousemove", onMove);
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);
}
dragging = false;
setDraggingState(false);
};
window.addEventListener("mousemove", onMove);
window.addEventListener("mouseup", onUp);
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", () => {
if (suppressClick) {
suppressClick = false;