UNPKG

@mui/x-charts

Version:

The community edition of MUI X Charts components.

91 lines (86 loc) 3.51 kB
import { createSelectorMemoized } from '@mui/x-internals/store'; import { selectorChartRawXAxis, selectorChartRawYAxis } from "./useChartCartesianAxisLayout.selectors.mjs"; import { computeAxisAutoSize } from "./computeAxisAutoSize.mjs"; import { selectorChartXAxisDomainsForAutoSize, selectorChartYAxisDomainsForAutoSize } from "./useChartAxisDomains.selectors.mjs"; // Direct state access to avoid circular dependency const selectorIsHydrated = state => state.dimensions.width && state.dimensions.height; const EMPTY_SIZES = {}; const EMPTY_RESULTS = {}; /** * Selector that computes full auto-size results for X axes that have `height: 'auto'`. * Returns a map of axis ID to full result (including group tick sizes for grouped axes). */ export const selectorChartXAxisAutoSizeResults = createSelectorMemoized(selectorChartRawXAxis, selectorIsHydrated, selectorChartXAxisDomainsForAutoSize, function selectorChartXAxisAutoSizeResults(xAxes, isHydrated, domainsMap) { const hasAutoAxis = xAxes?.some(axis => axis.height === 'auto'); if (!hasAutoAxis || !isHydrated) { return EMPTY_RESULTS; } const results = {}; for (let axisIndex = 0; axisIndex < (xAxes?.length ?? 0); axisIndex += 1) { const axis = xAxes[axisIndex]; if (axis.height === 'auto') { const computed = computeAxisAutoSize({ axis, direction: 'x', domain: domainsMap[axis.id] }); if (computed !== undefined) { results[axis.id] = computed; } } } return results; }); /** * Selector that computes auto-sizes for X axes that have `height: 'auto'`. * Returns a map of axis ID to computed height (just the size, not group tick sizes). */ export const selectorChartXAxisAutoSizes = createSelectorMemoized(selectorChartXAxisAutoSizeResults, function selectorChartXAxisAutoSizes(results) { if (results === EMPTY_RESULTS) { return EMPTY_SIZES; } const sizes = {}; for (const [axisId, result] of Object.entries(results)) { sizes[axisId] = result.size; } return sizes; }); /** * Selector that computes full auto-size results for Y axes that have `width: 'auto'`. * Returns a map of axis ID to full result (including group tick sizes for grouped axes). */ export const selectorChartYAxisAutoSizeResults = createSelectorMemoized(selectorChartRawYAxis, selectorIsHydrated, selectorChartYAxisDomainsForAutoSize, function selectorChartYAxisAutoSizeResults(yAxes, isHydrated, domainsMap) { const hasAutoAxis = yAxes?.some(axis => axis.width === 'auto'); if (!hasAutoAxis || !isHydrated) { return EMPTY_RESULTS; } const results = {}; for (let axisIndex = 0; axisIndex < (yAxes?.length ?? 0); axisIndex += 1) { const axis = yAxes[axisIndex]; if (axis.width === 'auto') { const computed = computeAxisAutoSize({ axis, direction: 'y', domain: domainsMap[axis.id] }); if (computed !== undefined) { results[axis.id] = computed; } } } return results; }); /** * Selector that computes auto-sizes for Y axes that have `width: 'auto'`. * Returns a map of axis ID to computed width (just the size, not group tick sizes). */ export const selectorChartYAxisAutoSizes = createSelectorMemoized(selectorChartYAxisAutoSizeResults, function selectorChartYAxisAutoSizes(results) { if (results === EMPTY_RESULTS) { return EMPTY_SIZES; } const sizes = {}; for (const [axisId, result] of Object.entries(results)) { sizes[axisId] = result.size; } return sizes; });