From 2a5905b35f57ca561b6d3fd8aadfbc5545edb74d Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Mon, 29 Jun 2026 09:39:15 +0330 Subject: [PATCH] variable item and confrim + ... --- src/langs/fa.json | 3 +- src/pages/orders/Details.tsx | 16 ++- src/pages/orders/components/OrderActions.tsx | 20 +++- .../orders/components/OrderItemsDetails.tsx | 110 +++++++++++++++++- src/pages/orders/enum/Enum.ts | 1 + src/pages/orders/hooks/useOrderData.ts | 13 +++ src/pages/orders/service/OrderService.ts | 8 ++ 7 files changed, 164 insertions(+), 7 deletions(-) diff --git a/src/langs/fa.json b/src/langs/fa.json index 380a1f3..4f5d690 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -855,7 +855,8 @@ "canceled": "لغو شده", "deliveredToWaiter": "تحویل به گارسون", "deliveredToReceptionist": "تحویل به پیشخوان", - "deliveredToRecepient": "تحویل به گیرنده" + "deliveredToRecepient": "تحویل به گیرنده", + "needConfirmation": "در انتظار تایید فروشگاه" }, "reviews": { "reviews": "نظرات", diff --git a/src/pages/orders/Details.tsx b/src/pages/orders/Details.tsx index 59f6c8d..2afc29a 100644 --- a/src/pages/orders/Details.tsx +++ b/src/pages/orders/Details.tsx @@ -88,6 +88,7 @@ const OrderDetails: FC = () => { // منطق نمایش دکمه‌ها const isCashPayment = order.paymentMethod?.method === PaymentMethodEnum.Cash + const isNeedConfirmation = order.status === OrderStatus.NEED_CONFIRMATION const isPendingPayment = order.status === OrderStatus.PENDING_PAYMENT const isOrderPaid = order.status === OrderStatus.PAID const isPreparing = order.status === OrderStatus.PREPARING @@ -159,6 +160,17 @@ const OrderDetails: FC = () => { }) } + const handleConfirmQuantities = () => { + changeOrderStatus({ + orderId: order.id, + status: OrderStatus.PENDING_PAYMENT + }, { + onError: (error) => { + toast.error(extractErrorMessage(error)) + } + }) + } + const handleCancelOrder = (description?: string) => { changeOrderStatus({ orderId: order.id, @@ -205,7 +217,7 @@ const OrderDetails: FC = () => {
- +
@@ -223,6 +235,7 @@ const OrderDetails: FC = () => { isCourierDelivery={isCourierDelivery} isCustomerPickup={isCustomerPickup} isCanceled={isCanceled} + isNeedConfirmation={isNeedConfirmation} isVerifyingPayment={isVerifyingPayment} isChangingStatus={isChangingStatus} onVerifyCashPayment={handleVerifyCashPayment} @@ -230,6 +243,7 @@ const OrderDetails: FC = () => { onDeliverToCourier={handleDeliverToCourier} onDeliverToReceptionist={handleDeliverToReceptionist} onCancelOrder={() => setShowCancelModal(true)} + onConfirmQuantities={handleConfirmQuantities} />
diff --git a/src/pages/orders/components/OrderActions.tsx b/src/pages/orders/components/OrderActions.tsx index 21cd4b4..320567b 100644 --- a/src/pages/orders/components/OrderActions.tsx +++ b/src/pages/orders/components/OrderActions.tsx @@ -9,6 +9,7 @@ interface OrderActionsProps { isCourierDelivery: boolean isCustomerPickup: boolean isCanceled: boolean + isNeedConfirmation: boolean isVerifyingPayment: boolean isChangingStatus: boolean onVerifyCashPayment: () => void @@ -16,6 +17,7 @@ interface OrderActionsProps { onDeliverToCourier: () => void onDeliverToReceptionist: () => void onCancelOrder: () => void + onConfirmQuantities: () => void } const OrderActions: FC = ({ @@ -26,13 +28,15 @@ const OrderActions: FC = ({ isCourierDelivery, isCustomerPickup, isCanceled, + isNeedConfirmation, isVerifyingPayment, isChangingStatus, onVerifyCashPayment, onSendToKitchen, onDeliverToCourier, onDeliverToReceptionist, - onCancelOrder + onCancelOrder, + onConfirmQuantities }) => { const [loadingAction, setLoadingAction] = useState(null) @@ -64,8 +68,22 @@ const OrderActions: FC = ({ if (isCanceled) return null + const handleConfirmQuantities = () => { + setLoadingAction('confirmQuantities') + onConfirmQuantities() + } + return (
+ {isNeedConfirmation && ( +
+ + + ) +} + +interface QuantityWithEditProps { + item: OrderItemType + orderId: string + iconColor?: string +} + +const QuantityWithEdit: FC = ({ item, orderId, iconColor = '#6d28d9' }) => { + const [modalOpen, setModalOpen] = useState(false) + + return ( + <> +
+ {formatFaNumber(item.quantity)} + +
+ {modalOpen && ( + setModalOpen(false)} + /> + )} + + ) +} + +const OrderItemsDetails: FC = ({ order, getStatusColor, isNeedConfirmation, iconColor }) => { const { t } = useTranslation('global') const orderItems: OrderItemTable[] = order.items.map((item: OrderItemType) => ({ @@ -63,7 +157,15 @@ const OrderItemsDetails: FC = ({ order, getStatusColor } title: 'تعداد', key: 'quantity', align: 'center', - render: (item) => formatFaNumber(item.quantity) + render: (item) => { + if (isNeedConfirmation) { + const originalItem = order.items.find(i => i.id === item.id) + if (originalItem) { + return + } + } + return formatFaNumber(item.quantity) + } }, { title: 'قیمت واحد', diff --git a/src/pages/orders/enum/Enum.ts b/src/pages/orders/enum/Enum.ts index d2b227e..7c12bf9 100644 --- a/src/pages/orders/enum/Enum.ts +++ b/src/pages/orders/enum/Enum.ts @@ -1,4 +1,5 @@ export enum OrderStatus { + NEED_CONFIRMATION = "needConfirmation", PENDING_PAYMENT = "pendingPayment", PAID = "paid", PREPARING = "preparing", diff --git a/src/pages/orders/hooks/useOrderData.ts b/src/pages/orders/hooks/useOrderData.ts index 7946e98..eb477ee 100644 --- a/src/pages/orders/hooks/useOrderData.ts +++ b/src/pages/orders/hooks/useOrderData.ts @@ -2,6 +2,7 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import * as api from "../service/OrderService"; import type { GetOrdersParams, ChangeOrderStatusParams, RefundPaymentParams } from "../service/OrderService"; + export const useGetOrders = (params?: GetOrdersParams) => { return useQuery({ queryKey: ["orders", params], @@ -62,3 +63,15 @@ export const useRefundPayment = () => { }, }); }; + +export const useUpdateOrderItemQuantity = () => { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ orderId, orderItemId, quantity }: { orderId: string; orderItemId: string; quantity: number }) => + api.updateOrderItemQuantity(orderId, orderItemId, quantity), + onSuccess: (_, { orderId }) => { + queryClient.invalidateQueries({ queryKey: ["order", orderId] }); + queryClient.invalidateQueries({ queryKey: ["orders"] }); + }, + }); +}; diff --git a/src/pages/orders/service/OrderService.ts b/src/pages/orders/service/OrderService.ts index b79241a..19e64a3 100644 --- a/src/pages/orders/service/OrderService.ts +++ b/src/pages/orders/service/OrderService.ts @@ -82,3 +82,11 @@ export const refundPayment = async ( ): Promise => { await axios.post(`/admin/orders/${orderId}/refund`, params); }; + +export const updateOrderItemQuantity = async ( + orderId: string, + orderItemId: string, + quantity: number +): Promise => { + await axios.patch(`/admin/orders/${orderId}/items/${orderItemId}/quantity`, { quantity }); +};