@mui/x-charts
Version:
The community edition of MUI X Charts components.
86 lines (84 loc) • 2.58 kB
JavaScript
'use client';
import _extends from "@babel/runtime/helpers/esm/extends";
import * as React from 'react';
import { getColorScale, getOrdinalColorScale } from "../../../colorScale.js";
function addDefaultId(axisConfig, defaultId) {
if (axisConfig.id !== undefined) {
return axisConfig;
}
return _extends({
id: defaultId
}, axisConfig);
}
function processColorMap(axisConfig) {
if (!axisConfig.colorMap) {
return axisConfig;
}
return _extends({}, axisConfig, {
colorScale: axisConfig.colorMap.type === 'ordinal' && axisConfig.data ? getOrdinalColorScale(_extends({
values: axisConfig.data
}, axisConfig.colorMap)) : getColorScale(axisConfig.colorMap.type === 'continuous' ? _extends({
min: axisConfig.min,
max: axisConfig.max
}, axisConfig.colorMap) : axisConfig.colorMap)
});
}
function getZAxisState(zAxis, dataset) {
if (!zAxis || zAxis.length === 0) {
return {
axis: {},
axisIds: []
};
}
const zAxisLookup = {};
const axisIds = [];
zAxis.forEach((axisConfig, index) => {
const dataKey = axisConfig.dataKey;
const defaultizedId = axisConfig.id ?? `defaultized-z-axis-${index}`;
if (dataKey === undefined || axisConfig.data !== undefined) {
zAxisLookup[defaultizedId] = processColorMap(addDefaultId(axisConfig, defaultizedId));
axisIds.push(defaultizedId);
return;
}
if (dataset === undefined) {
throw new Error('MUI X Charts: z-axis uses `dataKey` but no `dataset` is provided.');
}
zAxisLookup[defaultizedId] = processColorMap(addDefaultId(_extends({}, axisConfig, {
data: dataset.map(d => d[dataKey])
}), defaultizedId));
axisIds.push(defaultizedId);
});
return {
axis: zAxisLookup,
axisIds
};
}
export const useChartZAxis = ({
params,
store
}) => {
const {
zAxis,
dataset
} = params;
// The effect do not track any value defined synchronously during the 1st render by hooks called after `useChartZAxis`
// As a consequence, the state generated by the 1st run of this useEffect will always be equal to the initialization one
const isFirstRender = React.useRef(true);
React.useEffect(() => {
if (isFirstRender.current) {
isFirstRender.current = false;
return;
}
store.update(prev => _extends({}, prev, {
zAxis: getZAxisState(zAxis, dataset)
}));
}, [zAxis, dataset, store]);
return {};
};
useChartZAxis.params = {
zAxis: true,
dataset: true
};
useChartZAxis.getInitialState = params => ({
zAxis: getZAxisState(params.zAxis, params.dataset)
});