1- import { type AxisLabelComponentProps , LineChart } from "@codeherence/react-native-graph" ;
2- import { useCallback , useState } from "react" ;
1+ import {
2+ type AxisLabelComponentProps ,
3+ LineChart ,
4+ type PanGestureHandlerOnChangeEventPayload ,
5+ HoverGestureHandlerOnChangeEventPayload ,
6+ } from "@codeherence/react-native-graph" ;
7+ import { useCallback , useEffect , useState } from "react" ;
38import { Button , StyleSheet , Text , View } from "react-native" ;
9+ import { useAnimatedProps , useSharedValue } from "react-native-reanimated" ;
410import { useSafeAreaInsets } from "react-native-safe-area-context" ;
5- import { LineChartProps } from "src/components/LineChart" ;
11+
12+ import AnimatedText from "../components/AnimatedText" ;
613
714const generateRandomData = ( ) : [ number , number ] [ ] => {
815 return Array . from ( { length : 30 } , ( _ , i ) => [ i , Math . random ( ) * 2000 ] ) ;
916} ;
1017
11- type FilterUndefined < T > = T extends undefined ? never : T ;
12-
13- const onGestureChangeWorklet : FilterUndefined < LineChartProps [ "onPanGestureChange" ] > = ( {
14- point,
15- } ) => {
16- "worklet" ;
17- console . log ( point ) ;
18- } ;
19-
20- const onHoverChangeWorklet : FilterUndefined < LineChartProps [ "onHoverGestureChange" ] > = ( {
21- point,
22- } ) => {
23- "worklet" ;
24- console . log ( point ) ;
25- } ;
26-
2718const formatter = new Intl . NumberFormat ( "en-US" , {
2819 style : "currency" ,
2920 currency : "USD" ,
@@ -33,22 +24,61 @@ const AxisLabel: React.FC<AxisLabelComponentProps> = ({ value }) => (
3324 < Text > { formatter . format ( value ) } </ Text >
3425) ;
3526
27+ const uiFormatter = ( price : number ) => {
28+ "worklet" ;
29+
30+ return new Intl . NumberFormat ( "en-US" , {
31+ style : "currency" ,
32+ currency : "USD" ,
33+ } ) . format ( price ) ;
34+ } ;
35+
3636export default ( ) => {
3737 const { top, bottom } = useSafeAreaInsets ( ) ;
38- const [ data , setData ] = useState < [ number , number ] [ ] > ( generateRandomData ( ) ) ;
38+ const [ data , setData ] = useState < [ number , number ] [ ] > ( [ ] ) ;
39+
40+ const latestPrice = useSharedValue ( "0" ) ;
3941
4042 // Randomize the data
41- const handlePress = useCallback ( ( ) => setData ( generateRandomData ( ) ) , [ ] ) ;
43+ const refreshData = useCallback ( ( ) => {
44+ const newData = generateRandomData ( ) ;
45+ latestPrice . value = formatter . format ( newData [ newData . length - 1 ] ! [ 1 ] ) ;
46+ setData ( newData ) ;
47+ } , [ ] ) ;
48+
49+ useEffect ( refreshData , [ ] ) ;
50+
51+ const onHoverChangeWorklet = useCallback ( ( evt : HoverGestureHandlerOnChangeEventPayload ) => {
52+ "worklet" ;
53+ latestPrice . value = uiFormatter ( evt . point ) ;
54+ } , [ ] ) ;
55+
56+ const onGestureChangeWorklet = useCallback ( ( evt : PanGestureHandlerOnChangeEventPayload ) => {
57+ "worklet" ;
58+ latestPrice . value = uiFormatter ( evt . point ) ;
59+ } , [ ] ) ;
60+
61+ const onEndWorklet = useCallback ( ( ) => {
62+ "worklet" ;
63+ latestPrice . value = uiFormatter ( data [ data . length - 1 ] ! [ 1 ] ) ;
64+ } , [ data ] ) ;
65+
66+ const animatedProps = useAnimatedProps ( ( ) => {
67+ return { text : latestPrice . value } ;
68+ } , [ ] ) ;
4269
4370 return (
4471 < View style = { [ styles . container , { paddingTop : top , paddingBottom : bottom } ] } >
45- < Button title = "Randomize data" onPress = { handlePress } />
72+ < Button title = "Randomize data" onPress = { refreshData } />
73+ < AnimatedText style = { styles . price } animatedProps = { animatedProps } />
4674 < LineChart
4775 points = { data }
4876 style = { styles . chart }
4977 TopAxisLabel = { AxisLabel }
5078 BottomAxisLabel = { AxisLabel }
5179 onPanGestureChange = { onGestureChangeWorklet }
80+ onPanGestureEnd = { onEndWorklet }
81+ onHoverGestureEnd = { onEndWorklet }
5282 onHoverGestureChange = { onHoverChangeWorklet }
5383 />
5484 </ View >
@@ -57,5 +87,6 @@ export default () => {
5787
5888const styles = StyleSheet . create ( {
5989 container : { flex : 1 } ,
60- chart : { flex : 1 , maxHeight : "40%" } ,
90+ chart : { flex : 1 } ,
91+ price : { fontSize : 32 } ,
6192} ) ;
0 commit comments