refactor(web): extract multi-select session

This commit is contained in:
2026-04-01 11:14:28 +02:00
parent b14be80e32
commit 0181f2b304
5 changed files with 238 additions and 33 deletions
+21 -33
View File
@@ -28,6 +28,7 @@ import {
createMultiSelectState,
updateMultiSelectDraft,
} from "./timelineMultiSelect.js";
import { beginCanvasMultiSelectSession } from "./timelineMultiSelectSession.js";
import { reconcileOptimisticEntries } from "./timelineOptimisticAllocations.js";
import { createRangeSelectionState, finalizeRangeSelection, updateRangeSelectionDraft } from "./timelineRangeSelection.js";
import {
@@ -878,40 +879,27 @@ export function useTimelineDrag({
if (e.button !== 2) return;
e.preventDefault();
const initial = createMultiSelectState<MultiSelectState>(e.clientX, e.clientY, {
selectedAllocationIds: [],
selectedResourceIds: [],
dateRange: null,
multiDragDaysDelta: 0,
isMultiDragging: false,
multiDragMode: "move",
beginCanvasMultiSelectSession({
clientX: e.clientX,
clientY: e.clientY,
documentTarget: document,
cleanupRef: multiSelectCleanupRef,
stateRef: multiSelectRef,
setState: setMultiSelectState,
createInitialState: (clientX, clientY) =>
createMultiSelectState<MultiSelectState>(clientX, clientY, {
selectedAllocationIds: [],
selectedResourceIds: [],
dateRange: null,
multiDragDaysDelta: 0,
isMultiDragging: false,
multiDragMode: "move",
}),
updateState: updateMultiSelectDraft,
completeState: completeMultiSelectDraft,
initialState: INITIAL_MULTI_SELECT,
attachDrag: attachDocumentMouseDrag,
});
multiSelectRef.current = initial;
setMultiSelectState(initial);
multiSelectCleanupRef.current?.();
function handleMove(ev: MouseEvent) {
const ms = multiSelectRef.current;
if (!ms.isSelecting) return;
const updated = updateMultiSelectDraft(ms, ev.clientX, ev.clientY);
multiSelectRef.current = updated;
setMultiSelectState(updated);
}
function handleUp(ev: MouseEvent) {
multiSelectCleanupRef.current?.();
multiSelectCleanupRef.current = null;
const ms = multiSelectRef.current;
if (!ms.isSelecting) return;
const result = completeMultiSelectDraft(ms, ev.clientX, ev.clientY, INITIAL_MULTI_SELECT);
multiSelectRef.current = result.nextState;
setMultiSelectState(result.nextState);
}
multiSelectCleanupRef.current = attachDocumentMouseDrag(document, handleMove, handleUp);
}, []);
const clearMultiSelect = useCallback(() => {