import type { ReactNode } from 'react' import { useMemo, useState } from 'react' import Alert from '@mui/material/Alert' import Badge from '@mui/material/Badge' import Box from '@mui/material/Box' import Divider from '@mui/material/Divider' import Drawer from '@mui/material/Drawer' import IconButton from '@mui/material/IconButton' import List from '@mui/material/List' import ListItemButton from '@mui/material/ListItemButton' import ListItemIcon from '@mui/material/ListItemIcon' import ListItemText from '@mui/material/ListItemText' import Stack from '@mui/material/Stack' import { useTheme } from '@mui/material/styles' import Typography from '@mui/material/Typography' import useMediaQuery from '@mui/material/useMediaQuery' import { useQuery } from '@tanstack/react-query' import { useUnit } from 'effector-react' import { MapPin, MessageCircle, Settings, SlidersHorizontal, Truck } from 'lucide-react' import { Navigate, Route, Routes, useLocation, useNavigate } from 'react-router-dom' import { fetchUnreadMessageCount } from '@/entities/user/api/messages-api' import { AddressesPage } from '@/pages/me/ui/sections/AddressesPage' import { MessagesPage } from '@/pages/me/ui/sections/MessagesPage' import { OrderDetailPage } from '@/pages/me/ui/sections/OrderDetailPage' import { OrdersPage } from '@/pages/me/ui/sections/OrdersPage' import { SettingsPage } from '@/pages/me/ui/sections/SettingsPage' import { $user } from '@/shared/model/auth' type NavItem = { to: string label: string icon: ReactNode } export function MeLayoutPage() { const user = useUnit($user) const navigate = useNavigate() const location = useLocation() const theme = useTheme() const isMobile = useMediaQuery(theme.breakpoints.down('md')) const [mobileOpen, setMobileOpen] = useState(false) const unreadQuery = useQuery({ queryKey: ['me', 'messages', 'unread-count'], queryFn: fetchUnreadMessageCount, enabled: Boolean(user), refetchInterval: 45_000, refetchOnWindowFocus: true, }) const unreadMessages = unreadQuery.data?.count ?? 0 const navItems: NavItem[] = useMemo( () => [ { to: '/me/orders', label: 'Заказы', icon: }, { to: '/me/messages', label: 'Сообщения', icon: }, { to: '/me/settings', label: 'Настройки', icon: }, { to: '/me/addresses', label: 'Адреса доставки', icon: }, ], [], ) if (!user) { return Нужно войти. Перейдите на страницу «Вход». } if (user.isAdmin) { return } const activeTo = navItems.find((x) => location.pathname === x.to)?.to ?? navItems.find((x) => location.pathname.startsWith(`${x.to}/`))?.to ?? null const nav = ( Кабинет {user.name?.trim() || user.email} {navItems.map((i) => ( { navigate(i.to) setMobileOpen(false) }} > {i.to === '/me/messages' ? ( 99 ? '99+' : unreadMessages} invisible={unreadMessages === 0} > {i.icon} ) : ( i.icon )} ))} ) return ( {isMobile ? ( <> setMobileOpen(true)} aria-label="Открыть меню кабинета" sx={{ borderRadius: 2, border: 1, borderColor: 'divider', bgcolor: 'background.paper', }} > Профиль setMobileOpen(false)} anchor="right" ModalProps={{ keepMounted: true }} slotProps={{ paper: { sx: { borderTopLeftRadius: 16, borderBottomLeftRadius: 16, borderLeft: 1, borderColor: 'divider', }, }, }} > {nav} ) : ( {nav} )} } /> } /> } /> } /> } /> } /> } /> ) }