+
{filteredFoods.length === 0 ? (
-
+
غذایی یافت نشد
) : (
@@ -115,37 +98,41 @@ const CreateOrderItemsSection: FC
= ({
const inCart = formik.values.items.some(
(item) => item.foodId === food.id
)
+ const cartQty = formik.values.items.find(
+ (item) => item.foodId === food.id
+ )?.quantity
+
return (
{food.images?.[0] ? (

) : (
-
+
)}
-
{food.title}
-
+
{food.title}
+
{formatPrice(getFoodUnitPrice(food))}
)
@@ -154,85 +141,9 @@ const CreateOrderItemsSection: FC
= ({
-
-
سبد سفارش
-
- {selectedItems.length === 0 ? (
-
- هنوز آیتمی انتخاب نشده است
-
- ) : (
-
- {selectedItems.map((item) => {
- if (!item) return null
- const unitPrice = getFoodUnitPrice(item.food)
- return (
-
- {item.food.images?.[0] ? (
-

- ) : (
-
- )}
-
-
-
{item.food.title}
-
- {formatPrice(unitPrice)}
-
-
-
-
-
-
- {formatFaNumber(item.quantity)}
-
-
-
-
-
- {formatPrice(unitPrice * item.quantity)}
-
-
-
-
- )
- })}
-
- )}
-
- {formik.touched.items && formik.errors.items && typeof formik.errors.items === 'string' && (
-
{formik.errors.items}
- )}
-
+ {formik.touched.items && formik.errors.items && typeof formik.errors.items === 'string' && (
+
{formik.errors.items}
+ )}
)
}
diff --git a/src/pages/orders/components/CreateOrderSidebar.tsx b/src/pages/orders/components/CreateOrderSidebar.tsx
index 6b133f0..b3bca76 100644
--- a/src/pages/orders/components/CreateOrderSidebar.tsx
+++ b/src/pages/orders/components/CreateOrderSidebar.tsx
@@ -1,131 +1,361 @@
-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 { ShoppingCart, User } from "iconsax-react";
-import { type FC } from "react";
-import type { CreateOrderFormValues, RestaurantPaymentMethod, RestaurantShipmentMethod } from "../hooks/useCreateOrderForm";
+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;
- total: number;
- totalItems: number;
+ lineItems: Array<{
+ foodId: string
+ title: string
+ image: string
+ quantity: number
+ unitPrice: number
+ totalPrice: number
+ } | null>
+ subTotal: number
+ deliveryFee: number
+ total: number
+ totalItems: number
}
interface CreateOrderSidebarProps {
- formik: FormikProps
;
- orderSummary: OrderSummaryData;
- selectedDeliveryMethod?: RestaurantShipmentMethod;
- selectedPaymentMethod?: RestaurantPaymentMethod;
+ 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 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 methodMap: Record = {
+ [PaymentMethodEnum.Cash]: 'پرداخت نقدی',
+ [PaymentMethodEnum.Online]: 'پرداخت آنلاین',
+ [PaymentMethodEnum.CreditCard]: 'کارت به کارت',
+ [PaymentMethodEnum.Wallet]: 'کیف پول',
+ }
+ return method ? methodMap[method] || method : 'انتخاب نشده'
+}
-const CreateOrderSidebar: FC = ({ formik, orderSummary, selectedDeliveryMethod, selectedPaymentMethod }) => {
- const customerName = [formik.values.firstName, formik.values.lastName].filter(Boolean).join(" ");
+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)
- return (
-
-
-
-
- خلاصه سفارش
-
+ const customerName = [formik.values.firstName, formik.values.lastName].filter(Boolean).join(' ')
+ const deliveryText = getDeliveryMethodText(selectedDeliveryMethod?.method)
+ const paymentText = getPaymentMethodText(selectedPaymentMethod?.method)
-
-
- مشتری
- {customerName || "-"}
-
-
- شماره تماس
- {formik.values.userPhone || "-"}
-
-
- روش تحویل
- {getDeliveryMethodText(selectedDeliveryMethod?.method)}
-
-
- روش پرداخت
- {getPaymentMethodText(selectedPaymentMethod?.method)}
-
-
-
+ const deliveryFeeText =
+ selectedDeliveryMethod && selectedDeliveryMethod.deliveryFee > 0
+ ? formatPrice(selectedDeliveryMethod.deliveryFee)
+ : null
-
-
-
- آیتمها
- {orderSummary.totalItems > 0 && ({formatFaNumber(orderSummary.totalItems)})}
-
+ 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
+ }
- {orderSummary.lineItems.length === 0 ? (
-
سبد خالی است
- ) : (
-
- {orderSummary.lineItems.map((item) => {
- if (!item) return null;
- return (
-
-
-
{item.title}
-
- {formatFaNumber(item.quantity)} × {formatPrice(item.unitPrice)}
+ const extraInfo = getDeliveryExtraInfo()
+ const isDeliverySelected = Boolean(selectedDeliveryMethod)
+ const isPaymentSelected = Boolean(selectedPaymentMethod)
+
+ return (
+ <>
+
+
-
{formatPrice(item.totalPrice)}
+ {orderSummary.totalItems > 0 && (
+
+ {formatFaNumber(orderSummary.totalItems)} آیتم
+
+ )}
- );
- })}
-
- )}
-
-
- جمع آیتمها
- {formatPrice(orderSummary.subTotal)}
-
- {orderSummary.deliveryFee > 0 && (
-
-
هزینه ارسال
-
{formatPrice(orderSummary.deliveryFee)}
+ {(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.quantity > 1
+ ? `${formatFaNumber(item.quantity)} × ${formatPrice(item.unitPrice)}`
+ : formatPrice(item.unitPrice)}
+
+
+
+
+
+
+
+
+ {formatFaNumber(item.quantity)}
+
+
+
+
+
+ {formatPrice(item.totalPrice)}
+
+
+
+ )
+ })}
+
+ )}
+ {orderSummary.lineItems.length > 3 && (
+
+ )}
+
+
+
+
+ جمع آیتمها
+ {formatPrice(orderSummary.subTotal)}
+
+ {orderSummary.deliveryFee > 0 && (
+
+ هزینه ارسال
+ {formatPrice(orderSummary.deliveryFee)}
+
+ )}
+
+ جمع کل
+ {formatPrice(orderSummary.total)}
+
+
+
- )}
-
- جمع کل
- {formatPrice(orderSummary.total)}
-
-
-
-
- );
-};
-export default CreateOrderSidebar;
+
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