Files
Fulfillment-Frontend/src/pages/StatisticsPage/tabs/ProfitTab/components/ProfitChart/ProfitChart.tsx

66 lines
2.4 KiB
TypeScript

import { AreaChart } from "@mantine/charts";
import "@mantine/charts/styles.css";
import PageBlock from "../../../../../../components/PageBlock/PageBlock.tsx";
import { Skeleton, Stack } from "@mantine/core";
import { Total } from "../Total/Total.tsx";
import styles from "../../../../ui/StatisticsPage.module.css";
import { formatDate } from "../../../../../../types/utils.ts";
import { useProfitTabContext } from "../../contexts/ProfitTabContext.tsx";
export const ProfitChart = () => {
const {
profitChartData: profitData,
isChartLoading: isLoading,
} = useProfitTabContext();
const formattedProfitData = profitData.map(
value => {
return { ...value, date: formatDate(value.date) };
},
);
const getChartsSeries = [
[
{ name: "profit", label: "Прибыль", color: "indigo.6" },
{ name: "revenue", label: "Выручка", color: "teal.6" },
{ name: "expenses", label: "Расходы", color: "red.6" },
],
[
{ name: "cardsCount", label: "Количество сделок", color: "indigo.6" },
],
];
const units = ["₽", "шт"];
const chartSizes = ["47vh", "28vh"];
return (
<div className={styles["profit-chart-container"]}>
<Total profitData={profitData} />
<PageBlock style={{ padding: "25px" }}>
<Skeleton visible={isLoading}>
<Stack gap="4vh">
{getChartsSeries.map((series, idx) => {
return (
<AreaChart
my={"sm"}
w={"98%"}
h={chartSizes[idx]}
data={formattedProfitData}
dataKey="date"
unit={units[idx]}
tooltipAnimationDuration={200}
valueFormatter={(value) => new Intl.NumberFormat("ru-RU").format(value)}
series={series}
fillOpacity={0.5}
key={idx}
/>
);
})}
</Stack>
</Skeleton>
</PageBlock>
</div>
);
};