import * as React from "react"; import { makeMutable, runOnJS, type SharedValue, useAnimatedReaction, } from "react-native-reanimated"; import type { InputFieldType } from "../../types"; export const useChartPressState = ( initialValues: Init, ): { state: ChartPressState; isActive: boolean } => { const keys = Object.keys(initialValues.y).join(","); const state = React.useMemo(() => { return { isActive: makeMutable(false), matchedIndex: makeMutable(-1), x: { value: makeMutable(initialValues.x), position: makeMutable(0) }, y: Object.entries(initialValues.y).reduce( (acc, [key, initVal]) => { acc[key as keyof Init["y"]] = { value: makeMutable(initVal), position: makeMutable(0), }; return acc; }, {} as Record< keyof Init["y"], { value: SharedValue; position: SharedValue } >, ), yIndex: makeMutable(-1), // used for stacked bar charts }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [keys]); const isActive = useIsPressActive(state); return { state, isActive }; }; export type ChartPressStateInit = { x: InputFieldType; y: Record; }; export type ChartPressState = { isActive: SharedValue; matchedIndex: SharedValue; x: { value: SharedValue; position: SharedValue; }; y: Record< keyof Init["y"], { value: SharedValue; position: SharedValue } >; yIndex: SharedValue; }; const useIsPressActive = ( value: ChartPressState, ) => { const [isPressActive, setIsPressActive] = React.useState( () => value.isActive.value, ); useAnimatedReaction( () => value.isActive.value, (val, oldVal) => { if (val !== oldVal) runOnJS(setIsPressActive)(val); }, ); return isPressActive; };