import { Fragment, useMemo, useState } from 'react' import Alert from '@mui/material/Alert' import Box from '@mui/material/Box' import Button from '@mui/material/Button' import FormControl from '@mui/material/FormControl' import InputLabel from '@mui/material/InputLabel' import MenuItem from '@mui/material/MenuItem' import Select from '@mui/material/Select' import Stack from '@mui/material/Stack' import Table from '@mui/material/Table' import TableBody from '@mui/material/TableBody' import TableCell from '@mui/material/TableCell' import TableHead from '@mui/material/TableHead' import TableRow from '@mui/material/TableRow' import TextField from '@mui/material/TextField' import Typography from '@mui/material/Typography' import { useQuery } from '@tanstack/react-query' import { fetchAdminOrder, fetchAdminOrders } from '@/entities/order/api/admin-order-api' import { OrderDetailContent } from '@/features/order-detail/ui/OrderDetailContent' import { ORDER_STATUSES } from '@/shared/constants/order' import { formatPriceRub } from '@/shared/lib/format-price' import { groupOrdersByStatus } from '@/shared/lib/group-orders-by-status' import { orderStatusLabelRu } from '@/shared/lib/order-status-labels' import { AdminDialog } from '@/shared/ui/AdminDialog/AdminDialog' export function AdminOrdersPage() { const [q, setQ] = useState('') const [status, setStatus] = useState('') const [deliveryType, setDeliveryType] = useState<'delivery' | 'pickup' | ''>('') const [dialogOpen, setDialogOpen] = useState(false) const [selectedId, setSelectedId] = useState(null) const ordersQuery = useQuery({ queryKey: ['admin', 'orders', { q, status, deliveryType }], queryFn: () => fetchAdminOrders({ q: q.trim() || undefined, status: status || undefined, deliveryType: deliveryType || undefined, }), }) const orderDetailQuery = useQuery({ queryKey: ['admin', 'orders', 'detail', selectedId], queryFn: () => fetchAdminOrder(selectedId!), enabled: Boolean(selectedId), }) const open = (id: string) => { setSelectedId(id) setDialogOpen(true) } const items = useMemo(() => ordersQuery.data?.items ?? [], [ordersQuery.data?.items]) const groupedItems = useMemo( () => groupOrdersByStatus(items, ORDER_STATUSES).map((group) => ({ statusCode: group.status, items: group.items, })), [items], ) const detail = orderDetailQuery.data?.item return ( Заказы Управление заказами доступно пользователю с правами администратора. setQ(e.target.value)} fullWidth /> Статус Способ получения {ordersQuery.isError && Не удалось загрузить заказы.} ID Покупатель Создан Сумма Позиций Действия {groupedItems.map((group) => ( {orderStatusLabelRu(group.statusCode)} ({group.items.length}) {group.items.map((o) => ( {o.id.slice(-8)} {o.user.email} {new Date(o.createdAt).toLocaleString('ru-RU')} {formatPriceRub(o.totalCents)} {o.itemsCount} ))} ))} {ordersQuery.isSuccess && items.length === 0 && ( Заказов пока нет. )}
setDialogOpen(false)} title="Заказ" maxWidth="md" loading={!detail && orderDetailQuery.isLoading} error={orderDetailQuery.isError ? 'Не удалось загрузить заказ.' : null} > {detail && }
) }