in packages/charts/src/chart_types/xy_chart/state/selectors/on_brush_end_caller.ts [47:122]
export function createOnBrushEndCaller(): (state: GlobalChartState) => void {
let prevProps: DragCheckProps | null = null;
let selector: Selector<GlobalChartState, void> | null = null;
return (state: GlobalChartState) => {
if (selector === null && state.chartType === ChartType.XYAxis) {
if (!isBrushAvailableSelector(state)) {
selector = null;
prevProps = null;
return;
}
selector = createCustomCachedSelector(
[
getLastDragSelector,
getSettingsSpecSelector,
getComputedScalesSelector,
computeChartDimensionsSelector,
isHistogramModeEnabledSelector,
computeSmallMultipleScalesSelector,
getSeriesSpecsSelector,
getKeyPressedSelector,
],
(
lastDrag,
{ onBrushEnd, rotation, brushAxis, minBrushDelta, roundHistogramBrushValues, allowBrushingLastHistogramBin },
computedScales,
{ chartDimensions },
histogramMode,
smallMultipleScales,
seriesSpec,
keyPressed,
): void => {
const nextProps = {
lastDrag,
onBrushEnd,
};
const { yScales, xScale } = computedScales;
if (lastDrag !== null && hasDragged(prevProps, nextProps) && onBrushEnd && isContinuousScale(xScale)) {
const brushAreaEvent: XYBrushEvent = {};
if (brushAxis === BrushAxis.X || brushAxis === BrushAxis.Both) {
brushAreaEvent.x = getXBrushExtent(
chartDimensions,
lastDrag,
rotation,
histogramMode,
xScale,
smallMultipleScales,
allowBrushingLastHistogramBin,
seriesSpec,
minBrushDelta,
roundHistogramBrushValues,
);
}
if (brushAxis === BrushAxis.Y || brushAxis === BrushAxis.Both) {
brushAreaEvent.y = getYBrushExtents(
chartDimensions,
lastDrag,
rotation,
yScales,
smallMultipleScales,
minBrushDelta,
);
}
if (brushAreaEvent.x !== undefined || brushAreaEvent.y !== undefined) {
onBrushEnd(brushAreaEvent, { keyPressed });
}
}
prevProps = nextProps;
},
);
}
if (selector) {
selector(state);
}
};
}