@@ -5,24 +5,21 @@ import {
55 HoverGestureHandlerOnChangeEventPayload ,
66} from "@codeherence/react-native-graph" ;
77import { LinearGradient , vec } from "@shopify/react-native-skia" ;
8- import { useCallback , useEffect , useState } from "react" ;
9- import { Button , StyleSheet , Text , View } from "react-native" ;
8+ import { useCallback , useMemo } from "react" ;
9+ import { StyleSheet , Text , View , useWindowDimensions } from "react-native" ;
1010import { useAnimatedProps , useSharedValue } from "react-native-reanimated" ;
1111import { useSafeAreaInsets } from "react-native-safe-area-context" ;
1212
1313import AnimatedText from "../components/AnimatedText" ;
14-
15- const generateRandomData = ( ) : [ number , number ] [ ] => {
16- return Array . from ( { length : 30 } , ( _ , i ) => [ i , Math . random ( ) * 2000 ] ) ;
17- } ;
14+ import msft_prices from "../data/msft_prices.json" ;
1815
1916const formatter = new Intl . NumberFormat ( "en-US" , {
2017 style : "currency" ,
2118 currency : "USD" ,
2219} ) ;
2320
2421const AxisLabel : React . FC < AxisLabelComponentProps > = ( { value } ) => (
25- < Text > { formatter . format ( value ) } </ Text >
22+ < Text selectable = { false } > { formatter . format ( value ) } </ Text >
2623) ;
2724
2825const uiFormatter = ( price : number ) => {
@@ -35,20 +32,18 @@ const uiFormatter = (price: number) => {
3532} ;
3633
3734export default ( ) => {
35+ const { width } = useWindowDimensions ( ) ;
3836 const { top, bottom } = useSafeAreaInsets ( ) ;
39- const [ data , setData ] = useState < [ number , number ] [ ] > ( [ ] ) ;
37+ const data : [ number , number ] [ ] = useMemo (
38+ ( ) =>
39+ msft_prices . results
40+ . reverse ( )
41+ . map < [ number , number ] > ( ( r ) => [ new Date ( r . date ) . getTime ( ) , r . close ] ) ,
42+ [ ]
43+ ) ;
4044
4145 const latestPrice = useSharedValue ( "0" ) ;
4246
43- // Randomize the data
44- const refreshData = useCallback ( ( ) => {
45- const newData = generateRandomData ( ) ;
46- latestPrice . value = formatter . format ( newData [ newData . length - 1 ] ! [ 1 ] ) ;
47- setData ( newData ) ;
48- } , [ ] ) ;
49-
50- useEffect ( refreshData , [ ] ) ;
51-
5247 const onHoverChangeWorklet = useCallback ( ( evt : HoverGestureHandlerOnChangeEventPayload ) => {
5348 "worklet" ;
5449 latestPrice . value = uiFormatter ( evt . point ) ;
@@ -70,11 +65,10 @@ export default () => {
7065
7166 return (
7267 < View style = { [ styles . container , { paddingTop : top , paddingBottom : bottom } ] } >
73- < Button title = "Randomize data" onPress = { refreshData } />
7468 < AnimatedText style = { styles . price } animatedProps = { animatedProps } />
7569 < LineChart
7670 points = { data }
77- style = { styles . chart }
71+ style = { [ styles . chart , { width } ] }
7872 TopAxisLabel = { AxisLabel }
7973 BottomAxisLabel = { AxisLabel }
8074 onPanGestureChange = { onGestureChangeWorklet }
@@ -83,7 +77,11 @@ export default () => {
8377 onHoverGestureChange = { onHoverChangeWorklet }
8478 strokeWidth = { 2 }
8579 PathFill = { ( { width } ) => (
86- < LinearGradient start = { vec ( 0 , 0 ) } end = { vec ( width , 0 ) } colors = { [ "blue" , "yellow" ] } />
80+ < LinearGradient
81+ start = { vec ( 0 , 0 ) }
82+ end = { vec ( width , 0 ) }
83+ colors = { [ "blue" , "red" , "purple" ] }
84+ />
8785 ) }
8886 />
8987 </ View >
@@ -92,6 +90,6 @@ export default () => {
9290
9391const styles = StyleSheet . create ( {
9492 container : { flex : 1 } ,
95- chart : { flex : 1 } ,
93+ chart : { flex : 1 , maxHeight : 400 } ,
9694 price : { fontSize : 32 } ,
9795} ) ;
0 commit comments