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}
)}
} />
} />
} />
} />
} />
} />
} />
)
}