// 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;