Files
pos-dashboard-v2/src/views/charts/recharts/RechartsAreaChart.tsx
T
2025-08-05 12:35:40 +07:00

181 lines
4.4 KiB
TypeScript

'use client'
// Next Imports
import dynamic from 'next/dynamic'
// MUI Imports
import Box from '@mui/material/Box'
import Card from '@mui/material/Card'
import Divider from '@mui/material/Divider'
import CardHeader from '@mui/material/CardHeader'
import Typography from '@mui/material/Typography'
import CardContent from '@mui/material/CardContent'
import { useTheme } from '@mui/material/styles'
// Component Imports
import { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from '@/libs/Recharts'
import type { TooltipProps } from '@/libs/Recharts'
// Styled Component Imports
const AppRecharts = dynamic(() => import('@/libs/styles/AppRecharts'))
// Vars
const data = [
{
name: '7/12',
Sales: 20,
Clicks: 60,
Visits: 100
},
{
name: '8/12',
Sales: 40,
Clicks: 80,
Visits: 120
},
{
name: '9/12',
Sales: 30,
Clicks: 70,
Visits: 90
},
{
name: '10/12',
Sales: 70,
Clicks: 110,
Visits: 170
},
{
name: '11/12',
Sales: 40,
Clicks: 80,
Visits: 130
},
{
name: '12/12',
Sales: 60,
Clicks: 80,
Visits: 160
},
{
name: '13/12',
Sales: 50,
Clicks: 100,
Visits: 140
},
{
name: '14/12',
Sales: 140,
Clicks: 90,
Visits: 240
},
{
name: '15/12',
Sales: 120,
Clicks: 180,
Visits: 220
},
{
name: '16/12',
Sales: 100,
Clicks: 160,
Visits: 180
},
{
name: '17/12',
Sales: 140,
Clicks: 140,
Visits: 270
},
{
name: '18/12',
Sales: 180,
Clicks: 200,
Visits: 280
},
{
name: '19/12',
Sales: 220,
Clicks: 220,
Visits: 375
}
]
const CustomTooltip = (props: TooltipProps<any, any>) => {
// Props
const { active, payload } = props
if (active && payload) {
return (
<div className='recharts-custom-tooltip'>
<Typography color='text.primary'>{props.label}</Typography>
<Divider />
{props &&
props.payload &&
props.payload.map((i: any) => {
return (
<Box key={i.dataKey} className='flex items-center gap-2.5' sx={{ '& i': { color: i.fill } }}>
<i className='tabler-circle-filled text-[10px]' />
<Typography variant='body2'>{`${i.dataKey} : ${i.payload[i.dataKey]}`}</Typography>
</Box>
)
})}
</div>
)
}
return null
}
const RechartsAreaChart = () => {
// Hooks
const theme = useTheme()
return (
<Card>
<CardHeader
title='Website Data'
sx={{
flexDirection: ['column', 'row'],
alignItems: ['flex-start', 'center'],
'& .MuiCardHeader-action': { mb: 0 },
'& .MuiCardHeader-content': { mb: [2, 0] }
}}
/>
<CardContent>
<div className='flex mbe-4 gap-6'>
<Box className='flex items-center gap-1.5' sx={{ '& i': { color: 'rgb(115, 103, 240)' } }}>
<i className='tabler-circle-filled text-xs' />
<Typography variant='body2'>Click</Typography>
</Box>
<Box className='flex items-center gap-1.5' sx={{ '& i': { color: 'rgba(115, 103, 240, .5)' } }}>
<i className='tabler-circle-filled text-xs' />
<Typography variant='body2'>Sales</Typography>
</Box>
<Box className='flex items-center gap-1.5' sx={{ '& i': { color: 'rgba(115, 103, 240, .2)' } }}>
<i className='tabler-circle-filled text-xs' />
<Typography variant='body2'>Visits</Typography>
</Box>
</div>
<AppRecharts>
<div className='bs-[350px]'>
<ResponsiveContainer>
<AreaChart height={350} data={data} style={{ direction: theme.direction }} margin={{ left: -20 }}>
<CartesianGrid />
<XAxis dataKey='name' reversed={theme.direction === 'rtl'} />
<YAxis orientation={theme.direction === 'rtl' ? 'right' : 'left'} />
<Tooltip content={CustomTooltip} />
<Area dataKey='Clicks' stackId='Clicks' stroke='0' fill='rgb(115, 103, 240)' />
<Area dataKey='Sales' stackId='Sales' stroke='0' fill='rgba(115, 103, 240, .5)' />
<Area dataKey='Visits' stackId='Visits' stroke='0' fill='rgba(115, 103, 240, .2)' />
</AreaChart>
</ResponsiveContainer>
</div>
</AppRecharts>
</CardContent>
</Card>
)
}
export default RechartsAreaChart