adminFront/src/pages/dashboard/Content/PromocodeManagement/StatisticsModal.tsx

277 lines
8.0 KiB
TypeScript
Raw Normal View History

2024-03-30 20:19:53 +00:00
import { useEffect, useState } from "react";
2024-03-26 15:41:22 +00:00
import {
Box,
Button,
Typography,
Modal,
TextField,
useTheme,
useMediaQuery,
IconButton,
2024-03-26 15:41:22 +00:00
} from "@mui/material";
import { DataGrid, GridLoadingOverlay, GridToolbar } from "@mui/x-data-grid";
import { DatePicker } from "@mui/x-date-pickers/DatePicker";
2024-03-26 15:41:22 +00:00
import { fadeIn } from "@root/utils/style/keyframes";
import type { GridColDef } from "@mui/x-data-grid";
import type { PromocodeStatistics } from "@root/model/promocodes";
import moment from "moment";
2024-03-30 20:19:53 +00:00
import { promocodeApi } from "@root/api/promocode/requests";
import ContentCopyIcon from '@mui/icons-material/ContentCopy';
2024-03-26 15:41:22 +00:00
type StatisticsModalProps = {
id: string;
to: number;
from: number;
2024-03-26 15:41:22 +00:00
setId: (id: string) => void;
setTo: (date: number) => void;
setFrom: (date: number) => void;
// promocodeStatistics: PromocodeStatistics[] | null | undefined;
2024-03-30 20:19:53 +00:00
// promocodeStatistics: any;
2024-03-26 15:41:22 +00:00
};
const COLUMNS: GridColDef<PromocodeStatistics, string>[] = [
{
field: "copy",
headerName: "копировать",
width: 50,
sortable: false,
valueGetter: ({ row }) => String(row.purchasesCount),
renderCell: (params) => {
return (
<IconButton onClick={() => navigator.clipboard.writeText(params.row.link)}>
<ContentCopyIcon />
</IconButton>
);
},
},
2024-03-26 15:41:22 +00:00
{
field: "link",
headerName: "Ссылка",
width: 320,
sortable: false,
valueGetter: ({ row }) => row.link,
},
{
field: "useCount",
headerName: "Использований",
width: 120,
sortable: false,
valueGetter: ({ row }) => String(row.useCount),
},
{
field: "purchasesCount",
headerName: "Покупок",
width: 70,
sortable: false,
valueGetter: ({ row }) => String(row.purchasesCount),
},
];
2024-03-30 20:19:53 +00:00
type ROW = {
link: string,
useCount: number
}
2024-03-26 15:41:22 +00:00
export const StatisticsModal = ({
id,
setId,
setFrom,
from,
to,
setTo,
//promocodeStatistics,
2024-03-26 15:41:22 +00:00
}: StatisticsModalProps) => {
const [startDate, setStartDate] = useState<Date>(new Date());
const [endDate, setEndDate] = useState<Date>(new Date());
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down(550));
2024-03-30 20:19:53 +00:00
const [general, setGeneral] = useState({});
const [rows, setRows] = useState([]);
const createFastlink = async () => {
await promocodeApi.createFastlink(id)
getParseData()
}
2024-03-30 20:19:53 +00:00
const getParseData = async () => {
const promocodeStatistics = await promocodeApi.getPromocodeStatistics(id, moment(startDate).unix(), moment(endDate).unix())
const rows = [] as ROW[]
//@ts-ignore
for (const [key, value] of Object.entries(promocodeStatistics.usageMap)) {
rows.push({
link: key,
//@ts-ignore
useCount: value,
id:rows.length
})
}
setGeneral(promocodeStatistics)
//@ts-ignore
setRows(rows)
}
useEffect(() => {
if (id.length > 0) getParseData()
}, [id])
// const formatTo = to === null ? 0 : moment(to).unix()
// const formatFrom = from === null ? 0 : moment(from).unix()
console.log(general)
// useEffect(() => {
// (async () => {
// const gottenGeneral = await promocodeStatistics(id, startDate, endDate)
// setGeneral(gottenGeneral[0])
// })()
// }, [to, from]);
2024-03-26 15:41:22 +00:00
return (
<Modal
open={Boolean(id)}
onClose={() => {
2024-03-30 20:19:53 +00:00
setId("")
setStartDate(new Date())
setEndDate(new Date())
}}
2024-03-26 15:41:22 +00:00
sx={{ "& > .MuiBox-root": { outline: "none" } }}
>
<Box
sx={{
position: "absolute",
top: "50%",
left: "50%",
transform: "translate(-50%, -50%)",
width: "95%",
maxWidth: "600px",
2024-03-27 07:35:28 +00:00
background: "#1F2126",
2024-03-26 15:41:22 +00:00
border: "2px solid gray",
borderRadius: "6px",
boxShadow: 24,
p: 4,
}}
>
<Box
sx={{
display: "flex",
gap: "30px",
justifyContent: "center",
alignItems: "center",
flexDirection: isMobile ? "column" : "row",
}}
>
<Box
sx={{
display: "flex",
gap: "30px",
justifyContent: "center",
alignItems: "center",
}}
>
<Button
sx={{ maxWidth: "100px" }}
onClick={createFastlink}
2024-03-26 15:41:22 +00:00
>
Создать короткую ссылку
</Button>
<Button
sx={{ maxWidth: "100px" }}
2024-03-30 20:19:53 +00:00
onClick={getParseData}
2024-03-26 15:41:22 +00:00
>
Обновить статистику
</Button>
</Box>
<Box sx={{ minWidth: "200px" }}>
<Box sx={{ display: "flex", alignItems: "center", gap: "10px" }}>
2024-03-27 07:35:28 +00:00
<Typography sx={{ minWidth: "20px", color: "#FFFFFF" }}>
от
</Typography>
<DatePicker
2024-03-26 15:41:22 +00:00
inputFormat="DD/MM/YYYY"
value={startDate}
onChange={(date) => date && setStartDate(date)}
renderInput={(params) => (
<TextField
{...params}
sx={{ background: "#1F2126", borderRadius: "5px" }}
/>
)}
InputProps={{
sx: {
height: "40px",
color: theme.palette.secondary.main,
border: "1px solid",
borderColor: theme.palette.secondary.main,
"& .MuiSvgIcon-root": {
color: theme.palette.secondary.main,
},
},
}}
/>
</Box>
<Box
sx={{
display: "flex",
alignItems: "center",
gap: "10px",
marginTop: "10px",
}}
>
2024-03-27 07:35:28 +00:00
<Typography sx={{ minWidth: "20px", color: "#FFFFFF" }}>
до
</Typography>
<DatePicker
2024-03-26 15:41:22 +00:00
inputFormat="DD/MM/YYYY"
value={endDate}
onChange={(date) => date && setEndDate(date)}
renderInput={(params) => (
<TextField
{...params}
sx={{ background: "#1F2126", borderRadius: "5px" }}
/>
)}
InputProps={{
sx: {
height: "40px",
color: theme.palette.secondary.main,
border: "1px solid",
borderColor: theme.palette.secondary.main,
"& .MuiSvgIcon-root": {
color: theme.palette.secondary.main,
},
},
}}
/>
</Box>
</Box>
</Box>
<DataGrid
disableSelectionOnClick={true}
2024-03-30 20:19:53 +00:00
rows={rows}
2024-03-26 15:41:22 +00:00
columns={COLUMNS}
sx={{
marginTop: "30px",
background: "#1F2126",
color: theme.palette.secondary.main,
"& .MuiDataGrid-iconSeparator": { display: "none" },
"& .css-levciy-MuiTablePagination-displayedRows": {
color: theme.palette.secondary.main,
},
"& .MuiSvgIcon-root": { color: theme.palette.secondary.main },
"& .MuiTablePagination-selectLabel": {
color: theme.palette.secondary.main,
},
"& .MuiInputBase-root": { color: theme.palette.secondary.main },
"& .MuiButton-text": { color: theme.palette.secondary.main },
"& .MuiDataGrid-overlay": {
backgroundColor: "rgba(255, 255, 255, 0.1)",
animation: `${fadeIn} 0.5s ease-out`,
},
}}
components={{
Toolbar: GridToolbar,
LoadingOverlay: GridLoadingOverlay,
}}
rowsPerPageOptions={[10, 25, 50, 100]}
autoHeight
/>
</Box>
</Modal>
);
};