From 8951edbc9b4bdba1366da5c31dc0995aaa56f2cd Mon Sep 17 00:00:00 2001 From: romantarkin Date: Sat, 2 Aug 2025 16:39:09 +0500 Subject: [PATCH] dashboard --- frontend/src/App.js | 105 ++++++++- frontend/src/components/MainLayout.js | 45 ++++ frontend/src/components/SideMenu.js | 33 +++ frontend/src/pages/Dashboard.js | 310 ++++++++++++++++++++++--- frontend/src/styles/Common.module.css | 312 ++++++++++++++++++++++++++ 5 files changed, 768 insertions(+), 37 deletions(-) create mode 100644 frontend/src/components/MainLayout.js diff --git a/frontend/src/App.js b/frontend/src/App.js index 5ce65bd..4443f9a 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -2,6 +2,14 @@ import React from 'react'; import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; import Login from './pages/Login'; import Dashboard from './pages/Dashboard'; +import UsersPage from './pages/UsersPage'; +import SmtpServersPage from './pages/SmtpServersPage'; +import EmailTemplatesPage from './pages/EmailTemplatesPage'; +import UnsubscribedPage from './pages/UnsubscribedPage'; +import GroupsPage from './pages/GroupsPage'; +import DeliveryHistoryPage from './pages/DeliveryHistoryPage'; +import CampaignPage from './pages/CampaignPage'; +import MainLayout from './components/MainLayout'; import './App.css'; import { useUser } from './context/UserContext'; @@ -18,8 +26,101 @@ function App() { } /> : } /> - } /> + element={ + user && token ? ( + + + + ) : ( + + ) + } + /> + + + + ) : ( + + ) + } + /> + + + + ) : ( + + ) + } + /> + + + + ) : ( + + ) + } + /> + + + + ) : ( + + ) + } + /> + + + + ) : ( + + ) + } + /> + + + + ) : ( + + ) + } + /> + + + + ) : ( + + ) + } + /> + } /> ); diff --git a/frontend/src/components/MainLayout.js b/frontend/src/components/MainLayout.js new file mode 100644 index 0000000..3c491ac --- /dev/null +++ b/frontend/src/components/MainLayout.js @@ -0,0 +1,45 @@ +import React, { useState, useEffect } from 'react'; +import { useLocation } from 'react-router-dom'; +import SideMenu from './SideMenu'; +import Header from './Header'; +import { useUser } from '../context/UserContext'; +import styles from '../styles/Common.module.css'; + +const MainLayout = ({ children }) => { + const [active, setActive] = useState('dashboard'); + const { user, logout } = useUser(); + const location = useLocation(); + + // Определяем активный пункт меню на основе текущего URL + useEffect(() => { + const path = location.pathname; + if (path === '/dashboard') setActive('dashboard'); + else if (path === '/users') setActive('users'); + else if (path === '/smtp') setActive('smtp'); + else if (path === '/template') setActive('template'); + else if (path === '/unsubscribed') setActive('unsubscribed'); + else if (path === '/groups') setActive('groups'); + else if (path === '/history') setActive('history'); + else if (path === '/campaign') setActive('campaign'); + else setActive('dashboard'); + }, [location.pathname]); + + const handleLogout = () => { + logout(); + window.location.href = '/login'; + }; + + return ( +
+ +
+
+
+ {children} +
+
+
+ ); +}; + +export default MainLayout; \ No newline at end of file diff --git a/frontend/src/components/SideMenu.js b/frontend/src/components/SideMenu.js index 85f8dd6..e300122 100644 --- a/frontend/src/components/SideMenu.js +++ b/frontend/src/components/SideMenu.js @@ -1,12 +1,44 @@ import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; import styles from './SideMenu.module.css'; const SideMenu = ({ active, onSelect }) => { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); + const navigate = useNavigate(); const handleMenuSelect = (menuItem) => { onSelect(menuItem); setIsMobileMenuOpen(false); + + // Навигация по URL + switch (menuItem) { + case 'dashboard': + navigate('/dashboard'); + break; + case 'users': + navigate('/users'); + break; + case 'smtp': + navigate('/smtp'); + break; + case 'template': + navigate('/template'); + break; + case 'unsubscribed': + navigate('/unsubscribed'); + break; + case 'groups': + navigate('/groups'); + break; + case 'history': + navigate('/history'); + break; + case 'campaign': + navigate('/campaign'); + break; + default: + navigate('/dashboard'); + } }; const toggleMobileMenu = () => { @@ -40,6 +72,7 @@ const SideMenu = ({ active, onSelect }) => {