// src/App.jsx import { useEffect, useRef } from 'react'; import { BrowserRouter, Routes, Route, useLocation, Navigate } from 'react-router-dom'; import { AuthProvider } from './context/AuthContext'; import { ThemeProvider } from './context/ThemeContext'; import { useAuthContext } from './context/AuthContext'; import { useUnread } from './context/UnreadContext'; import { useUnreadSocket } from './hooks/useUnreadSocket'; import LandingPage from './pages/NakhodkaLanding'; import MainFeed from './pages/MainFeed'; import ChatPage from './pages/ChatPage'; import ChatListPage from './pages/ChatListPage'; import ReviewsPage from './pages/ReviewsPage'; import AdminAdsPage from './pages/AdminAdsPage'; import './styles/chat.css'; function ScrollToTop() { const { pathname } = useLocation(); useEffect(() => { window.scrollTo(0, 0); }, [pathname]); return null; } function UnreadListener() { const { user } = useAuthContext(); const { resetUnread } = useUnread(); const prevUserIdRef = useRef(user?.id); // Сбрасываем накопленный unreadMap при смене пользователя (логин под другим // аккаунтом или логаут → user становится null) — иначе счётчики непрочитанных // от предыдущей сессии останутся висеть в бейдже до первого WS-обновления. useEffect(() => { if (prevUserIdRef.current !== user?.id) { resetUnread(); prevUserIdRef.current = user?.id; } }, [user?.id, resetUnread]); useUnreadSocket(user?.id); return null; } // Защита десктоп-only админ-роутов: доступен только при isAdmin. // Дополнительная проверка на уровне роута — defense in depth к тому, // что пункт меню в Sidebar скрыт для не-админов. function AdminRoute({ children }) { const { isAdmin } = useAuthContext(); if (!isAdmin) return ; return children; } function App() { return ( } /> } /> } /> } /> } /> } /> } /> ); } export default App;