@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
JavaScript
;
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;
}