refactor(web): split TimelineContext into data, view, and display contexts

Reduces unnecessary re-renders by separating the monolithic 20+ property
context into TimelineDataContext, TimelineViewContext, and
TimelineDisplayContext. Panel components now subscribe only to the
slices they need.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-11 08:17:58 +02:00
parent 7eac5816d6
commit f18777c365
5 changed files with 182 additions and 134 deletions
@@ -3,7 +3,12 @@
import { clsx } from "clsx";
import { memo, startTransition, useCallback, useEffect, useMemo, useRef, useState } from "react";
import { useVirtualizer } from "@tanstack/react-virtual";
import { useTimelineContext, type TimelineAssignmentEntry } from "./TimelineContext.js";
import {
useTimelineData,
useTimelineView,
useTimelineDisplay,
type TimelineAssignmentEntry,
} from "./TimelineContext.js";
import { applyVisualOverrides, type TimelineVisualOverrides } from "./allocationVisualState.js";
import { ConflictOverlay } from "./ConflictOverlay.js";
import { computeSubLanes } from "./utils.js";
@@ -117,18 +122,9 @@ function TimelineResourcePanelInner({
gridLines,
xToDate,
}: TimelineResourcePanelProps) {
const {
resources,
allocsByResource,
vacationsByResource,
filters,
viewStart,
viewEnd,
displayMode,
heatmapScheme,
blinkOverbookedDays,
activeFilterCount,
} = useTimelineContext();
const { resources, allocsByResource, vacationsByResource } = useTimelineData();
const { filters, viewStart, viewEnd, activeFilterCount } = useTimelineView();
const { displayMode, heatmapScheme, blinkOverbookedDays } = useTimelineDisplay();
// ─── Heatmap hover state ────────────────────────────────────────────────────
const heatmapRafRef = useRef<number | null>(null);