export function createOnBrushEndCaller()

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);
    }
  };
}