UNPKG

react-native-chart-kit

Version:

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

48 lines (47 loc) 2.01 kB
const minVisiblePoints = 1; const clamp = (value, min, max) => { if (max < min) { return min; } return Math.min(Math.max(value, min), max); }; const normalizePositiveInteger = (value, fallback, min = 1) => { if (typeof value !== "number" || !Number.isFinite(value)) { return fallback; } return Math.max(min, Math.floor(value)); }; export const resolveBarChartViewport = ({ itemCount, scrollable = false, viewportWidth, visiblePoints }) => { const safeViewportWidth = Number.isFinite(viewportWidth) && viewportWidth > 0 ? viewportWidth : 0; const safeItemCount = normalizePositiveInteger(itemCount, 0, 0); const fallbackVisiblePoints = Math.max(safeItemCount, minVisiblePoints); const normalizedVisiblePoints = clamp(normalizePositiveInteger(visiblePoints, fallbackVisiblePoints), minVisiblePoints, Math.max(safeItemCount, minVisiblePoints)); const shouldScroll = scrollable && safeViewportWidth > 0 && safeItemCount > normalizedVisiblePoints; const contentWidth = shouldScroll ? Math.max(safeViewportWidth, (safeViewportWidth / normalizedVisiblePoints) * safeItemCount) : safeViewportWidth; return { contentWidth, itemCount: safeItemCount, maxOffset: Math.max(0, contentWidth - safeViewportWidth), scrollable: shouldScroll, viewportWidth: safeViewportWidth, visiblePoints: normalizedVisiblePoints }; }; export const resolveBarChartViewportInitialOffset = ({ initialIndex = "start", viewport }) => { if (!viewport.scrollable || initialIndex === "start") { return 0; } if (initialIndex === "end") { return viewport.maxOffset; } if (!Number.isFinite(initialIndex) || viewport.itemCount <= 0) { return 0; } const index = clamp(Math.floor(initialIndex), 0, viewport.itemCount - 1); const bandWidth = viewport.contentWidth / viewport.itemCount; return clamp(index * bandWidth, 0, viewport.maxOffset); };