UNPKG

@data-ui/xy-chart

Version:

A package of charts with standard x- and y- axes. https://williaster.github.io/data-ui

50 lines (38 loc) 1.56 kB
"use strict"; exports.__esModule = true; exports.default = findClosestDatum; var _d3Array = require("d3-array"); var _localPoint = _interopRequireDefault(require("@vx/event/build/localPoint")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function findClosestDatum(_ref) { var data = _ref.data, getX = _ref.getX, xScale = _ref.xScale, event = _ref.event, _ref$marginLeft = _ref.marginLeft, marginLeft = _ref$marginLeft === void 0 ? 0 : _ref$marginLeft; if (!event || !event.target || !event.target.ownerSVGElement) return null; var bisect = (0, _d3Array.bisector)(getX).left; // if the g element has a transform we need to be in g coords not svg coords var svgCoords = (0, _localPoint.default)(event.target.ownerSVGElement, event); var mouseX = svgCoords.x - marginLeft; var isOrdinalScale = typeof xScale.invert !== 'function'; var d; if (isOrdinalScale) { // Ordinal scales don't have an invert function so we do it maually var xDomain = xScale.domain(); var scaledXValues = xDomain.map(function (val) { return xScale(val); }); var index = (0, _d3Array.bisectLeft)(scaledXValues, mouseX); var d0 = data[index - 1]; var d1 = data[index]; d = d0 || d1; } else { var dataX = xScale.invert(mouseX); var _index = bisect(data, dataX, 0); var _d = data[_index - 1]; var _d2 = data[_index] || {}; d = !_d || Math.abs(dataX - getX(_d)) > Math.abs(dataX - getX(_d2)) ? _d2 : _d; } return d; }