import { formatFaNumber, formatPrice } from '@/helpers/func' import { PaymentMethodEnum } from '@/pages/paymentMethods/enum/Enum' import { DeliveryMethodEnum } from '@/pages/shipmentMethod/enum/Enum' import type { FormikProps } from 'formik' import { Add, ArrowLeft2, Car, Location, Minus, Moneys, ShoppingCart, Trash, Truck, } from 'iconsax-react' import { type FC, useState } from 'react' import type { CreateOrderFormValues, RestaurantPaymentMethod, RestaurantShipmentMethod } from '../hooks/useCreateOrderForm' import type { UserSavedAddress } from '@/pages/customers/types/Types' import CreateOrderDeliveryModal from './CreateOrderDeliveryModal' interface OrderSummaryData { lineItems: Array<{ foodId: string title: string image: string quantity: number unitPrice: number totalPrice: number } | null> subTotal: number deliveryFee: number packingFee: number discountAmount: number total: number totalItems: number } interface CreateOrderSidebarProps { formik: FormikProps orderSummary: OrderSummaryData deliveryMethods: RestaurantShipmentMethod[] cashPaymentMethod?: RestaurantPaymentMethod selectedDeliveryMethod?: RestaurantShipmentMethod selectedPaymentMethod?: RestaurantPaymentMethod isCourierDelivery: boolean isCarDelivery: boolean isDineIn: boolean customerAddresses: UserSavedAddress[] selectedAddressId: string | null onSelectSavedAddress: (address: UserSavedAddress) => void onSelectManualAddress: () => void onAddressFieldChange: (e: React.ChangeEvent) => void onLocationSelect: (lat: number, lng: number) => void onUpdateQuantity: (foodId: string, quantity: number) => void onRemoveItem: (foodId: string) => void } const getDeliveryMethodText = (method?: string): string => { const methodMap: Record = { [DeliveryMethodEnum.DineIn]: 'سرو در رستوران', [DeliveryMethodEnum.CustomerPickup]: 'دریافت از محل', [DeliveryMethodEnum.DeliveryCar]: 'تحویل به خودرو', [DeliveryMethodEnum.DeliveryCourier]: 'بیرون‌بر', } return method ? methodMap[method] || method : 'انتخاب نشده' } const getPaymentMethodText = (method?: string): string => { const methodMap: Record = { [PaymentMethodEnum.Cash]: 'پرداخت نقدی', [PaymentMethodEnum.Online]: 'پرداخت آنلاین', [PaymentMethodEnum.CreditCard]: 'کارت به کارت', [PaymentMethodEnum.Wallet]: 'کیف پول', } return method ? methodMap[method] || method : 'انتخاب نشده' } const CreateOrderSidebar: FC = ({ formik, orderSummary, deliveryMethods, cashPaymentMethod, selectedDeliveryMethod, selectedPaymentMethod, isCourierDelivery, isCarDelivery, isDineIn, customerAddresses, selectedAddressId, onSelectSavedAddress, onSelectManualAddress, onAddressFieldChange, onLocationSelect, onUpdateQuantity, onRemoveItem, }) => { const [isDeliveryModalOpen, setIsDeliveryModalOpen] = useState(false) const customerName = [formik.values.firstName, formik.values.lastName].filter(Boolean).join(' ') const deliveryText = getDeliveryMethodText(selectedDeliveryMethod?.method) const paymentText = getPaymentMethodText(selectedPaymentMethod?.method) const deliveryFeeText = selectedDeliveryMethod && selectedDeliveryMethod.deliveryFee > 0 ? formatPrice(selectedDeliveryMethod.deliveryFee) : null const getDeliveryExtraInfo = (): { text: string; warning?: boolean } | null => { if (isCourierDelivery) { const address = formik.values.userAddress.address?.trim() if (!address) return { text: 'آدرس تحویل ثبت نشده', warning: true } return { text: address } } if (isCarDelivery) { const { carModel, plateNumber } = formik.values.carAddress if (!carModel && !plateNumber) return { text: 'اطلاعات خودرو وارد نشده', warning: true } return { text: [carModel, plateNumber].filter(Boolean).join(' · ') } } if (isDineIn && formik.values.tableNumber) { return { text: `میز ${formik.values.tableNumber}` } } if (formik.values.description?.trim()) { return { text: formik.values.description } } return null } const extraInfo = getDeliveryExtraInfo() const isDeliverySelected = Boolean(selectedDeliveryMethod) const isPaymentSelected = Boolean(selectedPaymentMethod) return ( <>
خلاصه سفارش
{orderSummary.totalItems > 0 && ( {formatFaNumber(orderSummary.totalItems)} آیتم )}
{(customerName || formik.values.userPhone) && (
{customerName || 'مشتری'}
{formik.values.userPhone && (
{formik.values.userPhone}
)}
)}
سبد سفارش
{orderSummary.lineItems.length === 0 ? (
هنوز آیتمی انتخاب نشده
) : (
{orderSummary.lineItems.map((item) => { if (!item) return null return (
{item.image ? ( {item.title} ) : (
)}
{item.title}
{item.quantity > 1 ? `${formatFaNumber(item.quantity)} × ${formatPrice(item.unitPrice)}` : formatPrice(item.unitPrice)}
{formatFaNumber(item.quantity)}
{formatPrice(item.totalPrice)}
) })}
)} {orderSummary.lineItems.length > 3 && (
)}
هزینه بسته‌بندی (اختیاری)
formik.setFieldValue( 'packingFee', Math.max(Number(e.target.value) || 0, 0) ) } />
تخفیف مبلغی (اختیاری)
formik.setFieldValue( 'discountAmount', Math.max(Number(e.target.value) || 0, 0) ) } />
جمع آیتم‌ها {formatPrice(orderSummary.subTotal)}
{orderSummary.deliveryFee > 0 && (
هزینه ارسال {formatPrice(orderSummary.deliveryFee)}
)} {orderSummary.packingFee > 0 && (
هزینه بسته‌بندی {formatPrice(orderSummary.packingFee)}
)} {orderSummary.discountAmount > 0 && (
تخفیف -{formatPrice(orderSummary.discountAmount)}
)}
جمع کل {formatPrice(orderSummary.total)}
setIsDeliveryModalOpen(false)} formik={formik} deliveryMethods={deliveryMethods} cashPaymentMethod={cashPaymentMethod} isCourierDelivery={isCourierDelivery} isCarDelivery={isCarDelivery} isDineIn={isDineIn} customerAddresses={customerAddresses} selectedAddressId={selectedAddressId} onSelectSavedAddress={onSelectSavedAddress} onSelectManualAddress={onSelectManualAddress} onAddressFieldChange={onAddressFieldChange} onLocationSelect={onLocationSelect} /> ) } export default CreateOrderSidebar