import { FunctionComponent, ReactNode, useMemo, useState } from 'react' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' import { AreaChart, Area, XAxis, YAxis, Tooltip, ResponsiveContainer, } from 'recharts' import FlipNumbers from 'react-flip-numbers' import LineChartIcon from '../icons/LineChartIcon' import ContentBox from '../shared/ContentBox' import { DownTriangle, UpTriangle } from '../shared/DirectionTriangles' import SheenLoader from '../shared/SheenLoader' import { COLORS } from '../../styles/colors' import { useTheme } from 'next-themes' import { IconButton } from './Button' import { ArrowLeftIcon } from '@heroicons/react/20/solid' import { FadeInFadeOut } from './Transitions' import ChartRangeButtons from './ChartRangeButtons' import Change from './Change' dayjs.extend(relativeTime) interface DetailedAreaChartProps { data: any[] daysToShow: number hideChange?: boolean hideChart?: () => void loading?: boolean setDaysToShow: (x: number) => void tickFormat?: (x: any) => string title?: string xKey: string yKey: string } const DetailedAreaChart: FunctionComponent = ({ data, daysToShow = 1, hideChange, hideChart, loading, setDaysToShow, tickFormat, title, xKey, yKey, }) => { const [mouseData, setMouseData] = useState(null) const { theme } = useTheme() const handleMouseMove = (coords: any) => { if (coords.activePayload) { setMouseData(coords.activePayload[0].payload) } } const handleMouseLeave = () => { setMouseData(null) } const calculateChartChange = () => { if (data.length) { if (mouseData) { const index = data.findIndex((d: any) => d[xKey] === mouseData[xKey]) const change = ((data[index][yKey] - data[0][yKey]) / Math.abs(data[0][yKey])) * 100 return isNaN(change) ? 0 : change } else return ( ((data[data.length - 1][yKey] - data[0][yKey]) / Math.abs(data[0][yKey])) * 100 ) } return 0 } const formatDateAxis = (date: string) => { if (daysToShow === 1) { return dayjs(date).format('h:mma') } else { return dayjs(date).format('D MMM') } } const flipGradientCoords = useMemo( () => data[0][yKey] <= 0 && data[data.length - 1][yKey] < data[0][yKey], [data] ) return ( {loading ? (
) : data.length ? (

{title}

{mouseData ? (
$ {!hideChange ? ( ) : null}

{dayjs(mouseData[xKey]).format('DD MMM YY, h:mma')}

) : (
$ {!hideChange ? ( ) : null}

{dayjs(data[data.length - 1][xKey]).format( 'DD MMM YY, h:mma' )}

)}
setDaysToShow(v)} />
} /> = 0 ? COLORS.GREEN[theme] : COLORS.RED[theme] } stopOpacity={0.15} /> = 0 ? COLORS.GREEN[theme] : COLORS.RED[theme] } stopOpacity={0} /> = 0 ? COLORS.GREEN[theme] : COLORS.RED[theme] } strokeWidth={1.5} fill="url(#gradientArea)" /> formatDateAxis(d)} /> tickFormat(v) : undefined } tickLine={false} />
) : (

Chart not available

)} ) } export default DetailedAreaChart