refactor(web): extract range release resolution

This commit is contained in:
2026-04-01 11:53:11 +02:00
parent 1e2bd3d4eb
commit 2a7769a0de
5 changed files with 208 additions and 12 deletions
+12 -12
View File
@@ -39,7 +39,8 @@ import {
} from "./timelineMultiSelect.js";
import { beginCanvasMultiSelectSession } from "./timelineMultiSelectSession.js";
import { reconcileOptimisticEntries } from "./timelineOptimisticAllocations.js";
import { createRangeSelectionState, finalizeRangeSelection, updateRangeSelectionDraft } from "./timelineRangeSelection.js";
import { resolveRangeSelectionCancel, resolveRangeSelectionRelease } from "./timelineRangeRelease.js";
import { createRangeSelectionState, updateRangeSelectionDraft } from "./timelineRangeSelection.js";
import { type TouchCanvasPointerEvent, type TouchMouseDownEvent } from "./timelineTouchAdapters.js";
const DRAG_CLICK_THRESHOLD_PX = 5;
@@ -716,14 +717,12 @@ export function useTimelineDrag({
}
// Range select
const range = rangeStateRef.current;
const selection = finalizeRangeSelection(range, e.clientX, e.clientY);
if (selection) {
onRangeSelected?.(selection);
const release = resolveRangeSelectionRelease(rangeStateRef.current, e.clientX, e.clientY, INITIAL_RANGE_STATE);
if (release.kind !== "complete") return;
rangeStateRef.current = INITIAL_RANGE_STATE;
setRangeState(INITIAL_RANGE_STATE);
}
onRangeSelected?.(release.selection);
rangeStateRef.current = release.nextState;
setRangeState(release.nextState);
},
[finalizeActiveProjectDrag, onRangeSelected],
);
@@ -731,10 +730,11 @@ export function useTimelineDrag({
const onCanvasMouseLeave = useCallback(() => {
// Only cancel project-shift and range-select on canvas leave.
// Alloc drag is managed by document-level listeners and must NOT be cancelled here.
if (rangeStateRef.current.isSelecting) {
rangeStateRef.current = INITIAL_RANGE_STATE;
setRangeState(INITIAL_RANGE_STATE);
}
const cancellation = resolveRangeSelectionCancel(rangeStateRef.current, INITIAL_RANGE_STATE);
if (!cancellation.didReset) return;
rangeStateRef.current = cancellation.nextState;
setRangeState(cancellation.nextState);
}, []);
// ── Multi-select (right-click drag) ─────────────────────────────────────────