UNPKG

recharts

Version:
70 lines (68 loc) 2.51 kB
import { isWellBehavedNumber } from '../../../util/isWellBehavedNumber'; import { getValueByDataKey } from '../../../util/ChartUtils'; import { isWellFormedNumberDomain } from '../../../util/isDomainSpecifiedByUser'; function toFiniteNumber(value) { if (typeof value === 'number') { return Number.isFinite(value) ? value : undefined; } if (value instanceof Date) { var numericValue = value.valueOf(); return Number.isFinite(numericValue) ? numericValue : undefined; } var parsed = Number(value); return Number.isFinite(parsed) ? parsed : undefined; } function isValueWithinNumberDomain(value, domain) { var numericValue = toFiniteNumber(value); var lowerBound = domain[0]; var upperBound = domain[1]; if (numericValue === undefined) { return false; } var min = Math.min(lowerBound, upperBound); var max = Math.max(lowerBound, upperBound); return numericValue >= min && numericValue <= max; } function isValueWithinDomain(entry, axisDataKey, domain) { if (domain == null || axisDataKey == null) { return true; } var value = getValueByDataKey(entry, axisDataKey); if (value == null) { return true; } if (!isWellFormedNumberDomain(domain)) { return true; } return isValueWithinNumberDomain(value, domain); } export var combineActiveTooltipIndex = (tooltipInteraction, chartData, axisDataKey, domain) => { var desiredIndex = tooltipInteraction === null || tooltipInteraction === void 0 ? void 0 : tooltipInteraction.index; if (desiredIndex == null) { return null; } var indexAsNumber = Number(desiredIndex); if (!isWellBehavedNumber(indexAsNumber)) { // this is for charts like Sankey and Treemap that do not support numerical indexes. We need a proper solution for this before we can start supporting keyboard events on these charts. return desiredIndex; } /* * Zero is a trivial limit for single-dimensional charts like Line and Area, * but this also needs a support for multidimensional charts like Sankey and Treemap! TODO */ var lowerLimit = 0; var upperLimit = +Infinity; if (chartData.length > 0) { upperLimit = chartData.length - 1; } // now let's clamp the desiredIndex between the limits var clampedIndex = Math.max(lowerLimit, Math.min(indexAsNumber, upperLimit)); var entry = chartData[clampedIndex]; if (entry == null) { return String(clampedIndex); } if (!isValueWithinDomain(entry, axisDataKey, domain)) { return null; } return String(clampedIndex); };