import { useTheme } from '@mui/material/styles'; import React, { memo, useCallback } from 'react'; import { Area, AreaChart, CartesianGrid, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; import type { Margin } from 'recharts/types/util/types'; import type { ChartTooltipProps, ValueType, NameType } from '../../utils/charts'; import { ChartTooltip, fixChartsClasses, formatterData, formatterId, setDomainCalc, useTick } from '../../utils/charts'; import type { Theme } from '../@styles/theme-provider'; export interface ChartAreaProps { data?: Record[]; tooltip?: boolean; height?: number; dots?: boolean; domainMax?: number; domainCalc?: boolean; tickCountY?: number; dataKeyX?: ChartTooltipProps['format']; dataXFormat?: ChartTooltipProps['dataXFormat']; dataYFormat?: ChartTooltipProps['dataYFormat']; tooltipFormatter?: ChartTooltipProps['tooltipFormatter']; tooltipProps?: Partial; chartConfig?: ChartTooltipProps['config']; chartMargin?: Margin; reverseOrder?: boolean; } const ChartArea = (props: ChartAreaProps) => { const theme = useTheme(); const { data = [], tooltip, height, dots, domainMax = 100, domainCalc = false, tickCountY, dataKeyX = 'date', dataXFormat = 'month', dataYFormat = '', tooltipFormatter, tooltipProps, chartConfig = [], chartMargin = { left: -24, right: 6 }, reverseOrder = true } = props; const classes = fixChartsClasses(); const tick = useTick(); const formatterX = useCallback( (value: string) => formatterData(value, dataKeyX, dataXFormat), [dataKeyX, dataXFormat] ); const formatterY = useCallback( (value: string) => formatterData(value, '', dataYFormat), [dataYFormat] ); const setDomain = useCallback( (dataMax: number | undefined) => setDomainCalc(dataMax, domainCalc, domainMax), [domainMax, domainCalc] ); if (reverseOrder) chartConfig.reverse(); return ( {chartConfig?.map((entry, index) => ( ))} {tooltip && ( } {...tooltipProps} /> )} {chartConfig?.map(({ show, ...entry }, index) => { if (!show) return null; const { color, id, disableStroke, areaProps } = entry; const stroke = color || theme.palette.specialColors[chartConfig.length - index]; return ( ); })} ); }; ChartArea.defaultProps = { data: [], chartConfig: [], tooltip: true, height: 325, dots: false, dataKeyX: 'date', domainCalc: false, domainMax: 100, tickCountY: 10, dataXFormat: 'month', dataYFormat: '', chartMargin: { left: -24, right: 6 } }; const m = memo(ChartArea); export { m as ChartArea };