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 Dialog from '@mui/material/Dialog' import DialogActions from '@mui/material/DialogActions' import DialogContent from '@mui/material/DialogContent' import DialogTitle from '@mui/material/DialogTitle' 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 { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { fetchAdminOrder, fetchAdminOrders, postAdminOrderMessage, setAdminOrderStatus, } from '@/entities/order/api/admin-order-api' import { ORDER_STATUSES, getAdminNextOrderStatuses } from '@/shared/constants/order' import { formatPriceRub } from '@/shared/lib/format-price' import { groupOrdersByStatus } from '@/shared/lib/group-orders-by-status' import { invalidateQueryKeys } from '@/shared/lib/invalidate-query-keys' import { orderStatusLabelRu } from '@/shared/lib/order-status-labels' import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent' import { RichTextMessageEditor } from '@/shared/ui/RichTextMessageEditor' export function AdminOrdersPage() { const qc = useQueryClient() 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 [msg, setMsg] = useState('') 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 statusMut = useMutation({ mutationFn: (next: string) => setAdminOrderStatus(selectedId!, next), onSuccess: async () => { await invalidateQueryKeys(qc, [ ['admin', 'orders'], ['admin', 'orders', 'detail'], ['admin', 'orders', 'summary'], ]) }, }) const msgMut = useMutation({ mutationFn: () => postAdminOrderMessage(selectedId!, msg.trim()), onSuccess: async () => { setMsg('') await invalidateQueryKeys(qc, [['admin', 'orders', 'detail']]) }, }) 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 const canSendMessage = msg.replace(/<[^>]*>/g, ' ').trim().length > 0 const nextStatuses = useMemo(() => { if (!detail) return [] return getAdminNextOrderStatuses(detail.status, detail.deliveryType ?? 'delivery') }, [detail]) 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)} fullWidth maxWidth="md"> Заказ {!detail && orderDetailQuery.isLoading && Загрузка…} {orderDetailQuery.isError && Не удалось загрузить заказ.} {detail && ( #{detail.id.slice(-8)} · {detail.user.email} · {orderStatusLabelRu(detail.status)} ·{' '} {formatPriceRub(detail.totalCents)} Сменить статус Сообщения {detail.messages.map((m) => ( {m.authorType === 'admin' ? 'Админ (вы)' : 'Пользователь'} ·{' '} {new Date(m.createdAt).toLocaleString()} ))} {detail.messages.length === 0 && Нет сообщений.} )}
) }