From ac12f0129799b55955b9ec0b25ad605eb35397c8 Mon Sep 17 00:00:00 2001 From: Evan Y Date: Wed, 7 Aug 2024 12:57:02 -0400 Subject: [PATCH 1/2] feat: introduce multiline chart Key Highlights: - Major API refactor to support multiline charts --- example/app/_layout.tsx | 1 + example/app/index.tsx | 3 + example/app/multi_line_chart.tsx | 99 +++++++++ example/assets/circle-pic.png | Bin 61187 -> 0 bytes example/assets/planets.jpeg | Bin 77734 -> 0 bytes example/assets/twitter-verified.svg | 6 - example/ios/Podfile.lock | 6 + example/package.json | 1 + example/yarn.lock | 5 + .../LineChart/InteractiveLineChart.tsx | 9 +- .../InteractiveMultiLineChart.tsx | 101 ++++++++++ src/components/MultiLineChart/Line.tsx | 38 ++++ .../MultiLineChart/MultiLineChart.tsx | 40 ++++ .../MultiLineChart/StaticMultiLineChart.tsx | 93 +++++++++ src/components/MultiLineChart/context.tsx | 48 +++++ src/components/MultiLineChart/helpers.ts | 32 +++ src/components/MultiLineChart/types.ts | 4 + src/components/MultiLineChart/useGestures.tsx | 124 ++++++++++++ src/components/index.ts | 2 + src/index.ts | 3 + src/types.ts | 0 src/utils/math.ts | 188 ++++++++++++++++++ 22 files changed, 790 insertions(+), 13 deletions(-) create mode 100644 example/app/multi_line_chart.tsx delete mode 100644 example/assets/circle-pic.png delete mode 100644 example/assets/planets.jpeg delete mode 100644 example/assets/twitter-verified.svg create mode 100644 src/components/MultiLineChart/InteractiveMultiLineChart.tsx create mode 100644 src/components/MultiLineChart/Line.tsx create mode 100644 src/components/MultiLineChart/MultiLineChart.tsx create mode 100644 src/components/MultiLineChart/StaticMultiLineChart.tsx create mode 100644 src/components/MultiLineChart/context.tsx create mode 100644 src/components/MultiLineChart/helpers.ts create mode 100644 src/components/MultiLineChart/types.ts create mode 100644 src/components/MultiLineChart/useGestures.tsx create mode 100644 src/types.ts create mode 100644 src/utils/math.ts diff --git a/example/app/_layout.tsx b/example/app/_layout.tsx index 1da27fa..9d872c8 100644 --- a/example/app/_layout.tsx +++ b/example/app/_layout.tsx @@ -10,6 +10,7 @@ export default () => ( + ); diff --git a/example/app/index.tsx b/example/app/index.tsx index 6fc80e8..5b7851c 100644 --- a/example/app/index.tsx +++ b/example/app/index.tsx @@ -16,6 +16,9 @@ export default () => { navigate("/static_chart")}> Go to static chart + navigate("/multi_line_chart")}> + Go to multi line chart + ); }; diff --git a/example/app/multi_line_chart.tsx b/example/app/multi_line_chart.tsx new file mode 100644 index 0000000..4236697 --- /dev/null +++ b/example/app/multi_line_chart.tsx @@ -0,0 +1,99 @@ +import { Line, MultiLineChart } from "@codeherence/react-native-graph"; +import { Circle, Group } from "@shopify/react-native-skia"; +import * as Haptics from "expo-haptics"; +import { ScrollView, StyleSheet } from "react-native"; +import { runOnJS, useDerivedValue, useSharedValue, withTiming } from "react-native-reanimated"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; + +import { priceMap } from "../src/store/prices"; + +const gestureStartImpact = () => { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); +}; + +export default () => { + const cursorShown = useSharedValue(false); + const x = useSharedValue(0); + const y = useSharedValue(0); + const { bottom, left, right } = useSafeAreaInsets(); + + const opacity = useDerivedValue(() => { + // return cursorShown.value ? 1 : 0; + // Use a timing function to animate the opacity + return withTiming(cursorShown.value ? 1 : 0, { duration: 200 }); + }); + + return ( + + + // + // + // + // + // } + onPanGestureBegin={(payload) => { + "worklet"; + cursorShown.value = true; + x.value = payload.event.x; + y.value = payload.event.y; + runOnJS(gestureStartImpact)(); + }} + onPanGestureEnd={() => { + "worklet"; + cursorShown.value = false; + }} + onPanGestureChange={(payload) => { + "worklet"; + x.value = payload.event.x; + y.value = payload.event.y; + }} + > + {(args) => ( + <> + + + + + + )} + + + ); +}; + +const styles = StyleSheet.create({ + container: { flex: 1 }, + contentContainer: { flexGrow: 1 }, + chart: { flex: 1, maxHeight: 200 }, + price: { fontSize: 32 }, + buttonContainer: { + flexDirection: "row", + justifyContent: "center", + paddingVertical: 12, + }, + toggleBtn: { + padding: 12, + backgroundColor: "blue", + borderRadius: 12, + }, + buttonText: { + color: "white", + fontSize: 16, + }, +}); diff --git a/example/assets/circle-pic.png b/example/assets/circle-pic.png deleted file mode 100644 index c49171f8f5c72066a66e8335748855de88962460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61187 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 IM6N<$g4rxUw*UYD diff --git a/example/assets/planets.jpeg b/example/assets/planets.jpeg deleted file mode 100644 index 9c0fb5c1751b240866de91f1940fb2897a93123e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77734 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 XcMj?Q{rCRw+y79g|9KDLKW6_A^D{V} diff --git a/example/assets/twitter-verified.svg b/example/assets/twitter-verified.svg deleted file mode 100644 index 79319da..0000000 --- a/example/assets/twitter-verified.svg +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index c99ed61..79578ff 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -83,6 +83,8 @@ PODS: - ExpoModulesCore - ExpoFileSystem (16.0.7): - ExpoModulesCore + - ExpoHaptics (12.8.1): + - ExpoModulesCore - ExpoHead (3.4.8): - ExpoModulesCore - ExpoImage (1.10.6): @@ -1231,6 +1233,7 @@ DEPENDENCIES: - ExpoBlur (from `../node_modules/expo-blur/ios`) - ExpoCrypto (from `../node_modules/expo-crypto/ios`) - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) + - ExpoHaptics (from `../node_modules/expo-haptics/ios`) - ExpoHead (from `../node_modules/expo-router/ios`) - ExpoImage (from `../node_modules/expo-image/ios`) - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) @@ -1336,6 +1339,8 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-crypto/ios" ExpoFileSystem: :path: "../node_modules/expo-file-system/ios" + ExpoHaptics: + :path: "../node_modules/expo-haptics/ios" ExpoHead: :path: "../node_modules/expo-router/ios" ExpoImage: @@ -1469,6 +1474,7 @@ SPEC CHECKSUMS: ExpoBlur: e832d874bd94afc0645daddbd3162ec1ce172080 ExpoCrypto: b6428f48599c007676dc81a9b5f72c07e62fdccc ExpoFileSystem: c7488590959bf85ebc114909eb8186cbd62e3a25 + ExpoHaptics: 28a771b630353cd6e8dcf1b1e3e693e38ad7c3c3 ExpoHead: 8224345e80abcf4c97b31c99805dd5a3c8d3404d ExpoImage: 8cf2d51de3d03b7e984e9b0ba8f19c0c22057001 ExpoKeepAwake: 0f5cad99603a3268e50af9a6eb8b76d0d9ac956c diff --git a/example/package.json b/example/package.json index b8fe0c5..abd8a6b 100644 --- a/example/package.json +++ b/example/package.json @@ -17,6 +17,7 @@ "expo-constants": "~15.4.5", "expo-crypto": "~12.8.1", "expo-dev-client": "~3.3.9", + "expo-haptics": "~12.8.1", "expo-image": "~1.10.6", "expo-linking": "~6.2.2", "expo-router": "~3.4.8", diff --git a/example/yarn.lock b/example/yarn.lock index b020305..3a98a89 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -5189,6 +5189,11 @@ expo-font@~11.10.3: dependencies: fontfaceobserver "^2.1.0" +expo-haptics@~12.8.1: + version "12.8.1" + resolved "https://registry.yarnpkg.com/expo-haptics/-/expo-haptics-12.8.1.tgz#42b996763be33d661bd33bbc3b3958c3f2734b9d" + integrity sha512-ntLsHkfle8K8w9MW8pZEw92ZN3sguaGUSSIxv30fPKNeQFu7Cq/h47Qv3tONv2MO3wU48N9FbKnant6XlfptpA== + expo-image@~1.10.6: version "1.10.6" resolved "https://registry.yarnpkg.com/expo-image/-/expo-image-1.10.6.tgz#b0e54d31d97742505296c076a5f18d094ba9a8cc" diff --git a/src/components/LineChart/InteractiveLineChart.tsx b/src/components/LineChart/InteractiveLineChart.tsx index 94118a7..b0211c9 100644 --- a/src/components/LineChart/InteractiveLineChart.tsx +++ b/src/components/LineChart/InteractiveLineChart.tsx @@ -9,7 +9,6 @@ import { Cursor } from "./Cursor"; import { LineChartProps } from "./LineChart"; import { computePath, computeGraphData } from "./computations"; import { useGestures } from "./useGestures"; -import { batchedUpdates } from "../../libs/batchedUpdates"; export const InteractiveLineChart: React.FC> = ({ points = [], @@ -33,8 +32,7 @@ export const InteractiveLineChart: React.FC> = ({ onHoverGestureEnd = null, ...viewProps }) => { - const [width, setWidth] = useState(0); - const [height, setHeight] = useState(0); + const [{ width, height }, setSize] = useState({ width: 0, height: 0 }); // Initially -cursorRadius so that the cursor is hidden const x = useSharedValue(-cursorRadius); @@ -67,10 +65,7 @@ export const InteractiveLineChart: React.FC> = ({ const onLayout = useCallback((e: LayoutChangeEvent) => { // Batch the updates to avoid unnecessary re-renders - batchedUpdates(() => { - setWidth(e.nativeEvent.layout.width); - setHeight(e.nativeEvent.layout.height); - }); + setSize(e.nativeEvent.layout); }, []); return ( diff --git a/src/components/MultiLineChart/InteractiveMultiLineChart.tsx b/src/components/MultiLineChart/InteractiveMultiLineChart.tsx new file mode 100644 index 0000000..22f3ce2 --- /dev/null +++ b/src/components/MultiLineChart/InteractiveMultiLineChart.tsx @@ -0,0 +1,101 @@ +import { Canvas } from "@shopify/react-native-skia"; +import React, { useCallback, useState } from "react"; +import { LayoutChangeEvent, StyleSheet, View } from "react-native"; +import { GestureDetector } from "react-native-gesture-handler"; + +import type { MultiLineChartProps } from "./MultiLineChart"; +import { useMultiLineChartContext } from "./context"; +import { UseGestureProps, useGestures } from "./useGestures"; +import { batchedUpdates } from "../../libs/batchedUpdates"; + +export interface InteractiveLineChartProps> { + gestureLongPressDelay?: number; + /** + * Extra elements to render on the canvas. This prop is separated from the children prop to allow + * for clear separation between line chart elements and extra elements. + */ + ExtraCanvasElements?: JSX.Element; + onPanGestureBegin?: UseGestureProps["onPanGestureBegin"]; + onPanGestureChange?: UseGestureProps["onPanGestureChange"]; + onPanGestureEnd?: UseGestureProps["onPanGestureEnd"]; +} + +export const InteractiveMultiLineChart = >({ + points, + children, + gestureLongPressDelay = 200, + ExtraCanvasElements, + onCanvasResize, + onPanGestureBegin, + onPanGestureChange, + onPanGestureEnd, + ...viewProps +}: MultiLineChartProps) => { + const [layoutComputed, setLayoutComputed] = useState(false); + const { height, width, setCanvasSize } = useMultiLineChartContext(); + + const gestures = useGestures({ + points, + height, + precision: 2, + gestureLongPressDelay, + onPanGestureBegin, + onPanGestureChange, + onPanGestureEnd, + }); + + const onLayout = useCallback((e: LayoutChangeEvent) => { + // Batch the updates to avoid unnecessary re-renders + batchedUpdates(() => { + setLayoutComputed(true); + onCanvasResize?.(e.nativeEvent.layout.width, e.nativeEvent.layout.height); + setCanvasSize(e.nativeEvent.layout); + }); + }, []); + + return ( + + + + + {!layoutComputed + ? null + : // Since the children need to be invoked, we invoke the children then inject the width and height manually. + (() => { + const invokedChildren = children({ height, width, points }); + if (!React.isValidElement(invokedChildren)) return null; + + if (invokedChildren.type === React.Fragment) { + // If the child is a fragment, iteratively clone all children + return React.Children.map(invokedChildren.props.children, (c) => { + if (!React.isValidElement(c)) return null; + return React.cloneElement(c, { + // @ts-ignore + ...c.props, + width, + height, + }); + }); + } + + return React.cloneElement(invokedChildren, { + ...invokedChildren.props, + width, + height, + }); + })()} + + {ExtraCanvasElements} + + + + + ); +}; +InteractiveMultiLineChart.displayName = "StaticMultiLineChart"; + +const styles = StyleSheet.create({ + root: { position: "relative", overflow: "hidden" }, + container: { flex: 1 }, + canvas: { flex: 1 }, +}); diff --git a/src/components/MultiLineChart/Line.tsx b/src/components/MultiLineChart/Line.tsx new file mode 100644 index 0000000..035760f --- /dev/null +++ b/src/components/MultiLineChart/Line.tsx @@ -0,0 +1,38 @@ +import { Path, PathProps } from "@shopify/react-native-skia"; +import { useMemo } from "react"; + +import { computeGraphData, computePath, ComputePathProps } from "../../utils/math"; + +interface LineProps extends Pick { + /** An array of tuples representing [time, value] pairs. */ + points?: [number, number][]; + /** + * The width of the canvas. This value is not modifiable and will be injected by the parent component. + */ + width?: number; + /** + * The height of the canvas. This value is not modifiable and will be injected by the parent component. + */ + height?: number; + strokeWidth?: number; + curveType?: ComputePathProps["curveType"]; +} + +export const Line: React.FC = ({ + points = [], + width = 0, + height = 0, + strokeWidth = 2, + curveType = "linear", + ...pathProps +}) => { + const data = useMemo(() => { + return computeGraphData(points); + }, [points]); + + const path = useMemo(() => { + return computePath({ ...data, width, height, cursorRadius: 0, curveType }); + }, [data, width, height, curveType]); + + return ; +}; diff --git a/src/components/MultiLineChart/MultiLineChart.tsx b/src/components/MultiLineChart/MultiLineChart.tsx new file mode 100644 index 0000000..189f449 --- /dev/null +++ b/src/components/MultiLineChart/MultiLineChart.tsx @@ -0,0 +1,40 @@ +import React from "react"; +import type { ViewProps } from "react-native"; + +import { InteractiveLineChartProps, InteractiveMultiLineChart } from "./InteractiveMultiLineChart"; +import { StaticMultiLineChart } from "./StaticMultiLineChart"; +import { MultiLineChartProvider } from "./context"; + +export type MultiLineChartProps< + Data extends Record, + Static extends boolean = false, +> = React.PropsWithChildren< + { + points: Data; + onCanvasResize?: (width: number, height: number) => void; + } & Exclude & { + children: (args: { points: Data; height: number; width: number }) => React.ReactNode; + } & (Static extends true + ? { isStatic: true } + : { isStatic: false } & InteractiveLineChartProps) +>; + +export const MultiLineChart = < + Data extends Record, + Static extends boolean = false, +>({ + isStatic = false, + ...props +}: MultiLineChartProps) => { + return ( + + {/* */} + {isStatic ? ( + + ) : ( + + )} + + ); +}; +MultiLineChart.displayName = "MultiLineChart"; diff --git a/src/components/MultiLineChart/StaticMultiLineChart.tsx b/src/components/MultiLineChart/StaticMultiLineChart.tsx new file mode 100644 index 0000000..bbe86cc --- /dev/null +++ b/src/components/MultiLineChart/StaticMultiLineChart.tsx @@ -0,0 +1,93 @@ +import { Canvas } from "@shopify/react-native-skia"; +import React, { useCallback, useState } from "react"; +import { LayoutChangeEvent, StyleSheet, View } from "react-native"; + +import type { MultiLineChartProps } from "./MultiLineChart"; +import { useMultiLineChartContext } from "./context"; +import { batchedUpdates } from "../../libs/batchedUpdates"; + +export const StaticMultiLineChart = >({ + points, + children, + onCanvasResize, + ...viewProps +}: MultiLineChartProps) => { + const [layoutComputed, setLayoutComputed] = useState(false); + const { height, width, setCanvasSize } = useMultiLineChartContext(); + + const onLayout = useCallback((e: LayoutChangeEvent) => { + // Batch the updates to avoid unnecessary re-renders + batchedUpdates(() => { + setLayoutComputed(true); + onCanvasResize?.(e.nativeEvent.layout.width, e.nativeEvent.layout.height); + setCanvasSize(e.nativeEvent.layout); + }); + }, []); + + return ( + + + + {!layoutComputed + ? null + : // Since the children need to be invoked, we invoke the children then inject the width and height manually. + (() => { + const invokedChildren = children({ height, width, points }); + if (!React.isValidElement(invokedChildren)) return null; + + if (invokedChildren.type === React.Fragment) { + // If the child is a fragment, iteratively clone all children + return React.Children.map(invokedChildren.props.children, (c) => { + if (!React.isValidElement(c)) return null; + return React.cloneElement(c, { + // @ts-ignore + ...c.props, + width, + height, + }); + }); + } + + return React.cloneElement(invokedChildren, { + ...invokedChildren.props, + width, + height, + }); + })()} + + + + ); +}; +StaticMultiLineChart.displayName = "StaticMultiLineChart"; + +const styles = StyleSheet.create({ + root: { position: "relative", overflow: "hidden" }, + container: { flex: 1 }, + canvas: { flex: 1 }, +}); + +// : React.Children.map(children, (child) => { +// if (!React.isValidElement(child)) return null; +// if (child.type === React.Fragment) { +// // If the child is a fragment, iteratively clone all children +// return React.Children.map(child.props.children, (c) => { +// if (!React.isValidElement(c)) return null; +// return React.cloneElement(c, { +// // @ts-ignore +// ...c.props, +// width, +// height, +// // @ts-ignore +// points: points[c.props.dataKey] ?? [], +// }); +// }); +// } + +// return React.cloneElement(child, { +// ...child.props, +// width, +// height, +// points: points[child.props.dataKey] ?? [], +// }); +// }) diff --git a/src/components/MultiLineChart/context.tsx b/src/components/MultiLineChart/context.tsx new file mode 100644 index 0000000..937aa46 --- /dev/null +++ b/src/components/MultiLineChart/context.tsx @@ -0,0 +1,48 @@ +import { createContext, useContext, useState } from "react"; +import { LayoutRectangle } from "react-native"; + +interface MultiLineChartContextState { + width: number; + height: number; + setCanvasSize: React.Dispatch>; +} + +export const MultiLineChartContext = createContext( + undefined +); + +interface MultiLineChartProviderProps { + width?: number; + height?: number; +} + +export const MultiLineChartProvider: React.FC< + React.PropsWithChildren +> = ({ children }) => { + const [canvasSize, setCanvasSize] = useState({ + height: 0, + width: 0, + x: 0, + y: 0, + }); + + return ( + + {children} + + ); +}; + +export const useMultiLineChartContext = () => { + const context = useContext(MultiLineChartContext); + if (!context) { + throw new Error("useMultiLineChartContext must be used within a MultiLineChartProvider"); + } + return context; +}; diff --git a/src/components/MultiLineChart/helpers.ts b/src/components/MultiLineChart/helpers.ts new file mode 100644 index 0000000..dc17e5b --- /dev/null +++ b/src/components/MultiLineChart/helpers.ts @@ -0,0 +1,32 @@ +import React from "react"; + +import { Line } from "./Line"; + +const isAllowedChild = (child: React.ReactElement): boolean => { + // Check if child is a fragment. If so, recursively check all children + if (child.type === React.Fragment) { + return React.Children.toArray(child.props.children).every( + (c) => React.isValidElement(c) && isAllowedChild(c) + ); + } + return [Line].some((allowedChild) => child.type === allowedChild); +}; + +/** + * Throws an error if the children of the line chart component are not valid. + * @param children The children of the line chart component. + */ +export const validateLineChartChildren = (children?: React.ReactNode | undefined) => { + // Only perform this validation if the environment is development + if (process.env.NODE_ENV !== "development") return; + + const validChildren = React.Children.toArray(children).every((child) => { + return ( + typeof child !== "string" && + (child === React.Fragment || (React.isValidElement(child) && isAllowedChild(child))) + ); + }); + if (!validChildren) { + throw new Error("MultiLineChart only accepts Line components as children."); + } +}; diff --git a/src/components/MultiLineChart/types.ts b/src/components/MultiLineChart/types.ts new file mode 100644 index 0000000..5ff8e9c --- /dev/null +++ b/src/components/MultiLineChart/types.ts @@ -0,0 +1,4 @@ +export interface BaseCanvasComponentProps { + width: number; + height: number; +} diff --git a/src/components/MultiLineChart/useGestures.tsx b/src/components/MultiLineChart/useGestures.tsx new file mode 100644 index 0000000..d201c3c --- /dev/null +++ b/src/components/MultiLineChart/useGestures.tsx @@ -0,0 +1,124 @@ +import { SkPath } from "@shopify/react-native-skia"; +import { useEffect, useMemo } from "react"; +import { + Gesture, + type PanGestureHandlerEventPayload as ReanimatedPanGestureHandlerEventPayload, + type PanGestureChangeEventPayload, +} from "react-native-gesture-handler"; +import { interpolate, useSharedValue } from "react-native-reanimated"; + +import { useMultiLineChartContext } from "./context"; +import { computeGraphData, computePath, getYForX } from "../../utils/math"; + +export type PanGestureHandlerEventPayload = ReanimatedPanGestureHandlerEventPayload; +export type PanGestureHandlerOnBeginEventPayload> = + { + points: Record; + event: PanGestureHandlerEventPayload; + }; +export type PanGestureHandlerOnChangeEventPayload> = + { + points: Record; + event: PanGestureHandlerEventPayload & PanGestureChangeEventPayload; + }; + +// Extract Hover Gesture onBegin args since it isn't exported by rngh +export type HoverGestureOnBegin = ReturnType["onBegin"]; +export type HoverGestureOnBeginCallBack = Parameters[0]; +export type HoverGestureHandlerOnBeginEventPayload = { + point: number; + event: Parameters[0]; +}; + +export type UseGestureProps> = { + /** The path of the chart. */ + points: Data; + /** The height of the chart. */ + height: number; + /** The precision of the y value. */ + precision: number; + curveType?: "linear"; + gestureLongPressDelay?: number; + onPanGestureBegin?: ((payload: PanGestureHandlerOnBeginEventPayload) => void) | null; + onPanGestureChange?: ((payload: PanGestureHandlerOnChangeEventPayload) => void) | null; + onPanGestureEnd?: ((payload: PanGestureHandlerEventPayload) => void) | null; +}; + +/** + * Returns the gesture handlers for the LineChart component. + * @param param0 - The props to allow the gesture handlers to interact with the + * LineChart component. + * @returns The gesture handlers for the LineChart component. + */ +export const useGestures = >({ + points, + height, + precision, + curveType = "linear", + gestureLongPressDelay = 100, + onPanGestureBegin, + onPanGestureChange, + onPanGestureEnd, +}: UseGestureProps) => { + const { width } = useMultiLineChartContext(); + + const graphData = useMemo(() => { + return Object.entries(points).reduce( + (acc, [key, value]) => { + return { ...acc, [key]: computeGraphData(value) }; + }, + {} as Record> + ); + }, [points]); + + const pathsJS = useMemo(() => { + const results = {} as Record; + + const pathKeys = Object.keys(graphData) as (keyof Data)[]; + for (const key of pathKeys) { + const value = graphData[key]; + results[key] = computePath({ ...value, height, width, curveType }); + } + + return results; + }, [graphData, height, width, curveType]); + + const paths = useSharedValue>(pathsJS); + useEffect(() => { + paths.value = pathsJS; + }, [pathsJS]); + + const panGesture = Gesture.Pan() + .activateAfterLongPress(gestureLongPressDelay) + .onStart((event) => { + const pathKeys = Object.keys(paths.value) as (keyof Data)[]; + const yValues = {} as Record; + for (const key of pathKeys) { + const path = paths.value[key]!; + const rawYValue = getYForX({ path, x: event.x, precision }); + const { minValue, maxValue } = graphData[key]; + const yValue = interpolate(rawYValue, [0, height], [maxValue, minValue]); + yValues[key] = yValue; + } + + if (onPanGestureBegin) onPanGestureBegin({ event, points: yValues }); + }) + .onChange((event) => { + const pathKeys = Object.keys(paths.value) as (keyof Data)[]; + const yValues = {} as Record; + for (const key of pathKeys) { + const path = paths.value[key]!; + const rawYValue = getYForX({ path, x: event.x, precision }); + const { minValue, maxValue } = graphData[key]; + const yValue = interpolate(rawYValue, [0, height], [maxValue, minValue]); + yValues[key] = yValue; + } + + if (onPanGestureChange) onPanGestureChange({ event, points: yValues }); + }) + .onEnd((event) => { + if (onPanGestureEnd) onPanGestureEnd(event); + }); + + return panGesture; +}; diff --git a/src/components/index.ts b/src/components/index.ts index 195cbf7..a6413cc 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -4,6 +4,8 @@ export { type InteractiveLineChartProps, type PathFillProps, } from "./LineChart/LineChart"; +export { MultiLineChart, type MultiLineChartProps } from "./MultiLineChart/MultiLineChart"; +export { Line } from "./MultiLineChart/Line"; export type { AxisLabelProps } from "./LineChart/AxisLabel"; export type { PanGestureHandlerOnBeginEventPayload, diff --git a/src/index.ts b/src/index.ts index 1ef527d..eb08343 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,9 @@ export { LineChart, + Line, + MultiLineChart, type LineChartProps, + type MultiLineChartProps, type AxisLabelProps, type PanGestureHandlerOnBeginEventPayload, type PanGestureHandlerOnChangeEventPayload, diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/math.ts b/src/utils/math.ts new file mode 100644 index 0000000..d13d2c1 --- /dev/null +++ b/src/utils/math.ts @@ -0,0 +1,188 @@ +import type { Vector, SkPath } from "@shopify/react-native-skia"; +import { PathVerb, Skia, vec } from "@shopify/react-native-skia"; +import { scaleSqrt, scaleTime } from "d3"; +import { CurveFactory, curveLinear, line } from "d3-shape"; + +interface RoundProps { + value: number; + precision?: number; +} + +const round = ({ value, precision = 0 }: RoundProps): number => { + "worklet"; + const p = Math.pow(10, precision); + return Math.round(value * p) / p; +}; + +interface LinearYForXProps { + path: SkPath; + x: number; + precision?: number; +} + +const linearYForX = ({ path, x, precision = 2 }: LinearYForXProps): number => { + "worklet"; + const cmds = path.toCmds(); + let from: Vector = vec(0, 0); + let found = false; + let yValue = 0; + + for (let i = 0; i < cmds.length; i++) { + const cmd = cmds[i]; + if (cmd == null) break; + if (cmd[0] === PathVerb.Move) { + // If the path starts with a move command, set the from point + from = vec(cmd[1], cmd[2]); + } else if (cmd[0] === PathVerb.Line) { + // If the path contains a line command, check if the x value is within the bounds of the line + const to = vec(cmd[1], cmd[2]); + if ((x >= from.x && x <= to.x) || (x <= from.x && x >= to.x)) { + const t = (x - from.x) / (to.x - from.x); + yValue = from.y + t * (to.y - from.y); + found = true; + break; + } + from = to; + } + } + + return found ? round({ value: yValue, precision }) : 0; +}; + +export interface GetYForXProps { + path: SkPath; + x: number; + precision?: number; +} + +export const getYForX = ({ path, x, precision = 2 }: GetYForXProps): number => { + "worklet"; + return linearYForX({ path, x, precision }); +}; + +export interface ComputePathProps { + width: number; + height: number; + points: [number, number][]; + cursorRadius?: number; + minValue: number; + maxValue: number; + minTimestamp: number; + maxTimestamp: number; + curveType: "linear"; +} + +export const computePath = ({ + width, + height, + points, + cursorRadius = 0, + minTimestamp, + maxTimestamp, + minValue, + maxValue, + curveType, +}: ComputePathProps): SkPath => { + "worklet"; + + const straightLine = Skia.Path.Make() + .moveTo(0, height / 2) + .lineTo(width, height / 2); + + // If the dates array is empty, return a Path as a horizontal straight line + // in the center of the chart + if (points.length === 0) return straightLine; + + const scaleX = scaleTime().domain([minTimestamp, maxTimestamp]).range([0, width]); + const scaleY = scaleSqrt() + .domain([minValue, maxValue]) + .range([height - cursorRadius, cursorRadius]); + const curve: CurveFactory = curveType === "linear" ? curveLinear : curveLinear; + const rawPath = line() + .x(([x]) => scaleX(x)) + .y(([, y]) => scaleY(y)) + .curve(curve)(points); + + if (rawPath === null) return straightLine; + return Skia.Path.MakeFromSVGString(rawPath) ?? straightLine; +}; + +interface GetMinValueProps { + points: [number, number][]; +} + +/** + * Get the index and value of the minimum value in the points array + * @returns The index and value of the minimum value in the points array + */ +const getMinValue = ({ points }: GetMinValueProps): [number, number] => { + if (points.length === 0) return [0, 0]; + + return points.reduce<[number, number]>( + (acc, [_, value], index) => { + if (value < acc[1]) return [index, value]; + return acc; + }, + [0, Number.MAX_SAFE_INTEGER] + ); +}; + +interface GetMaxValueProps { + points: [number, number][]; +} + +/** + * Get the index and value of the maximum value in the points array + * @returns The index and value of the maximum value in the points array + */ +const getMaxValue = ({ points }: GetMaxValueProps): [number, number] => { + if (points.length === 0) return [0, 0]; + + return points.reduce<[number, number]>( + (acc, [_, value], index) => { + if (value > acc[1]) return [index, value]; + return acc; + }, + [0, Number.MIN_SAFE_INTEGER] + ); +}; + +export const computeGraphData = (points: [number, number][]) => { + "worklet"; + + if (points.length === 0) { + return { + points: [], + minTimestamp: 0, + maxTimestamp: 0, + minValue: 0, + minValueIndex: 0, + minValueXProportion: 0, + maxValue: 0, + maxValueIndex: 0, + maxValueXProportion: 0, + }; + } + + const timestamps = points.map(([timestamp]) => timestamp); + const minTimestamp = Math.min(...timestamps); + const maxTimestamp = Math.max(...timestamps); + const [minValueIndex, minValue] = getMinValue({ points }); + const [maxValueIndex, maxValue] = getMaxValue({ points }); + + // We subtract 1 since the index is 0-based + const minValueXProportion = minValueIndex / (points.length - 1); + const maxValueXProportion = maxValueIndex / (points.length - 1); + + return { + points, + minTimestamp, + maxTimestamp, + minValue, + minValueIndex, + minValueXProportion, + maxValue, + maxValueIndex, + maxValueXProportion, + }; +}; From f117a063b9165947538fc5a7280d3be4758438f3 Mon Sep 17 00:00:00 2001 From: Evan Y Date: Thu, 8 Aug 2024 17:33:17 -0400 Subject: [PATCH 2/2] chore: release 0.3.0 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 259d447..a099ab9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## [0.3.0](https://github.com/codeherence/react-native-graph/compare/v0.2.0...v0.3.0) (2024-08-08) + + +### Features + +* introduce multiline chart ([ac12f01](https://github.com/codeherence/react-native-graph/commit/ac12f0129799b55955b9ec0b25ad605eb35397c8)) + ## [0.2.0](https://github.com/codeherence/react-native-graph/compare/v0.1.1-rc.2...v0.2.0) (2024-05-12) diff --git a/package.json b/package.json index fc714fb..869d03f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@codeherence/react-native-graph", - "version": "0.2.0", + "version": "0.3.0", "description": "A graphing library for React Native built with Shopify's react-native-skia.", "main": "lib/commonjs/index", "module": "lib/module/index",