import { useEffect, useState } from "react"; import type { VisibleRange } from "klinecharts"; import { useKLineChart } from "./useKLineChart"; import { useChartEvent } from "./useChartEvent"; /** * Tracks the currently visible data range. * * Re-renders the host component whenever the visible range changes * (zoom, scroll, data load, etc.). Returns `null` before the chart has * laid out for the first time. * * @example * ```tsx * function RangeInfo() { * const range = useVisibleRange(); * return {range ? `${range.from}..${range.to}` : "—"}; * } * ``` */ export function useVisibleRange(): VisibleRange | null { const chart = useKLineChart(); const [range, setRange] = useState(null); // Seed from the current chart whenever the chart instance changes. useEffect(() => { setRange(chart?.getVisibleRange() ?? null); }, [chart]); useChartEvent("onVisibleRangeChange", (data) => { setRange(data as VisibleRange); }); return range; }