11import React , { useMemo , useState } from 'react' ;
2- import { View , StyleSheet , TouchableOpacity , Text } from 'react-native' ;
2+ import { View , StyleSheet , TouchableOpacity , Text , Switch } from 'react-native' ;
33import Chart , { ChartProps , Dataset } from 'react-native-d3-chart' ;
44
55type TimeDomainType = 'hour' | 'day' | 'week' | 'month' ;
@@ -42,37 +42,54 @@ const generateDataPoints = ({
4242 return points ;
4343} ;
4444
45- const datasets : Dataset [ ] = [
46- {
47- unit : 'kg' ,
45+ enum Measurement {
46+ Red = 'Red' ,
47+ Blue = 'Blue' ,
48+ Green = 'Green' ,
49+ Pink = 'Pink' ,
50+ }
51+ const measurementKeys = Object . values ( Measurement ) ;
52+ const measurementsRecords : Record < Measurement , Dataset > = {
53+ [ Measurement . Red ] : {
54+ unit : '°C' ,
4855 points : generateDataPoints ( ) ,
4956 decimals : 0 ,
5057 color : '#e66' ,
51- measurementName : ' Red' ,
58+ measurementName : Measurement . Red ,
5259 } ,
53- {
54- unit : 'cm ' ,
60+ [ Measurement . Blue ] : {
61+ unit : 'l ' ,
5562 points : generateDataPoints ( {
5663 startingValue : 160 ,
5764 minimum : 50 ,
5865 radomFactor : 6 ,
5966 } ) ,
6067 decimals : 0 ,
6168 color : '#66e' ,
62- measurementName : ' Blue' ,
69+ measurementName : Measurement . Blue ,
6370 } ,
64- {
71+ [ Measurement . Green ] : {
6572 unit : 'kg' ,
6673 points : generateDataPoints ( ) ,
6774 decimals : 0 ,
6875 color : '#6e6' ,
69- measurementName : 'Green' ,
76+ measurementName : Measurement . Green ,
77+ } ,
78+ [ Measurement . Pink ] : {
79+ unit : 'm/s' ,
80+ points : generateDataPoints ( {
81+ startingValue : 20 ,
82+ minimum : 100 ,
83+ } ) ,
84+ decimals : 1 ,
85+ color : '#e0e' ,
86+ measurementName : Measurement . Pink ,
7087 } ,
71- ] ;
88+ } ;
7289
7390export default function App ( ) {
7491 const [ width , setWidth ] = useState < number > ( 0 ) ;
75- const height = width * 0.8 ;
92+ const height = width * 1.1 ;
7693 const [ timeDomainType , setTimeDomainType ] = useState < TimeDomainType > ( 'hour' ) ;
7794 const timeDomain = useMemo ( ( ) => {
7895 const now = new Date ( ) . valueOf ( ) ;
@@ -95,6 +112,15 @@ export default function App() {
95112 return { start, end, type : timeDomainType } ;
96113 } , [ timeDomainType ] ) ;
97114
115+ const [ enabledMeasurements , setEnabledMeasurements ] = useState < Measurement [ ] > (
116+ [ Measurement . Red ]
117+ ) ;
118+
119+ const datasets = useMemo < Dataset [ ] > (
120+ ( ) => enabledMeasurements . map ( ( m ) => measurementsRecords [ m ] ) ,
121+ [ enabledMeasurements ]
122+ ) ;
123+
98124 return (
99125 < View
100126 style = { styles . holder }
@@ -125,6 +151,42 @@ export default function App() {
125151 </ TouchableOpacity >
126152 ) ) }
127153 </ View >
154+ { /* Measurement toggles */ }
155+ { measurementKeys . map ( ( measurement ) => (
156+ < View
157+ key = { measurement }
158+ style = { {
159+ flexDirection : 'row' ,
160+ alignItems : 'center' ,
161+ marginVertical : 10 ,
162+ } }
163+ >
164+ < Switch
165+ value = { enabledMeasurements . includes ( measurement ) }
166+ onValueChange = { ( ) =>
167+ setEnabledMeasurements ( ( prev ) => {
168+ if ( ! prev . includes ( measurement ) )
169+ // enable
170+ return prev . concat ( measurement ) ;
171+
172+ if ( prev . length !== 1 )
173+ // disable
174+ return prev . filter ( ( m ) => m !== measurement ) ;
175+
176+ // only one measurement was enabled, switch to next one
177+ const currentIndex = measurementKeys . findIndex (
178+ ( m ) => m === measurement
179+ ) ;
180+ const nextIndex = ( currentIndex + 1 ) % measurementKeys . length ;
181+ const nextMeasurement = measurementKeys [ nextIndex ] ! ;
182+
183+ return [ nextMeasurement ] ;
184+ } )
185+ }
186+ />
187+ < Text style = { { marginLeft : 10 } } > { measurement } </ Text >
188+ </ View >
189+ ) ) }
128190 </ View >
129191 ) ;
130192}
@@ -139,6 +201,7 @@ const styles = StyleSheet.create({
139201 } ,
140202 holder : {
141203 width : '100%' ,
204+ flex : 1 ,
142205 borderRadius : 10 ,
143206 paddingVertical : PADDING ,
144207 backgroundColor : '#fff' ,
0 commit comments