react-native-chart-kit
Version:
Beautiful React Native charts for dashboards, reports, and data-rich mobile apps.
65 lines (64 loc) • 3.07 kB
JavaScript
const defaultMinPanDistance = 6;
const defaultMinVisiblePoints = 6;
const defaultPinchSensitivity = 1;
const normalizeFiniteNumber = (value, fallback, min) => typeof value === "number" && Number.isFinite(value)
? Math.max(min, value)
: fallback;
const normalizePositiveInteger = (value, fallback, min) => Math.floor(normalizeFiniteNumber(value, fallback, min));
export const resolveChartViewportInteractionConfig = (viewportInteraction) => {
if (!viewportInteraction) {
return {
lockParentScroll: true,
maxVisiblePoints: undefined,
minPanDistance: defaultMinPanDistance,
minVisiblePoints: defaultMinVisiblePoints,
onGestureEnd: undefined,
onGestureStart: undefined,
pan: false,
pinchSensitivity: defaultPinchSensitivity,
pinchZoom: false
};
}
if (viewportInteraction === true) {
return {
lockParentScroll: true,
maxVisiblePoints: undefined,
minPanDistance: defaultMinPanDistance,
minVisiblePoints: defaultMinVisiblePoints,
onGestureEnd: undefined,
onGestureStart: undefined,
pan: true,
pinchSensitivity: defaultPinchSensitivity,
pinchZoom: false
};
}
return {
lockParentScroll: viewportInteraction.lockParentScroll !== false,
maxVisiblePoints: typeof viewportInteraction.maxVisiblePoints === "number" &&
Number.isFinite(viewportInteraction.maxVisiblePoints)
? Math.max(2, Math.floor(viewportInteraction.maxVisiblePoints))
: undefined,
minPanDistance: typeof viewportInteraction.minPanDistance === "number" &&
Number.isFinite(viewportInteraction.minPanDistance)
? Math.max(0, viewportInteraction.minPanDistance)
: defaultMinPanDistance,
minVisiblePoints: normalizePositiveInteger(viewportInteraction.minVisiblePoints, defaultMinVisiblePoints, 2),
onGestureEnd: viewportInteraction.onGestureEnd,
onGestureStart: viewportInteraction.onGestureStart,
pan: viewportInteraction.pan !== false,
pinchSensitivity: normalizeFiniteNumber(viewportInteraction.pinchSensitivity, defaultPinchSensitivity, 0.1),
pinchZoom: viewportInteraction.pinchZoom === true
};
};
export const getChartViewportPanDeltaPoints = ({ currentLocationX, plotWidth, startLocationX, visibleCount }) => {
const safePlotWidth = Number.isFinite(plotWidth) && plotWidth > 0 ? plotWidth : 1;
const pointSpacing = safePlotWidth / Math.max(1, visibleCount - 1);
return Math.round((startLocationX - currentLocationX) / pointSpacing);
};
export const getChartViewportPinchZoomFactor = ({ scale, sensitivity }) => {
const safeScale = typeof scale === "number" && Number.isFinite(scale)
? Math.max(0.05, scale)
: 1;
const safeSensitivity = normalizeFiniteNumber(sensitivity, defaultPinchSensitivity, 0.1);
return Math.pow(safeScale, safeSensitivity);
};