-
Notifications
You must be signed in to change notification settings - Fork 730
/
Copy pathfindNearestStackDatum.ts
44 lines (42 loc) · 1.72 KB
/
findNearestStackDatum.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { AxisScale } from '@visx/axis';
import { getFirstItem, getSecondItem } from '@visx/shape/lib/util/accessors';
import findNearestDatumY from './findNearestDatumY';
import findNearestDatumX from './findNearestDatumX';
import { BarStackDatum, NearestDatumArgs } from '../types';
/**
* This is a wrapper around findNearestDatumX/Y for BarStack, accounting for a
* Bar's d0 and d1, not just d1 (which findNearestDatum uses). Additionally,
* returns the BarSeries original `Datum`, not the `BarStackDatum` so
* Tooltip typing is correct.
*/
export default function findNearestStackDatum<
XScale extends AxisScale,
YScale extends AxisScale,
Datum extends object,
>(
nearestDatumArgs: NearestDatumArgs<XScale, YScale, BarStackDatum<XScale, YScale>>,
seriesData: Datum[],
horizontal?: boolean,
) {
const { xScale, yScale, point } = nearestDatumArgs;
const datum = (horizontal ? findNearestDatumY : findNearestDatumX)(nearestDatumArgs);
const seriesDatum = datum?.index == null ? null : seriesData[datum.index];
return datum && seriesDatum && point
? {
index: datum.index,
datum: seriesDatum,
distanceX: horizontal // if mouse is ON the stack series, set 0 distance
? point.x >= (xScale(getFirstItem(datum.datum)) ?? Infinity) &&
point.x <= (xScale(getSecondItem(datum.datum)) ?? -Infinity)
? 0
: datum.distanceX
: datum.distanceX,
distanceY: horizontal
? datum.distanceY // if mouse is ON the stack series, set 0 distance
: point.y <= (yScale(getFirstItem(datum.datum)) ?? -Infinity) &&
point.y >= (yScale(getSecondItem(datum.datum)) ?? Infinity)
? 0
: datum.distanceY,
}
: null;
}