import { DashPathEffect, Group, Path } from "@shopify/react-native-skia"; import { useDerivedValue } from "react-native-reanimated"; import type { ChartPadding } from "../draw/line"; import type { ResolvedValueLineConfig } from "../core/resolveConfig"; import type { MultiEngineState } from "../core/useLiveChartEngine"; import { usePathBuilder } from "../hooks/usePathBuilder"; function SeriesValueLineAtIndex({ index, engine, padding, color, config, }: { index: number; engine: MultiEngineState; padding: ChartPadding; color: string; config: ResolvedValueLineConfig; }) { const builder = usePathBuilder(); const path = useDerivedValue(() => { const b = builder.value; const h = engine.canvasHeight.get(); const s = engine.series.get(); const displays = engine.displaySeriesValues.get(); if (h !== 0 && index < s.length) { const chartH = h - padding.top - padding.bottom; const dMin = engine.displayMin.get(); const dMax = engine.displayMax.get(); const valRange = dMax - dMin; const v = displays[index] ?? s[index].value; const y = valRange === 0 ? padding.top + chartH / 2 : padding.top + ((dMax - v) / valRange) * chartH; if (y >= 0) { b.moveTo(padding.left, y); b.lineTo(engine.canvasWidth.get() - padding.right, y); } } return b.detach(); }); const opacity = useDerivedValue(() => { const s = engine.series.get(); const op = engine.seriesOpacities.get(); if (index >= s.length || index >= op.length) return 0; return (op[index] ?? 0) * 0.4; }); return ( ); } export function MultiSeriesValueLines({ engine, padding, colors, config, seriesCount, }: { engine: MultiEngineState; padding: ChartPadding; colors: string[]; config: ResolvedValueLineConfig; /** Number of live series slots to mount. */ seriesCount: number; }) { return ( {Array.from({ length: seriesCount }, (_, i) => ( ))} ); }