react-native-chart-kit
Version:
Beautiful React Native charts for dashboards, reports, and data-rich mobile apps.
67 lines (66 loc) • 2.35 kB
JavaScript
const fullCircle = Math.PI * 2;
const normalizeAngleFromStart = (angle, startAngle) => {
let normalizedAngle = angle;
while (normalizedAngle < startAngle) {
normalizedAngle += fullCircle;
}
while (normalizedAngle >= startAngle + fullCircle) {
normalizedAngle -= fullCircle;
}
return normalizedAngle;
};
export const getPieChartInteractionConfig = (interaction) => {
if (!interaction) {
return {
mode: "none",
deselectOnOutsidePress: true,
onDeselect: undefined,
onSelect: undefined
};
}
if (interaction === "tap" || interaction === "none") {
return {
mode: interaction,
deselectOnOutsidePress: true,
onDeselect: undefined,
onSelect: undefined
};
}
return {
mode: interaction.mode ?? "tap",
deselectOnOutsidePress: interaction.deselectOnOutsidePress !== false,
onDeselect: interaction.onDeselect,
onSelect: interaction.onSelect
};
};
export const isPieChartInteractionEnabled = (config) => config.mode === "tap";
export const normalizePieChartSelectedIndex = (selectedIndex) => typeof selectedIndex === "number" && Number.isFinite(selectedIndex)
? Math.max(0, Math.floor(selectedIndex))
: undefined;
export const getPieChartSliceAtPoint = ({ arcs, centerX, centerY, innerRadius, locationX, locationY, radius }) => {
const dx = locationX - centerX;
const dy = locationY - centerY;
const distance = Math.sqrt(dx * dx + dy * dy);
if (distance < innerRadius || distance > radius) {
return undefined;
}
const firstDefinedArc = arcs.find((arc) => arc.defined);
if (!firstDefinedArc) {
return undefined;
}
const angle = normalizeAngleFromStart(Math.atan2(dy, dx), firstDefinedArc.startAngle);
return arcs.find((arc) => arc.defined && angle >= arc.startAngle && angle <= arc.endAngle);
};
export const buildPieChartSelectEvent = (arc) => {
if (!arc || !arc.defined) {
return undefined;
}
return {
index: arc.index,
label: arc.label,
value: arc.value,
percentage: arc.percentage,
...(arc.color !== undefined ? { color: arc.color } : {}),
...(arc.raw !== undefined ? { raw: arc.raw } : {})
};
};