// frontend/src/pages/dashboard/mainpage.tsx import { useState, useEffect, useContext } from 'react'; import { Routes, Route, Link, useNavigate, useLocation } from 'react-router-dom'; import { isAxiosError } from 'axios'; import apiClient from '../../utils/apiClient'; import AuthContext from '../../context/authcontext'; // Импортируем компоненты для вкладок import Summary from './summary'; import TicketsPage from './tickets/index'; import Billing from './billing'; import Settings from './settings'; import NotificationsPage from './notifications'; import CheckVerification from './checkverification'; import Checkout from './checkout'; import StoragePage from './storage'; import StorageBucketPage from './storage-bucket'; import AdminPanel from './admin'; import BlogAdmin from './blogadmin'; import BlogEditor from './blogeditor'; // Новые компоненты для тикетов import TicketDetailPage from './tickets/detail'; import NewTicketPage from './tickets/new'; const Dashboard = () => { const [loading, setLoading] = useState(true); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const navigate = useNavigate(); const location = useLocation(); const { userData, setUserData, logout, refreshUser, isInitialized } = useContext(AuthContext); const [activeTab, setActiveTab] = useState('summary'); // Обновляем активную вкладку при изменении URL useEffect(() => { const path = location.pathname.split('/dashboard/')[1] || ''; const tab = path === '' ? 'summary' : path.split('/')[0]; setActiveTab(tab); }, [location.pathname]); useEffect(() => { const fetchData = async () => { try { const token = localStorage.getItem('access_token'); if (!token) { console.log('Токен не найден, перенаправляем на логин'); logout(); navigate('/login'); return; } await refreshUser(); } catch (err) { console.error('Ошибка загрузки данных:', err); if (isAxiosError(err) && err.response?.status === 401) { logout(); navigate('/login'); } } finally { setLoading(false); } }; fetchData(); }, [logout, navigate]); // Функция для обновления userData из API const updateUserData = async () => { try { const token = localStorage.getItem('access_token'); if (!token) return; const userRes = await apiClient.get('/api/auth/me'); setUserData({ user: userRes.data.user, balance: userRes.data.user.balance ?? 0, tickets: userRes.data.user.tickets ?? [], }); } catch (err) { console.error('Ошибка обновления userData:', err); } }; useEffect(() => { const handleUserDataUpdate = () => { try { updateUserData(); } catch (err) { console.error('Ошибка в обработчике userDataUpdate:', err); } }; window.addEventListener('userDataUpdate', handleUserDataUpdate); return () => { window.removeEventListener('userDataUpdate', handleUserDataUpdate); }; }, []); const isOperator = userData?.user?.operator === 1; const isAdmin = userData?.user?.isAdmin === true; if (!isInitialized || loading) { return (
Загрузка...
); } // Вкладки для сайдбара const tabs = [ { key: 'summary', label: 'Сводка', to: '/dashboard' }, { key: 'storage', label: 'Хранилище', to: '/dashboard/storage' }, { key: 'tickets', label: 'Тикеты', to: '/dashboard/tickets' }, { key: 'billing', label: 'Баланс', to: '/dashboard/billing' }, { key: 'settings', label: 'Настройки', to: '/dashboard/settings' }, { key: 'notifications', label: 'Уведомления', to: '/dashboard/notifications' }, ]; const adminTabs = [ { key: 'checkverification', label: 'Проверка чеков', to: '/dashboard/checkverification' }, ]; const superAdminTabs = [ { key: 'admin', label: 'Админ-панель', to: '/dashboard/admin' }, { key: 'blogadmin', label: 'Блог', to: '/dashboard/blogadmin' }, ]; return (
{/* Mobile Menu Button */} {/* Sidebar - теперь адаптивный */}

Привет, {userData?.user?.username || 'Гость'}!

{isOperator && ( Оператор )} {isAdmin && ( Супер Админ )}
Баланс: ₽{userData?.balance ?? 0}

© 2025 ospab.host

Версия 1.0.0

{/* Overlay для мобильного меню */} {isMobileMenuOpen && (
setIsMobileMenuOpen(false)} /> )} {/* Main Content */}

{tabs.concat(adminTabs).find(t => t.key === activeTab)?.label || 'Панель управления'}

{new Date().toLocaleDateString('ru-RU', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', })}

} /> } /> } /> } /> {userData && ( <> } /> } /> } /> )} {userData && ( } /> )} } /> } /> {isOperator && ( <> } /> )} {isAdmin && ( <> } /> } /> } /> } /> )}
); }; export default Dashboard;