1import { useState } from "react";
2import {
3 deriveTimelineEntriesFromVisibleTurnItemsWithState,
4 type TimelineEntriesInput,
5 type TimelineEntriesProjection,
6} from "../session-logic";
7
8function sameInput(left: TimelineEntriesInput, right: TimelineEntriesInput): boolean {
9 return (
10 left.visibleTurnItems === right.visibleTurnItems &&
11 left.optimisticMessages === right.optimisticMessages &&
12 left.anchoredMessages === right.anchoredMessages &&
13 left.attachmentUrlById === right.attachmentUrlById &&
14 left.attempts === right.attempts &&
15 left.nodes === right.nodes &&
16 left.plans === right.plans
17 );
18}
19
20export function useIncrementalTimelineEntries(
21 threadKey: string | null,
22 input: TimelineEntriesInput,
23): TimelineEntriesProjection["entries"] {
24 const [state, setState] = useState(() => ({
25 threadKey,
26 projection: deriveTimelineEntriesFromVisibleTurnItemsWithState(input),
27 }));
28 if (state.threadKey === threadKey && sameInput(state.projection.input, input)) {
29 return state.projection.entries;
30 }
31 const projection = deriveTimelineEntriesFromVisibleTurnItemsWithState(
32 input,
33 state.threadKey === threadKey ? state.projection : null,
34 );
35 setState({ threadKey, projection });
36 return projection.entries;
37}