Sample Code
import React,{useContext} from 'react';
import { useTheme } from '@mui/material/styles';
import { Stack, Typography, Avatar, Box, Card, CardContent } from '@mui/material';
import { IconDatabase, IconMail, IconMapPin, IconPhone, IconScreenShare } from '@tabler/icons-react';
import { useTheme } from '@mui/material/styles';
import { CustomizerContext } from '@/app/context/customizerContext';
type Props = {
title?: string;
subtitle?: string;
action?: React.ReactNode | any;
footer?: React.ReactNode;
cardheading?: string | React.ReactNode;
headtitle?: string | React.ReactNode;
headsubtitle?: string | React.ReactNode;
children?: React.ReactNode;
middlecontent?: string | React.ReactNode;
};
const DashboardCard = ({
title,
subtitle,
children,
action,
footer,
cardheading,
headtitle,
headsubtitle,
middlecontent,
}: Props) => {
const { isCardShadow } = useContext(CustomizerContext);
const theme = useTheme();
const borderColor = theme.palette.divider;
return (
<Card
sx={{ padding: 0, border: !isCardShadow ? '1px solid {borderColor}' : 'none' }}
elevation={isCardShadow ? 9 : 0}
variant={!isCardShadow ? 'outlined' : undefined}
>
{cardheading ? (
<CardContent>
<Typography variant="h5">{headtitle}</Typography>
<Typography variant="subtitle2" color="textSecondary">
{headsubtitle}
</Typography>
</CardContent>
) : (
<CardContent sx={{p: "30px"}}>
{title ? (
<Stack
direction="row"
spacing={2}
justifyContent="space-between"
alignItems={'center'}
mb={3}
>
<Box>
{title ? <Typography variant="h5">{title}</Typography> : ''}
{subtitle ? (
<Typography variant="subtitle2" color="textSecondary">
{subtitle}
</Typography>
) : (
''
)}
</Box>
{action}
</Stack>
) : null}
{children}
</CardContent>
)}
{middlecontent}
{footer}
</Card>
);
};
const UpcomingActivity = () => {
// chart color
const theme = useTheme();
const primary = theme.palette.primary.main;
const primarylight = theme.palette.primary.light;
const error = theme.palette.error.main;
const errorlight = theme.palette.error.light;
const warning = theme.palette.warning.main;
const warninglight = theme.palette.warning.light;
const secondary = theme.palette.secondary.main;
const secondarylight = theme.palette.secondary.light;
const success = theme.palette.success.main;
const successlight = theme.palette.success.light;
const stats = [
{
title: 'Trip to singapore',
subtitle: 'working on',
time: 5,
color: primary,
lightcolor: primarylight,
icon: <IconMapPin width={20} />,
},
{
title: 'Archived Data',
subtitle: 'working on',
time: 10,
color: secondary,
lightcolor: secondarylight,
icon: <IconDatabase width={20} />,
},
{
title: 'Meeting with client',
subtitle: 'pending',
time: 15,
color: warning,
lightcolor: warninglight,
icon: <IconPhone width={20} />,
},
{
title: 'Screening Task Team',
subtitle: 'working on',
time: 20,
color: error,
lightcolor: errorlight,
icon: <IconScreenShare width={20} />,
},
{
title: 'Send envelope to John',
subtitle: 'done',
time: 20,
color: success,
lightcolor: successlight,
icon: <IconMail width={20} />,
},
];
return (
<DashboardCard title="Upcoming Activity" subtitle='In New year'>
<>
<Stack spacing={3} mt={5}>
{stats.map((stat, i) => (
<Stack
direction="row"
spacing={3}
justifyContent="space-between"
alignItems="center"
key={i}
>
<Stack direction="row" alignItems="center" spacing={2}>
<Avatar
variant="rounded"
sx={{ bgcolor: stat.lightcolor, color: stat.color, width: 40, height: 40 }}
>
{stat.icon}
</Avatar>
<Box>
<Typography variant="h6" mb="4px">
{stat.title}
</Typography>
<Typography variant="subtitle2" color="textSecondary">
{stat.subtitle}
</Typography>
</Box>
</Stack>
<Typography variant="subtitle2" color="textSecondary">
{stat.time} mins
</Typography>
</Stack>
))}
</Stack>
</>
</DashboardCard>
);
};
export default UpcomingActivity;