mirror of
https://github.com/Horizontal42/summarum.git
synced 2026-11-11 02:12:00 +03:00
refactor: extract handleDocDrag from setupDocInteraction
Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com>
This commit is contained in:
parent
37cfd2144b
commit
44778ae74d
1 changed files with 83 additions and 61 deletions
46
src/main.ts
46
src/main.ts
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue