diff --git a/src/components/AgentsBarChart.tsx b/src/components/AgentsBarChart.tsx index ceb795d..d53128d 100644 --- a/src/components/AgentsBarChart.tsx +++ b/src/components/AgentsBarChart.tsx @@ -1,6 +1,7 @@ "use client"; import { ResponsiveContainer, BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, LabelList, Label } from "recharts"; import { useEffect, useState } from "react"; +import Cookies from 'js-cookie'; interface AgentBarData { name: string; @@ -28,7 +29,19 @@ const AgentsBarChart: React.FC = () => { const [error, setError] = useState(null); useEffect(() => { - fetch("/api/dashboard/chart/agent") + const token = Cookies.get("access_token"); + if (!token) { + console.warn("Токен авторизации не найден."); + setError("Токен авторизации не найден."); + setLoading(false); + return; + } + + fetch("/api/dashboard/chart/agent", { + headers: { + 'Authorization': `Bearer ${token}` + } + }) .then((res) => { if (!res.ok) throw new Error("Ошибка загрузки данных"); return res.json(); diff --git a/src/components/AgentsTable.tsx b/src/components/AgentsTable.tsx index 28c291e..bf0875f 100644 --- a/src/components/AgentsTable.tsx +++ b/src/components/AgentsTable.tsx @@ -4,6 +4,7 @@ import styles from "../styles/stat.module.css"; import { Box, Button } from '@mui/material'; import FileDownloadIcon from '@mui/icons-material/FileDownload'; import { mkConfig, generateCsv, download } from 'export-to-csv'; +import Cookies from 'js-cookie'; function formatCurrency(amount: number) { return amount?.toLocaleString("ru-RU", { @@ -20,7 +21,19 @@ export default function AgentsTable({ filters, reloadKey }: { filters: { dateSta const params = new URLSearchParams(); if (filters.dateStart) params.append('date_start', filters.dateStart); if (filters.dateEnd) params.append('date_end', filters.dateEnd); - fetch(`/api/stat/agents?${params.toString()}`) + + const token = Cookies.get("access_token"); + if (!token) { + console.warn("Токен авторизации не найден."); + setData([]); // Очистить данные, если токен отсутствует + return; + } + + fetch(`/api/stat/agents?${params.toString()}`, { + headers: { + 'Authorization': `Bearer ${token}` + } + }) .then(res => res.json()) .then(setData) .catch(() => setData([])); diff --git a/src/components/BillingMetricCards.tsx b/src/components/BillingMetricCards.tsx index fe6ed44..24b0e75 100644 --- a/src/components/BillingMetricCards.tsx +++ b/src/components/BillingMetricCards.tsx @@ -1,6 +1,7 @@ import MetricCard from "./MetricCard"; import styles from "../styles/billing.module.css"; import React, { useEffect, useState } from "react"; +import Cookies from 'js-cookie'; interface BillingCardsData { cost: number; @@ -22,7 +23,19 @@ const BillingMetricCards: React.FC = () => { } useEffect(() => { - fetch("/api/billing/cards") + const token = Cookies.get("access_token"); + if (!token) { + console.warn("Токен авторизации не найден."); + setError("Токен авторизации не найден."); + setLoading(false); + return; + } + + fetch("/api/billing/cards", { + headers: { + 'Authorization': `Bearer ${token}` + } + }) .then((res) => { if (!res.ok) throw new Error("Ошибка загрузки данных"); return res.json(); diff --git a/src/components/BillingPieChart.tsx b/src/components/BillingPieChart.tsx index 63d5b05..942591c 100644 --- a/src/components/BillingPieChart.tsx +++ b/src/components/BillingPieChart.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useState } from "react"; import { PieChart, Pie, Cell, Tooltip, ResponsiveContainer } from "recharts"; import styles from "../styles/billing.module.css"; +import Cookies from 'js-cookie'; const STATUS_COLORS: Record = { "done": "#10B981", @@ -15,7 +16,17 @@ const STATUS_COLORS: Record = { const BillingPieChart: React.FC = () => { const [data, setData] = useState<{ name: string; value: number; fill: string }[]>([]); useEffect(() => { - fetch("/api/billing/chart/pie") + const token = Cookies.get("access_token"); + if (!token) { + console.warn("Токен авторизации не найден."); + return; + } + + fetch("/api/billing/chart/pie", { + headers: { + 'Authorization': `Bearer ${token}` + } + }) .then((res) => res.json()) .then((apiData) => { const mapped = apiData.map((item: { status: string; count: number }) => ({ diff --git a/src/components/BillingStatChart.tsx b/src/components/BillingStatChart.tsx index f1d5bcf..188ec11 100644 --- a/src/components/BillingStatChart.tsx +++ b/src/components/BillingStatChart.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from "react"; import styles from "../styles/billing.module.css"; import { TooltipProps } from "recharts"; import { ValueType, NameType } from "recharts/types/component/DefaultTooltipContent"; +import Cookies from 'js-cookie'; const statusColors: Record = { done: "#10B981", @@ -19,7 +20,17 @@ const BillingStatChart: React.FC = () => { const [statuses, setStatuses] = useState([]); useEffect(() => { - fetch("/api/billing/chart/stat") + const token = Cookies.get("access_token"); + if (!token) { + console.warn("Токен авторизации не найден."); + return; + } + + fetch("/api/billing/chart/stat", { + headers: { + 'Authorization': `Bearer ${token}` + } + }) .then(res => res.json()) .then((apiData) => { // Собираем все уникальные даты и статусы diff --git a/src/components/MetricCards.tsx b/src/components/MetricCards.tsx index 6d548d3..128aac9 100644 --- a/src/components/MetricCards.tsx +++ b/src/components/MetricCards.tsx @@ -2,6 +2,7 @@ import MetricCard from "./MetricCard"; import styles from "../styles/dashboard.module.css"; import React, { useEffect, useState } from "react"; +import Cookies from 'js-cookie'; function formatCurrency(amount: number) { return amount.toLocaleString("ru-RU", { @@ -25,7 +26,19 @@ export default function MetricCards() { const [error, setError] = useState(null); useEffect(() => { - fetch("/api/dashboard/cards") + const token = Cookies.get("access_token"); + if (!token) { + console.warn("Токен авторизации не найден."); + setError("Токен авторизации не найден."); + setLoading(false); + return; + } + + fetch("/api/dashboard/cards", { + headers: { + 'Authorization': `Bearer ${token}` + } + }) .then((res) => { if (!res.ok) throw new Error("Ошибка загрузки данных"); return res.json(); diff --git a/src/components/PayoutsTransactionsTable.tsx b/src/components/PayoutsTransactionsTable.tsx index ab7844c..8b14f06 100644 --- a/src/components/PayoutsTransactionsTable.tsx +++ b/src/components/PayoutsTransactionsTable.tsx @@ -4,6 +4,7 @@ import styles from "../styles/billing.module.css"; import { Box, Button } from '@mui/material'; import FileDownloadIcon from '@mui/icons-material/FileDownload'; import { mkConfig, generateCsv, download } from 'export-to-csv'; +import Cookies from 'js-cookie'; function formatCurrency(amount: number) { @@ -29,7 +30,19 @@ export default function PayoutsTransactionsTable({ filters, reloadKey }: { filte const params = new URLSearchParams(); if (filters.dateStart) params.append('date_start', filters.dateStart); if (filters.dateEnd) params.append('date_end', filters.dateEnd); - fetch(`/api/billing/payouts/transactions?${params.toString()}`) + + const token = Cookies.get("access_token"); + if (!token) { + console.warn("Токен авторизации не найден."); + setData([]); // Очистить данные, если токен отсутствует + return; + } + + fetch(`/api/billing/payouts/transactions?${params.toString()}`, { + headers: { + 'Authorization': `Bearer ${token}` + } + }) .then(res => res.json()) .then(setData) .catch(() => setData([])); diff --git a/src/components/ReferralsTable.tsx b/src/components/ReferralsTable.tsx index d70e67e..1ba5e9d 100644 --- a/src/components/ReferralsTable.tsx +++ b/src/components/ReferralsTable.tsx @@ -4,6 +4,7 @@ import styles from "../styles/stat.module.css"; import { Box, Button } from '@mui/material'; import FileDownloadIcon from '@mui/icons-material/FileDownload'; import { mkConfig, generateCsv, download } from 'export-to-csv'; +import Cookies from 'js-cookie'; function formatCurrency(amount: number) { return amount?.toLocaleString("ru-RU", { @@ -20,7 +21,19 @@ export default function ReferralsTable({ filters, reloadKey }: { filters: { date const params = new URLSearchParams(); if (filters.dateStart) params.append('date_start', filters.dateStart); if (filters.dateEnd) params.append('date_end', filters.dateEnd); - fetch(`/api/stat/referrals?${params.toString()}`) + + const token = Cookies.get("access_token"); + if (!token) { + console.warn("Токен авторизации не найден."); + setData([]); // Очистить данные, если токен отсутствует + return; + } + + fetch(`/api/stat/referrals?${params.toString()}`, { + headers: { + 'Authorization': `Bearer ${token}` + } + }) .then(res => res.json()) .then(setData) .catch(() => setData([])); diff --git a/src/components/RevenueChart.tsx b/src/components/RevenueChart.tsx index 4f8962e..e2930cf 100644 --- a/src/components/RevenueChart.tsx +++ b/src/components/RevenueChart.tsx @@ -1,6 +1,7 @@ "use client"; import { ResponsiveContainer, LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Label } from "recharts"; import { useEffect, useState } from "react"; +import Cookies from 'js-cookie'; const formatCurrency = (amount: number) => { return amount.toLocaleString("ru-RU", { @@ -22,7 +23,19 @@ const RevenueChart: React.FC = () => { const [error, setError] = useState(null); useEffect(() => { - fetch("/api/dashboard/chart/total") + const token = Cookies.get("access_token"); + if (!token) { + console.warn("Токен авторизации не найден."); + setError("Токен авторизации не найден."); + setLoading(false); + return; + } + + fetch("/api/dashboard/chart/total", { + headers: { + 'Authorization': `Bearer ${token}` + } + }) .then((res) => { if (!res.ok) throw new Error("Ошибка загрузки данных"); return res.json(); diff --git a/src/components/SalesTable.tsx b/src/components/SalesTable.tsx index 5a070e9..4d71306 100644 --- a/src/components/SalesTable.tsx +++ b/src/components/SalesTable.tsx @@ -4,6 +4,7 @@ import styles from "../styles/stat.module.css"; import { Box, Button } from '@mui/material'; import FileDownloadIcon from '@mui/icons-material/FileDownload'; import { mkConfig, generateCsv, download } from 'export-to-csv'; +import Cookies from 'js-cookie'; function formatCurrency(amount: number) { return amount?.toLocaleString("ru-RU", { @@ -20,7 +21,19 @@ export default function SalesTable({ filters, reloadKey }: { filters: { dateStar const params = new URLSearchParams(); if (filters.dateStart) params.append('date_start', filters.dateStart); if (filters.dateEnd) params.append('date_end', filters.dateEnd); - fetch(`/api/stat/sales?${params.toString()}`) + + const token = Cookies.get("access_token"); + if (!token) { + console.warn("Токен авторизации не найден."); + setData([]); // Очистить данные, если токен отсутствует + return; + } + + fetch(`/api/stat/sales?${params.toString()}`, { + headers: { + 'Authorization': `Bearer ${token}` + } + }) .then(res => res.json()) .then(setData) .catch(() => setData([]));