Files
Frontend/src/views/dashboards/analytics/TotalEarning.tsx
T
2026-02-19 01:15:36 +03:30

226 lines
5.5 KiB
TypeScript

'use client'
// Next Imports
import dynamic from 'next/dynamic'
// MUI Imports
import Card from '@mui/material/Card'
import CardHeader from '@mui/material/CardHeader'
import CardContent from '@mui/material/CardContent'
import Typography from '@mui/material/Typography'
import { useTheme } from '@mui/material/styles'
// Third Party Imports
import classnames from 'classnames'
import type { ApexOptions } from 'apexcharts'
// Types Imports
import type { ThemeColor } from '@core/types'
// Components Imports
import OptionMenu from '@core/components/option-menu'
import CustomAvatar from '@core/components/mui/Avatar'
// Styled Component Imports
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
type DataType = {
title: string
amount: number
subtitle: string
avatarIcon: string
avatarColor: ThemeColor
amountDiff?: 'positive' | 'negative'
}
// Vars
const series = [
{ name: 'Earning', data: [15, 10, 20, 8, 12, 18, 12, 5] },
{ name: 'Expense', data: [-7, -10, -7, -12, -6, -9, -5, -8] }
]
const data: DataType[] = [
{
title: 'Total Revenue',
subtitle: 'Client Payment',
amount: 126,
avatarColor: 'primary',
avatarIcon: 'tabler-brand-paypal'
},
{
title: 'Total Sales',
subtitle: 'Refund',
amount: 98,
avatarColor: 'secondary',
avatarIcon: 'tabler-currency-dollar'
}
]
const TotalEarning = () => {
// Hooks
const theme = useTheme()
// Vars
const options: ApexOptions = {
chart: {
stacked: true,
parentHeightOffset: 0,
toolbar: { show: false },
zoom: {
enabled: false
}
},
legend: { show: false },
tooltip: { enabled: false },
dataLabels: { enabled: false },
stroke: {
width: 5,
colors: ['var(--mui-palette-background-paper)']
},
colors: ['var(--mui-palette-primary-main)', 'var(--mui-palette-secondary-main)'],
states: {
hover: {
filter: { type: 'none' }
},
active: {
filter: { type: 'none' }
}
},
plotOptions: {
bar: {
borderRadius: 7,
columnWidth: '40%',
borderRadiusApplication: 'around',
borderRadiusWhenStacked: 'all'
}
},
grid: {
borderColor: 'var(--mui-palette-divider)',
yaxis: {
lines: { show: false }
},
padding: {
top: -56,
left: -13,
right: 0,
bottom: -15
}
},
xaxis: {
labels: { show: false },
axisTicks: { show: false },
crosshairs: { opacity: 0 },
axisBorder: { show: false }
},
yaxis: {
labels: { show: false }
},
responsive: [
{
breakpoint: theme.breakpoints.values.xl,
options: {
plotOptions: {
bar: { columnWidth: '50%' }
}
}
},
{
breakpoint: 1380,
options: {
plotOptions: {
bar: {
borderRadius: 5,
columnWidth: '55%'
}
}
}
},
{
breakpoint: theme.breakpoints.values.lg,
options: {
plotOptions: {
bar: {
borderRadius: 7,
columnWidth: '40%'
}
}
}
},
{
breakpoint: theme.breakpoints.values.md,
options: {
plotOptions: {
bar: { columnWidth: '25%', borderRadius: 6 }
}
}
},
{
breakpoint: 680,
options: {
plotOptions: {
bar: { columnWidth: '28%' }
}
}
},
{
breakpoint: theme.breakpoints.values.sm,
options: {
plotOptions: {
bar: { columnWidth: '38%' }
}
}
},
{
breakpoint: 450,
options: {
plotOptions: {
bar: { columnWidth: '55%' }
}
}
}
]
}
return (
<Card>
<CardHeader
title='Total Earning'
action={<OptionMenu options={['Refresh', 'Share', 'Update']} />}
subheader={
<div className='flex items-center gap-2'>
<Typography variant='h2'>87%</Typography>
<div className='flex items-center gap-1'>
<i className='tabler-chevron-up text-xl text-success' />
<Typography color='success.main'>25.8%</Typography>
</div>
</div>
}
/>
<CardContent className='flex flex-col gap-4'>
<AppReactApexCharts type='bar' height={189} width='100%' series={series} options={options} />
{data.map((item, index) => (
<div key={index} className='flex items-center gap-4'>
<CustomAvatar skin='light' variant='rounded' color={item.avatarColor} size={38}>
<i className={classnames(item.avatarIcon, 'text-[22px]')} />
</CustomAvatar>
<div className='flex justify-between items-center is-full'>
<div className='flex flex-col'>
<Typography className='font-medium' color='text.primary'>
{item.title}
</Typography>
<Typography variant='body2'>{item.subtitle}</Typography>
</div>
<Typography
className='font-medium'
color={`${item.amountDiff === 'negative' ? 'error' : 'success'}.main`}
>{`${item.amountDiff === 'negative' ? '-' : '+'}$${item.amount}`}</Typography>
</div>
</div>
))}
</CardContent>
</Card>
)
}
export default TotalEarning