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