import type { ReactNode } from 'react' import { useMemo, useState } from 'react' 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 { Bell, Image, LayoutGrid, ListOrdered, MessageSquare, Store, Users } from 'lucide-react' import { Navigate, Route, Routes, useLocation, useNavigate } from 'react-router-dom' import { fetchAdminOrdersSummary } from '@/entities/order/api/admin-order-api' import { AdminCategoriesPage } from '@/pages/admin-categories' import { AdminGalleryPage } from '@/pages/admin-gallery' import { AdminOrdersPage } from '@/pages/admin-orders' import { AdminProductsPage } from '@/pages/admin-products' import { AdminReviewsPage } from '@/pages/admin-reviews' import { AdminUsersPage } from '@/pages/admin-users' import { $user } from '@/shared/model/auth' import { AdminNotificationsPage } from './AdminNotificationsPage' type NavItem = { to: string label: string icon: ReactNode } export function AdminLayoutPage() { const navigate = useNavigate() const location = useLocation() const theme = useTheme() const isMobile = useMediaQuery(theme.breakpoints.down('md')) const [mobileOpen, setMobileOpen] = useState(false) const user = useUnit($user) const isAdmin = Boolean(user?.isAdmin) const ordersSummaryQuery = useQuery({ queryKey: ['admin', 'orders', 'summary'], queryFn: fetchAdminOrdersSummary, enabled: isAdmin, refetchInterval: 45_000, refetchOnWindowFocus: true, }) const newOrdersAttention = ordersSummaryQuery.data?.attentionCount ?? 0 const navItems: NavItem[] = useMemo( () => [ { to: '/admin', label: 'Товары', icon: }, { to: '/admin/categories', label: 'Категории', icon: }, { to: '/admin/gallery', label: 'Галерея', icon: }, { to: '/admin/orders', label: 'Заказы', icon: }, { to: '/admin/reviews', label: 'Отзывы', icon: }, { to: '/admin/users', label: 'Пользователи', icon: }, { to: '/admin/notifications', label: 'Оповещения', icon: }, ], [], ) if (!isAdmin) { return } const activeTo = navItems.find((x) => location.pathname === x.to)?.to ?? navItems.find((x) => location.pathname.startsWith(`${x.to}/`))?.to ?? null const nav = ( Админка Управление магазином {navItems.map((i) => ( { navigate(i.to) setMobileOpen(false) }} > {i.to === '/admin/orders' ? ( {i.icon} ) : ( i.icon )} ))} ) return ( {isMobile ? ( <> setMobileOpen(true)} aria-label="Открыть панель админки" sx={{ borderRadius: 2, border: 1, borderColor: 'warning.300', bgcolor: 'warning.50', }} > Админка setMobileOpen(false)} anchor="right" ModalProps={{ keepMounted: true }} slotProps={{ paper: { sx: { borderTopLeftRadius: 16, borderBottomLeftRadius: 16, borderLeft: 1, borderColor: 'divider', }, }, }} > {nav} ) : ( {nav} )} } /> } /> } /> } /> } /> } /> } /> } /> ) }