import React, { memo, useCallback, useMemo } from 'react'; import { CartesianGrid, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; import type { Margin } from 'recharts/types/util/types'; import { useTheme } from '@mui/material/styles'; import { useEmpty, useTick, ChartTooltip, formatterData, setDomainCalc, fixChartsClasses } from '../../utils'; import type { ChartTooltipProps } from '../../utils'; import type { Theme } from '../@styles/theme-provider'; export interface ChartLineProps { 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']; chartConfig?: ChartTooltipProps['config']; chartMargin?: Margin; } const ChartLine = (props: ChartLineProps) => { const theme = useTheme(); const empty = useEmpty(); const { data = [], tooltip, height, dots, domainMax = 100, domainCalc = false, tickCountY, dataKeyX = 'date', dataXFormat = 'month', dataYFormat = '', tooltipFormatter, chartConfig = [empty], chartMargin = { left: -24, right: 6 } } = props; const classes = fixChartsClasses(); const tick = useTick(); const newConfig = useMemo(() => [...chartConfig].reverse(), [chartConfig]); 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] ); return ( {tooltip && ( } /> )} {newConfig?.map( (entry, index) => entry.show && ( ) )} ); }; ChartLine.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(ChartLine); export { m as ChartLine };