railbird-gql/component/charts/use-graph-data.ts

58 lines
1.8 KiB
TypeScript
Raw Normal View History

2024-01-12 14:04:45 -07:00
import { useMemo } from 'react';
import { convertToGraphData } from './graph-utils';
2024-01-12 14:04:45 -07:00
import { chartDefaults } from './graph-config';
import { GraphData, GraphProps, XValue, YAxisData } from './graph-types';
2024-01-12 14:04:45 -07:00
interface useGraphDataInterface {
xValues: Array<XValue>;
yData: {
2024-01-12 14:04:45 -07:00
data: {
value: number;
}[];
svg: {
fill: string;
};
}[];
yAxisLeftLabels: YAxisData;
yAxisRightLabels: YAxisData;
defaultProps: Partial<GraphProps>;
2024-01-12 14:04:45 -07:00
}
// this version assumes string values for X, this isn't necessarily the case
// convertToGraphData is specifically tailored to bar/group bar graphs
2024-01-12 14:04:45 -07:00
// ultimately this component could be used by any x & y axis graph types (line/bar/scatter)
export const useGraphData = (graphData: GraphData, props: Partial<GraphProps>): useGraphDataInterface => {
2024-01-12 14:04:45 -07:00
const { yAxisProps = {}, ...otherProps } = props;
const defaultProps = {
...chartDefaults,
...otherProps,
// assign default values for yAxisProps + spread to override with values coming from props
yAxisProps: {
maxLeftYAxisValue: Math.max(...(graphData.yValues[0]?.values ?? [0])),
maxRightYAxisValue:
graphData.yValues.length > 1 ? Math.max(...graphData.yValues[1]?.values) : undefined,
formatRightYAxisLabel: yAxisProps.formatRightYAxisLabel,
formatLeftYAxisLabel: yAxisProps.formatLeftYAxisLabel,
selectedLeftYAxisLabel: graphData.yValues[0]?.key,
selectedRightYAxisLabel: graphData.yValues[1]?.key,
...yAxisProps
}
};
const { yData, yAxisLeftLabels, yAxisRightLabels, xValues } = useMemo(
() => convertToGraphData(graphData, defaultProps.yAxisProps),
2024-01-12 14:04:45 -07:00
[graphData, defaultProps.yAxisProps]
);
return {
xValues,
yData,
2024-01-12 14:04:45 -07:00
yAxisLeftLabels,
yAxisRightLabels,
defaultProps
};
};