npm – https://www.npmjs.com/package/recharts
Сайт – https://recharts.org/en-US
Гайд – https://recharts.org/en-US/guide
Содержание
Столбчатый график
import { useEffect, useState } from "react";
import {
BarChart,
Bar,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
Legend,
Cell,
ResponsiveContainer,
PieChart,
Pie,
} from "recharts";
const Diagram = () => {
// данные для Диаграмм
const data = [
{ name: "Сафари", value: 800 },
{ name: "Гепард", value: 300 },
{ name: "На пол часа", value: 489 },
{ name: "На 1 час", value: 694 },
];
// Список цветов для диаграмм
const colorList = [
"#7a45e6",
"#ff3399",
"#0fbda0",
"#3388ff",
"#ffb851",
"#ff5151",
"#5680a6",
"#ec8be9",
"#97ba0e",
"#636d4c",
];
// end Список цветов для диаграмм
// Кастомный Tooltip только для Bar
const CustomTooltip = ({ active, payload, label }) => {
if (active && payload && payload.length) {
const { name, value } = payload[0];
const index = data.findIndex((item) => item.name === label);
const color = colorList[index % colorList.length];
return (
<div className="custom-tooltip_box">
<div className="legend_ind-name_box">
<div
className="diagram-circle-ind"
style={{
backgroundColor: color,
}}
></div>
<span>{label}</span>
</div>
<span>{payload[0].value}</span>
</div>
);
}
return null;
};
// end Кастомный Tooltip только для Bar
return (
{/* Столбчатый график */}
<ResponsiveContainer width="100%" height={300}>
<BarChart data={data}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="name" tick={false} />
<YAxis />
<Tooltip
radius={[6, 6, 6, 6]}
cursor={{ fill: "#eef0fa" }}
content={<CustomTooltip />}
/>
{/* <Legend /> */}
<Bar
dataKey="value"
radius={[6, 6, 6, 6]}
activeShape={{
fill: "red",
}}
>
{data.map((entry, index) => (
<Cell
key={`cell-${index}`}
fill={colorList[index % colorList.length]}
/>
))}
</Bar>
</BarChart>
</ResponsiveContainer>
{/* Подписи под графиком */}
<div className="custom-legend_box">
{data.map((entry, index) => (
<div className="item">
<div className="legend_ind-name_box">
<div
className="diagram-circle-ind"
style={{
background: colorList[index % colorList.length],
}}
></div>
<span className="name">{entry.name}</span>
</div>
<span className="value">{entry.value}</span>
</div>
))}
</div>
{/* end Подписи под графиком */}
{/* end Столбчатый график */}
);
}Круговая диаграмма Pie
import { useEffect, useState } from "react";
import {
BarChart,
Bar,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
Legend,
Cell,
ResponsiveContainer,
PieChart,
Pie,
} from "recharts";
const Diagram = () => {
// данные для Диаграмм
const data = [
{ name: "Сафари", value: 800 },
{ name: "Гепард", value: 300 },
{ name: "На пол часа", value: 489 },
{ name: "На 1 час", value: 694 },
];
// Список цветов для диаграмм
const colorList = [
"#7a45e6",
"#ff3399",
"#0fbda0",
"#3388ff",
"#ffb851",
"#ff5151",
"#5680a6",
"#ec8be9",
"#97ba0e",
"#636d4c",
];
// end Список цветов для диаграмм
// Кастомный Tooltip с цветным кружком только для Pie
const CustomTooltip = ({ active, payload }) => {
if (active && payload && payload.length) {
const { name, value } = payload[0];
const index = data.findIndex((item) => item.name === name);
const color = colorList[index % colorList.length];
return (
<div className="custom-tooltip_box">
<div className="legend_ind-name_box">
<div
className="diagram-circle-ind"
style={{ backgroundColor: color }}
></div>
<span>{name}</span>
</div>
<span>{value}</span>
</div>
);
}
return null;
};
return (
{/* Круговая диаграмма */}
<ResponsiveContainer width="100%" height={300}>
<PieChart>
<Tooltip content={<CustomTooltip />} />
<Pie
data={data}
dataKey="value"
nameKey="name"
cx="50%"
cy="50%"
outerRadius={100}
innerRadius={60}
paddingAngle={2}
cornerRadius={8}
label={({ value }) => {
const total = data.reduce(
(sum, entry) => sum + entry.value,
0
);
const percent = ((value / total) * 100).toFixed(0);
return `${percent}%`;
}}
>
{data.map((entry, index) => (
<Cell
key={`cell-${index}`}
fill={colorList[index % colorList.length]}
/>
))}
</Pie>
</PieChart>
</ResponsiveContainer>
{/* Подписи под диаграммой */}
<div className="custom-legend_box">
{data.map((entry, index) => (
<div className="item">
<div className="legend_ind-name_box">
<div
className="diagram-circle-ind"
style={{
background: colorList[index % colorList.length],
}}
></div>
<span className="name">{entry.name}</span>
</div>
<span className="value">{entry.value}</span>
</div>
))}
</div>
{/* end Подписи под диаграммой */}
{/* end Круговая диаграмма */}
);
}
Универсальный, кастомный Tooltip для Bar и Pie
// Универсальный кастомный Tooltip для Bar и Pie
const CustomTooltip = ({ active, payload, label }) => {
if (active && payload && payload.length) {
const { name, value } = payload[0];
// Используем label, если доступен (BarChart), иначе name (PieChart)
const displayName = label || name;
// Поиск цвета по названию
const index = data.findIndex((item) => item.name === displayName);
const color = colorList[index % colorList.length];
return (
<div className="custom-tooltip_box">
<div className="legend_ind-name_box">
<div
className="diagram-circle-ind"
style={{ backgroundColor: color }}
></div>
<span>{displayName}</span>
</div>
<span>{value}</span>
</div>
);
}
return null;
};Просто последний код со страницы
import { useEffect, useState } from "react";
// import Rub from "../../assets/img/rub.svg?react";
import Trip from "../../assets/img/report/trip.svg?react";
// import Bonus from "../../assets/img/report/bonus.svg?react";
import Pass from "../../assets/img/report/pass-2.svg?react";
import Ins from "../../assets/img/report/ins.svg?react";
import Fine from "../../assets/img/report/fine.svg?react";
import Debt from "../../assets/img/report/debt.svg?react";
import PieIcon from "../../assets/img/report/pie-diag-icon.svg?react";
import BarIcon from "../../assets/img/report/bar-diag-icon.svg?react";
import SelectArrow from "../../assets/img/report/arrow-down-sel.svg?react";
import { useSelector, useDispatch } from "react-redux";
import { getStatsAction } from "../../slices/report-slices/report.slice";
import LoadingSpinner from "../ui/LoaderSpinner/LoaderSpinner";
import { useGlobalFilter } from "../../hooks/useGlobalFilter";
import {
BarChart,
Bar,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
Legend,
Cell,
ResponsiveContainer,
PieChart,
Pie,
Sector,
} from "recharts";
const Report = () => {
const { stats, query, loading, error } = useSelector((state) => state.report);
const dispatch = useDispatch();
// данные для Диаграмм
const data = [
{ name: "Сафари", value: 800 },
{ name: "Гепард", value: 300 },
{ name: "На пол часа", value: 489 },
{ name: "На 1 час", value: 694 },
// { name: "Т 5", value: 324 },
// { name: "Т 6", value: 704 },
// { name: "Т 7", value: 458 },
// { name: "Т 8", value: 540 },
// { name: "Т 9", value: 250 },
// { name: "Т 10", value: 750 },
// { name: "Тариф 1", value: 800, fill: "#8884d8" },
// { name: "Тариф 2", value: 300, fill: "#82ca9d" },
// { name: "Тариф 3", value: 489, fill: "#ffc658" },
// { name: "Тариф 4", value: 694, fill: "#ff8042" },
];
// Список цветов для диаграмм
const colorList = [
"#7a45e6",
"#ff3399",
"#0fbda0",
"#3388ff",
"#ffb851",
"#ff5151",
"#5680a6",
"#ec8be9",
"#97ba0e",
"#636d4c",
];
// end Список цветов для диаграмм
useEffect(() => {
const resizableColumns = document.querySelectorAll(".col-resize");
let startX, startWidth, resizedElement;
const initResize = (e, column) => {
startX = e.clientX;
startWidth = parseInt(
document.defaultView.getComputedStyle(column).width
);
resizedElement = column;
document.addEventListener("mousemove", doResize);
document.addEventListener("mouseup", stopResize);
};
const doResize = (e) => {
const newWidth = startWidth + (e.clientX - startX);
resizedElement.style.width = newWidth + "px";
};
const stopResize = () => {
document.removeEventListener("mousemove", doResize);
document.removeEventListener("mouseup", stopResize);
};
resizableColumns.forEach((column) => {
column.addEventListener("mousedown", (e) =>
initResize(e, column.parentNode)
);
});
return () => {
document.removeEventListener("mousemove", doResize);
document.removeEventListener("mouseup", stopResize);
};
}, []);
const { filteredValue } = useGlobalFilter();
useEffect(() => {
dispatch(
getStatsAction(query + `&who=${!filteredValue ? 0 : filteredValue}`)
);
}, [query, filteredValue]);
if (error) {
return (
<div
style={{
display: "flex",
alignItems: "center",
height: "100vh",
justifyContent: "center",
fontSize: "16px",
}}
>
Не удалось получить отчет. Убедитесь в корректности фильтра 🦒
</div>
);
}
// Кастомный Tooltip только для Bar
// const CustomTooltip = ({ active, payload, label }) => {
// if (active && payload && payload.length) {
// const { name, value } = payload[0];
// const index = data.findIndex((item) => item.name === label);
// const color = colorList[index % colorList.length];
// return (
// <div className="custom-tooltip_box">
// <div className="legend_ind-name_box">
// <div
// className="diagram-circle-ind"
// style={{
// backgroundColor: color,
// }}
// ></div>
// <span>{label}</span>
// </div>
// <span>{payload[0].value}</span>
// </div>
// );
// }
// return null;
// };
// end Кастомный Tooltip только для Bar
// Кастомный Tooltip только для Pie
// const CustomTooltipPie = ({ active, payload }) => {
// if (active && payload && payload.length) {
// const { name, value } = payload[0];
// const index = data.findIndex((item) => item.name === name);
// const color = colorList[index % colorList.length];
// return (
// <div className="custom-tooltip_box">
// <div className="legend_ind-name_box">
// <div
// className="diagram-circle-ind"
// style={{ backgroundColor: color }}
// ></div>
// <span>{name}</span>
// </div>
// <span>{value}</span>
// </div>
// );
// }
// return null;
// };
// end Кастомный Tooltip только для Pie
// Универсальный кастомный Tooltip для Bar и Pie
const CustomTooltip = ({ active, payload, label }) => {
if (active && payload && payload.length) {
const { name, value } = payload[0];
// Используем label, если доступен (BarChart), иначе name (PieChart)
const displayName = label || name;
// Поиск цвета по названию
const index = data.findIndex((item) => item.name === displayName);
const color = colorList[index % colorList.length];
return (
<div className="custom-tooltip_box">
<div className="legend_ind-name_box">
<div
className="diagram-circle-ind"
style={{ backgroundColor: color }}
></div>
<span>{displayName}</span>
</div>
<span>{value}</span>
</div>
);
}
return null;
};
// end Универсальный кастомный Tooltip для Bar и Pie
// Последний
// const CustomTooltipPie = ({ active, payload }) => {
// if (active && payload && payload.length) {
// const { name, value } = payload[0];
// const total = data.reduce((sum, entry) => sum + entry.value, 0);
// const percent = ((value / total) * 100).toFixed(1);
// const index = data.findIndex((item) => item.name === name);
// const color = colorList[index % colorList.length];
// return (
// <div className="custom-tooltip_box">
// <div className="legend_ind-name_box">
// <div
// className="diagram-circle-ind"
// style={{ backgroundColor: color }}
// ></div>
// <span>{name}</span>
// </div>
// <span>{percent}%</span>
// </div>
// );
// }
// return null;
// };
const [activeIndex, setActiveIndex] = useState(null);
const onPieEnter = (_, index) => setActiveIndex(index);
const onPieLeave = () => setActiveIndex(null);
// Код для смены иконки в кнопки и графика в контейере в зависимости от выбора
// Стейт для выбранной диаграммы ('bar' или 'pie')
const [selected, setSelected] = useState("bar");
// Стейт для показа/скрытия всплывашки
const [isOpen, setIsOpen] = useState(false);
// Функция для выбора диаграммы и закрытия всплывашки
const onSelect = (type) => {
setSelected(type);
setIsOpen(false);
};
// Выбор иконки для кнопки в зависимости от selected
const Icon = selected === "bar" ? BarIcon : PieIcon;
return (
<>
{/* end Всплывашка с выбором */}
{/* Диаграмма */}
<div className="diag_container">
<div className="diag_wrapper">
<div className="top-box">
{/* Всплывашка с выбором */}
{isOpen && (
<div className="diag-type_select-cont">
<div className="item" onClick={() => onSelect("bar")}>
<input type="radio" checked={selected === "bar"} readOnly />
<div className="lable-box">
<BarIcon />
<span className="name">Столбчатый график</span>
</div>
</div>
<div className="item" onClick={() => onSelect("pie")}>
<input type="radio" checked={selected === "pie"} readOnly />
<div className="lable-box">
<PieIcon />
<span className="name">Круговая диаграмма</span>
</div>
</div>
</div>
)}
<span className="title">Число выборов</span>
<div className="btn-select-diag" onClick={() => setIsOpen(!isOpen)}>
<Icon />
<SelectArrow />
</div>
</div>
{selected === "bar" && (
<div className="diag-data_inner">
{/* <ResponsiveContainer width="100%" height={300}>
<BarChart data={data}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="name" />
<YAxis />
<Tooltip />
<Legend content={renderCustomLegend} />
<Bar dataKey="value">
{data.map((entry, index) => (
<Cell
key={`cell-${index}`}
fill={colorList[index % colorList.length]}
/>
))}
</Bar>
</BarChart>
</ResponsiveContainer> */}
<ResponsiveContainer width="100%" height={300}>
<BarChart data={data}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="name" tick={false} />
<YAxis />
<Tooltip
radius={[6, 6, 6, 6]}
cursor={{ fill: "#eef0fa" }}
content={<CustomTooltip />}
/>
{/* <Legend /> */}
<Bar
dataKey="value"
// stackId="a"
radius={[6, 6, 6, 6]}
activeShape={{
fill: "red",
}}
// label={{ position: "top" }}
>
{data.map((entry, index) => (
<Cell
key={`cell-${index}`}
fill={colorList[index % colorList.length]}
/>
))}
</Bar>
</BarChart>
</ResponsiveContainer>
{/* Подписи под графиком */}
<div className="custom-legend_box">
{data.map((entry, index) => (
<div className="item">
<div className="legend_ind-name_box">
<div
className="diagram-circle-ind"
style={{
background: colorList[index % colorList.length],
}}
></div>
<span className="name">{entry.name}</span>
</div>
<span className="value">{entry.value}</span>
</div>
))}
</div>
{/* end Подписи под графиком */}
</div>
)}
{selected === "pie" && (
// <></>
<div className="diag-data_inner">
<ResponsiveContainer width="100%" height={300}>
<PieChart>
{/* Центральный текст по умолчанию */}
{activeIndex === null || activeIndex === -1 ? (
<>
<text
x="50%"
y="50%"
textAnchor="middle"
fill="#333"
fontSize={14}
fontWeight="bold"
>
{data.reduce((sum, e) => sum + e.value, 0)}
</text>
<text
x="50%"
y="56%"
textAnchor="middle"
fill="#666"
fontSize={14}
>
100%
</text>
</>
) : null}
<Tooltip content={<CustomTooltip />} />
<Pie
data={data}
dataKey="value"
nameKey="name"
cx="50%"
cy="50%"
outerRadius={100}
innerRadius={60}
paddingAngle={2}
cornerRadius={8}
onMouseEnter={onPieEnter}
onMouseLeave={onPieLeave}
activeIndex={activeIndex}
activeShape={(props) => {
const total = data.reduce((sum, e) => sum + e.value, 0);
const percent = ((props.value / total) * 100).toFixed(0);
return (
<g>
<text
// x={props.cx}
// y={props.cy - 10}
x="50%"
y="50%"
textAnchor="middle"
fill="#333"
fontSize={14}
fontWeight="bold"
>
{props.value}
</text>
<text
// x={props.cx}
// y={props.cy + 12}
x="50%"
y="56%"
textAnchor="middle"
fill="#666"
fontSize={14}
>
{percent}%
</text>
<Sector {...props} outerRadius={110} />
</g>
);
}}
label={({ value }) => {
const total = data.reduce(
(sum, entry) => sum + entry.value,
0
);
const percent = ((value / total) * 100).toFixed(0);
return `${percent}%`;
}}
isAnimationActive={false}
>
{data.map((entry, index) => (
<Cell
key={`cell-${index}`}
fill={colorList[index % colorList.length]}
/>
))}
</Pie>
</PieChart>
</ResponsiveContainer>
{/* Подписи под графиком */}
<div className="custom-legend_box">
{(() => {
const total = data.reduce(
(sum, entry) => sum + entry.value,
0
);
return data.map((entry, index) => {
const percent =
total > 0 ? Math.round((entry.value / total) * 100) : 0;
return (
<div className="item" key={index}>
<div className="legend_ind-name_box">
<div
className="diagram-circle-ind"
style={{
background: colorList[index % colorList.length],
}}
></div>
<span className="name">{entry.name}</span>
</div>
<span className="value">
{/* {entry.value} */}
{percent}%
</span>
</div>
);
});
})()}
</div>
{/* end Подписи под графиком */}
</div>
)}
</div>
{/* Круговая диаграмма */}
<div className="diag_wrapper">
<span className="title">Число выборов</span>
<div className="diag-data_inner">
<ResponsiveContainer width="100%" height={300}>
<PieChart>
{/* Центральный текст по умолчанию */}
{activeIndex === null || activeIndex === -1 ? (
<>
<text
x="50%"
y="50%"
textAnchor="middle"
fill="#333"
fontSize={14}
fontWeight="bold"
>
{data.reduce((sum, e) => sum + e.value, 0)}
</text>
<text
x="50%"
y="56%"
textAnchor="middle"
fill="#666"
fontSize={14}
>
100%
</text>
</>
) : null}
<Tooltip content={<CustomTooltip />} />
<Pie
data={data}
dataKey="value"
nameKey="name"
cx="50%"
cy="50%"
outerRadius={100}
innerRadius={60}
paddingAngle={2}
cornerRadius={8}
onMouseEnter={onPieEnter}
onMouseLeave={onPieLeave}
activeIndex={activeIndex}
activeShape={(props) => {
const total = data.reduce((sum, e) => sum + e.value, 0);
const percent = ((props.value / total) * 100).toFixed(0);
return (
<g>
<text
// x={props.cx}
// y={props.cy - 10}
x="50%"
y="50%"
textAnchor="middle"
fill="#333"
fontSize={14}
fontWeight="bold"
>
{props.value}
</text>
<text
// x={props.cx}
// y={props.cy + 12}
x="50%"
y="56%"
textAnchor="middle"
fill="#666"
fontSize={14}
>
{percent}%
</text>
<Sector {...props} outerRadius={110} />
</g>
);
}}
label={({ value }) => {
const total = data.reduce(
(sum, entry) => sum + entry.value,
0
);
const percent = ((value / total) * 100).toFixed(0);
return `${percent}%`;
}}
isAnimationActive={false}
>
{data.map((entry, index) => (
<Cell
key={`cell-${index}`}
fill={colorList[index % colorList.length]}
/>
))}
</Pie>
</PieChart>
</ResponsiveContainer>
{/* Подписи под графиком */}
<div className="custom-legend_box">
{data.map((entry, index) => (
<div className="item">
<div className="legend_ind-name_box">
<div
className="diagram-circle-ind"
style={{
background: colorList[index % colorList.length],
}}
></div>
<span className="name">{entry.name}</span>
</div>
<span className="value">{entry.value}</span>
</div>
))}
</div>
{/* end Подписи под графиком */}
</div>
</div>
{/* end Круговая диаграмма */}
</div>
{/* end Диаграмма */}
{/* {loading ? <LoadingSpinner /> : null} */}
<div className="page-area report-page">
<div className="informer-bar">
<div className="scoot-filter-new">
<span
className="item active"
// className={subViewCategory === "ACTIVE" ? "item active" : "item"}
// onClick={() => setSubViewCategory("ACTIVE")}
>
Общий
</span>
<span
className="item"
// className={subViewCategory === "ARCHIVE" ? "item active" : "item"}
// onClick={() => setSubViewCategory("ARCHIVE")}
>
Тарифы
</span>
</div>
{/* <div className="change-funnel-btn">
<button
className="add-new-scooter_btn"
onClick={() => dispatch(setSubscriptionAddWindow(true))}
>
Добавить подписку
</button>
</div> */}
</div>
<div className="report_wrapper">
{/* Общие показатели в карточках */}
<div className="report-cards">
<div className="item">
<span className="title">Всего поездок:</span>
<span className="value">{stats?.report?.totalTrips}</span>
</div>
<div className="item">
<span className="title">Общая сумма:</span>
<div className="cost">
<span className="value">{stats?.report?.totalSum} ₽</span>
</div>
</div>
<div className="item">
<span className="title">Сумма начислений:</span>
<div className="cost">
<span className="value">{stats?.report?.chargesAmount} ₽</span>
</div>
</div>
<div className="item">
<span className="title">Выручка франчайзи:</span>
<div className="cost">
<span className="value">
{stats?.report?.franchiseRevenue} ₽
</span>
</div>
</div>
<div className="item">
<span className="title">Среднее кол-во поездок:</span>
<span className="value">{stats?.report?.averageTripsCount}</span>
</div>
<div className="item">
<span className="title">Средняя стоимость поездки:</span>
<div className="cost">
<span className="value">
{stats?.report?.averageTripsPrice} ₽
</span>
</div>
</div>
{/* <div className="item">
<span className="title">Общая стоимость:</span>
<div className="cost">
<Rub />
<span className="value">{stats.totalPrice}</span>
</div>
</div>
<div className="item">
<span className="title">Списано денег за поездки:</span>
<div className="cost">
<Rub />
<span className="value">{stats.moneyForTheTrips}</span>
</div>
</div>
<div className="item">
<span className="title">Списано денег за подписки:</span>
<div className="cost">
<Rub />
<span className="value">0.00</span>
</div>
</div>
<div className="item">
<span className="title">Списано бонусов:</span>
<div className="cost">
<Rub />
<span className="value">200.00</span>
</div>
</div>
<div className="item">
<span className="title">Общая сумма начисления:</span>
<div className="cost">
<Rub />
<span className="value">3500.00</span>
</div>
</div> */}
</div>
<div className="report-separator">
<span className="title">По категориям</span>
</div>
{/* Карточки-статистика по сегментам */}
<div className="report-cards-seg">
<div className="sreports-cards_item add-trip-style">
<span className="title">
Поездки: {stats?.report?.categories.trips?.count}
</span>
<span className="title">
Сумма: {stats?.report?.categories.trips?.totalSum}₽
</span>
<ul className="sreports-cards_item-list">
<li>
оплачено рублями: {stats?.report?.categories.trips.paidMoney}₽
</li>
<li>
оплачено бонусами:{" "}
{stats?.report?.categories.trips.paidBonuses}₽
</li>
<li>не оплачено: {stats?.report?.categories.trips.notPaid}₽</li>
{/* <li>страховки: 100₽</li> */}
</ul>
{/* <span className="title">Выручка: 1400₽</span> */}
<Trip className="icon sreport-icon-bg-pink" />
</div>
<div className="report-cards">
{/* Страховки */}
<div className="sreports-cards_item">
<span className="title">Страховки</span>
<span className="">продано: 0</span>
<span className="">сумма: 0.00₽</span>
<Ins className="icon sreport-icon-bg-blue" />
</div>
{/* end Страховки */}
{/* Подписки */}
<div className="sreports-cards_item">
<span className="title">Подписки</span>
<span className="">
продано: {stats?.report?.categories?.subscriptions?.count}
</span>
<span className="">
сумма: {stats?.report?.categories?.subscriptions?.totalSum}₽
</span>
<Pass className="icon sreport-icon-bg-violet" />
</div>
{/* end Подписки */}
{/* Штрафы */}
<div className="sreports-cards_item">
<span className="title">Штрафы</span>
<span className="">
оплачено: {stats?.report?.categories.fines?.paidCount}
</span>
<span className="">
сумма: {stats?.report?.categories.fines?.paidSum}₽
</span>
<Fine className="icon sreport-icon-bg-red" />
</div>
{/* end Штрафы */}
{/* Долги */}
<div className="sreports-cards_item">
<span className="title">Долги</span>
<span className="">
оплачено: {stats?.report?.categories.debts?.paidCount}
</span>
<span className="">
сумма: {stats?.report?.categories.debts?.paidSum}₽
</span>
<Debt className="icon sreport-icon-bg-red" />
</div>
{/* end Долги */}
{/* Бонусы */}
{/* <div className="sreports-cards_item">
<span className="title">Бонусы</span>
<span className="">списано: 200</span>
<Bonus className="icon" />
</div> */}
{/* end Бонусы */}
</div>
</div>
{/* end Карточки-статистика по сегментам */}
</div>
</div>
</>
);
};
export default Report;
