UNPKG

react-native-chart-kit

Version:

Beautiful React Native charts for dashboards, reports, and data-rich mobile apps.

65 lines (64 loc) 3.07 kB
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); };