chartcn

useViewRange

Brush zoom + scroll-to-zoom state management hook.

Manages the visible data range for charts with zoom capabilities. Handles brush slider state, scroll-to-zoom on the chart area, and initial zoom positioning.

Usage

import { useViewRange } from "@exhibit/charts";

const { viewRange, setViewRange, handleBrushChange, chartRef } = useViewRange({
  dataLength: data.length,
  defaultZoom: { start: 30, end: 70 },
  minVisibleItems: 20,
  zoomFactor: 0.08,
});

const visibleData = data.slice(viewRange.start, viewRange.end + 1);

Parameters

OptionTypeDefaultDescription
dataLengthnumberrequiredTotal number of data points
defaultZoom{ start: number; end: number }Initial zoom as percentages (0-100)
minVisibleItemsnumber20Minimum number of items visible when zoomed in
zoomFactornumber0.08How much each scroll event zooms (0-1)

Return value

FieldTypeDescription
viewRange{ start: number; end: number }Current visible index range
setViewRangeDispatch<SetStateAction<...>>Direct state setter
handleBrushChange(range: any) => voidCallback for ChartBrushSlider
chartRefRefObject<HTMLDivElement>Ref to attach to the chart container for scroll-to-zoom

Scroll-to-zoom

Attach chartRef to the wrapping <div> to enable scroll-to-zoom:

<div ref={chartRef}>
  <ResponsiveContainer>
    <LineChart data={visibleData}>
      {/* ... */}
    </LineChart>
  </ResponsiveContainer>
</div>

The hook registers a wheel event listener with { passive: false } to prevent page scrolling while zooming.

Default zoom

The defaultZoom option converts percentage values to data indices:

// Show the last 10% of data
useViewRange({ dataLength: 1000, defaultZoom: { start: 90, end: 100 } })
// viewRange = { start: 900, end: 999 }

On this page