diff --git a/src/pages/orders/Details.tsx b/src/pages/orders/Details.tsx index 7c3c654..867b0ff 100644 --- a/src/pages/orders/Details.tsx +++ b/src/pages/orders/Details.tsx @@ -1,11 +1,16 @@ import Select from '@/components/Select' import Table from '@/components/Table' import { Location } from 'iconsax-react' -import { type FC } from 'react' +import { type FC, useMemo } from 'react' import type { ColumnType, RowDataType } from '@/components/types/TableTypes' -import AppImage from '@/assets/images/appimage.png' +import { useGetOrderById } from './hooks/useGetOrders' +import { useParams } from 'react-router-dom' +import { useTranslation } from 'react-i18next' +import { formatPrice, formatOptionalDate, formatFaNumber } from '@/helpers/func' +import { OrderStatus, PaymentStatusEnum } from './enum/Enum' +import type { OrderItem as OrderItemType } from './types/Types' -interface OrderItem extends RowDataType { +interface OrderItemTable extends RowDataType { image: string title: string quantity: number @@ -13,27 +18,104 @@ interface OrderItem extends RowDataType { } const OrderDetails: FC = () => { - const orderItems: OrderItem[] = [ - { - id: 1, - image: AppImage, - title: 'پیتزا پپرونی', - quantity: 1, - amount: '۴۲,۰۰۰ تومان' - } - ] + const { id } = useParams() + const { data: orderData, isLoading } = useGetOrderById(id!) + const { t } = useTranslation('global') - const columns: ColumnType[] = [ + const order = orderData?.data + + const statusItems = useMemo(() => { + const statuses: string[] = [ + OrderStatus.Pending, + OrderStatus.Confirmed, + OrderStatus.Preparing, + OrderStatus.RejectedByRestaurant, + OrderStatus.CancelledByUser, + OrderStatus.CancelledBySystem, + OrderStatus.ReadyForCustomerPickup, + OrderStatus.ReadyForDineIn, + OrderStatus.ReadyForDeliveryCar, + OrderStatus.ReadyForDeliveryCourier, + OrderStatus.Delivered, + ] + return statuses.map((status) => ({ + value: status, + label: t(`order_status.${status}`) + })) + }, [t]) + + const getStatusColor = (status: string): string => { + const colorMap: Record = { + 'pending': '#FFEECC', + 'confirmed': '#E3F2FD', + 'preparing': '#FFF3E0', + 'rejectedByRestaurant': '#FFEBEE', + 'cancelledByUser': '#FFEBEE', + 'cancelledBySystem': '#FFEBEE', + 'readyForCustomerPickup': '#E3F2FD', + 'readyForDineIn': '#E3F2FD', + 'readyForDeliveryCar': '#E3F2FD', + 'readyForDeliveryCourier': '#E3F2FD', + 'delivered': '#E8F5E9', + } + return colorMap[status] || '#FFEECC' + } + + const getPaymentStatusColor = (status: string): string => { + const colorMap: Record = { + [PaymentStatusEnum.Paid]: 'bg-green-500', + [PaymentStatusEnum.Pending]: 'bg-yellow-500', + [PaymentStatusEnum.Failed]: 'bg-red-500', + } + return colorMap[status] || 'bg-gray-500' + } + + const getPaymentStatusTextColor = (status: string): string => { + const colorMap: Record = { + [PaymentStatusEnum.Paid]: 'text-green-500', + [PaymentStatusEnum.Pending]: 'text-yellow-500', + [PaymentStatusEnum.Failed]: 'text-red-500', + } + return colorMap[status] || 'text-gray-500' + } + + const getPaymentStatusText = (status: string): string => { + const textMap: Record = { + [PaymentStatusEnum.Paid]: 'پرداخت شده', + [PaymentStatusEnum.Pending]: 'در انتظار پرداخت', + [PaymentStatusEnum.Failed]: 'پرداخت ناموفق', + } + return textMap[status] || status + } + + const orderItems: OrderItemTable[] = useMemo(() => { + if (!order?.items) return [] + return order.items.map((item: OrderItemType) => ({ + id: item.id, + image: item.food?.images?.[0] || '', + title: item.food?.title || '-', + quantity: item.quantity, + amount: formatPrice(item.totalPrice) + })) + }, [order]) + + const columns: ColumnType[] = [ { title: 'تصویر', key: 'image', render: (item) => ( -
- {item.title} +
+ {item.image ? ( + {item.title} + ) : ( +
+ بدون تصویر +
+ )}
) }, @@ -45,7 +127,8 @@ const OrderDetails: FC = () => { { title: 'تعداد', key: 'quantity', - align: 'center' + align: 'center', + render: (item) => formatFaNumber(item.quantity) }, { title: 'مبلغ', @@ -53,15 +136,39 @@ const OrderDetails: FC = () => { align: 'right' } ] + + if (isLoading) { + return ( +
+
در حال بارگذاری...
+
+ ) + } + + if (!order) { + return ( +
+
سفارش یافت نشد
+
+ ) + } + + const customerName = [order.user?.firstName, order.user?.lastName].filter(Boolean).join(' ') || '-' + const address = order.address ? `${order.address.city || ''} - ${order.address.address || ''}`.trim() : '-' + return (
-

سفارش ۱۲۳۴۵

+

+ سفارش {formatFaNumber(order.orderNumber)} +