1- import React , { useCallback , useState } from 'react'
1+ import React , { useCallback , useMemo , useState } from 'react'
22import { View , StyleSheet , Text , Button } from 'react-native'
33import { LineGraph } from 'react-native-graph'
44import StaticSafeAreaInsets from 'react-native-static-safe-area-insets'
5+ import type { GraphRange } from '../../../src/LineGraphProps'
56import { SelectionDot } from '../components/CustomSelectionDot'
67import { Toggle } from '../components/Toggle'
78import {
@@ -19,15 +20,52 @@ export function GraphPage() {
1920 const [ isAnimated , setIsAnimated ] = useState ( true )
2021 const [ enablePanGesture , setEnablePanGesture ] = useState ( true )
2122 const [ enableFadeInEffect , setEnableFadeInEffect ] = useState ( false )
23+ const [ enableCustomSelectionDot , setEnableCustomSelectionDot ] =
24+ useState ( false )
25+ const [ enableRange , setEnableRange ] = useState ( false )
26+ const [ enableIndicator , setEnableIndicator ] = useState ( false )
27+ const [ indicatorPulsating , setIndicatorPulsating ] = useState ( false )
2228
2329 const [ points , setPoints ] = useState ( ( ) => generateRandomGraphData ( POINTS ) )
24- const smallPoints = generateSinusGraphData ( 9 )
30+ const smallPoints = useMemo ( ( ) => generateSinusGraphData ( 9 ) , [ ] )
2531
2632 const refreshData = useCallback ( ( ) => {
2733 setPoints ( generateRandomGraphData ( POINTS ) )
2834 hapticFeedback ( 'impactLight' )
2935 } , [ ] )
3036
37+ const highestDate = useMemo (
38+ ( ) =>
39+ points . length !== 0 && points [ points . length - 1 ] != null
40+ ? points [ points . length - 1 ] ! . date
41+ : undefined ,
42+ [ points ]
43+ )
44+ const range : GraphRange | undefined = useMemo ( ( ) => {
45+ // if range is disabled, default to infinite range (undefined)
46+ if ( ! enableRange ) return undefined
47+
48+ if ( points . length !== 0 && highestDate != null ) {
49+ return {
50+ x : {
51+ min : points [ 0 ] ! . date ,
52+ max : new Date ( highestDate . getTime ( ) + 30 ) ,
53+ } ,
54+ y : {
55+ min : - 200 ,
56+ max : 200 ,
57+ } ,
58+ }
59+ } else {
60+ return {
61+ y : {
62+ min : - 200 ,
63+ max : 200 ,
64+ } ,
65+ }
66+ }
67+ } , [ enableRange , highestDate , points ] )
68+
3169 return (
3270 < View style = { [ styles . container , { backgroundColor : colors . background } ] } >
3371 < View style = { styles . row } >
@@ -52,7 +90,10 @@ export function GraphPage() {
5290 enablePanGesture = { enablePanGesture }
5391 enableFadeInMask = { enableFadeInEffect }
5492 onGestureStart = { ( ) => hapticFeedback ( 'impactLight' ) }
55- SelectionDot = { SelectionDot }
93+ SelectionDot = { enableCustomSelectionDot ? SelectionDot : undefined }
94+ range = { range }
95+ enableIndicator = { enableIndicator }
96+ indicatorPulsating = { indicatorPulsating }
5697 />
5798
5899 < Button title = "Refresh" onPress = { refreshData } />
@@ -73,6 +114,26 @@ export function GraphPage() {
73114 isEnabled = { enableFadeInEffect }
74115 setIsEnabled = { setEnableFadeInEffect }
75116 />
117+ < Toggle
118+ title = "Custom Selection Dot:"
119+ isEnabled = { enableCustomSelectionDot }
120+ setIsEnabled = { setEnableCustomSelectionDot }
121+ />
122+ < Toggle
123+ title = "Enable Range:"
124+ isEnabled = { enableRange }
125+ setIsEnabled = { setEnableRange }
126+ />
127+ < Toggle
128+ title = "Enable Indicator:"
129+ isEnabled = { enableIndicator }
130+ setIsEnabled = { setEnableIndicator }
131+ />
132+ < Toggle
133+ title = "Indicator pulsating:"
134+ isEnabled = { indicatorPulsating }
135+ setIsEnabled = { setIndicatorPulsating }
136+ />
76137 </ View >
77138
78139 < View style = { styles . spacer } />
0 commit comments