blob: ea6e8d400deeaad3a3a08dbe3a79829b37566dd7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
import React from "react";
import { HubConnectionState } from "@microsoft/signalr";
import { HttpTimelineInfo } from "@/http/timeline";
import useReverseScrollPositionRemember from "@/utilities/useReverseScrollPositionRemember";
import { generatePalette, setPalette } from "@/palette";
import Timeline from "./Timeline";
export interface TimelinePageCardProps {
timeline: HttpTimelineInfo;
collapse: boolean;
toggleCollapse: () => void;
connectionStatus: HubConnectionState;
className?: string;
onReload: () => void;
}
export interface TimelinePageTemplateProps {
timelineName: string;
notFoundI18nKey: string;
reloadKey: number;
onReload: () => void;
CardComponent: React.ComponentType<TimelinePageCardProps>;
}
const TimelinePageTemplate: React.FC<TimelinePageTemplateProps> = (props) => {
const { timelineName, reloadKey, onReload, CardComponent } = props;
const [timeline, setTimeline] = React.useState<HttpTimelineInfo | null>(null);
const [connectionStatus, setConnectionStatus] =
React.useState<HubConnectionState>(HubConnectionState.Connecting);
useReverseScrollPositionRemember();
React.useEffect(() => {
if (timeline != null && timeline.color != null) {
return setPalette(generatePalette({ primary: timeline.color }));
}
}, [timeline]);
const cardCollapseLocalStorageKey = `timeline.${timelineName}.cardCollapse`;
const [cardCollapse, setCardCollapse] = React.useState<boolean>(true);
React.useEffect(() => {
const savedCollapse = window.localStorage.getItem(
cardCollapseLocalStorageKey
);
setCardCollapse(savedCollapse == null ? true : savedCollapse === "true");
}, [cardCollapseLocalStorageKey]);
const toggleCardCollapse = (): void => {
const newState = !cardCollapse;
setCardCollapse(newState);
window.localStorage.setItem(
cardCollapseLocalStorageKey,
newState.toString()
);
};
return (
<>
{timeline != null ? (
<CardComponent
className="timeline-template-card"
timeline={timeline}
collapse={cardCollapse}
toggleCollapse={toggleCardCollapse}
onReload={onReload}
connectionStatus={connectionStatus}
/>
) : null}
<div className="container">
<Timeline
timelineName={timelineName}
reloadKey={reloadKey}
onReload={onReload}
onTimelineLoaded={(t) => setTimeline(t)}
onConnectionStateChanged={setConnectionStatus}
/>
</div>
</>
);
};
export default TimelinePageTemplate;
|