Skip to content

Commit e023ba4

Browse files
committed
create chart store
1 parent 40bcfda commit e023ba4

1 file changed

Lines changed: 61 additions & 0 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { create } from 'zustand';
2+
3+
export type ChartId = string;
4+
export type MeasurementId = string;
5+
export type MeasurementName = string;
6+
export type MeasurementColor = string;
7+
export type MeasurementUnits = string;
8+
export type UpdateFunction = () => number;
9+
10+
export type MeasurementInfo = {
11+
readonly id: MeasurementId;
12+
readonly name: MeasurementName;
13+
readonly range: [number | null, number | null];
14+
readonly color: MeasurementColor;
15+
readonly units: MeasurementUnits;
16+
readonly getUpdate: UpdateFunction;
17+
};
18+
19+
type ChartSet = Map<ChartId, MeasurementInfo[]>;
20+
21+
type ChartStore = {
22+
charts: ChartSet;
23+
createChart: (chartId: ChartId, initialMeasurement: MeasurementInfo) => void;
24+
removeChart: (chartId: ChartId) => void;
25+
addMeasurement: (chartId: ChartId, measurement: MeasurementInfo) => void;
26+
removeMeasurement: (chartId: ChartId, measurementId: MeasurementId) => void;
27+
};
28+
29+
export const useChartStore = create<ChartStore>((set) => ({
30+
charts: new Map(),
31+
createChart: (chartId: ChartId, initialMeasurement: MeasurementInfo) => {
32+
set(() => ({
33+
charts: new Map().set(chartId, [initialMeasurement])
34+
}));
35+
},
36+
removeChart: (chartId: ChartId) => {
37+
set((state) => ({
38+
charts: new Map([...state.charts].filter(([id, _]) => id !== chartId))
39+
}));
40+
},
41+
addMeasurement: (chartId: ChartId, measurement: MeasurementInfo) => {
42+
set((state) => ({
43+
charts: new Map([...state.charts].map(([id, measurements]) => {
44+
if (id === chartId) {
45+
measurements.push(measurement);
46+
}
47+
return [id, measurements];
48+
}))
49+
}));
50+
},
51+
removeMeasurement: (chartId: ChartId, measurementId: MeasurementId) => {
52+
set((state) => ({
53+
charts: new Map([...state.charts].map(([id, measurements]) => {
54+
if (id === chartId) {
55+
return [id, measurements.filter((m) => m.id !== measurementId)];
56+
}
57+
return [id, measurements];
58+
}))
59+
}));
60+
}
61+
}));

0 commit comments

Comments
 (0)