From 5b514c362d90c0c597213375671b614decb7ee7a Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Thu, 30 Oct 2025 11:47:37 +0330 Subject: [PATCH] track code --- src/pages/orders/Native.tsx | 33 ++++++- .../orders/components/AddTrackCodeModal.tsx | 86 +++++++++++++++++++ src/pages/orders/hooks/useOrderData.ts | 6 ++ src/pages/orders/service/OrderService.ts | 9 ++ src/pages/orders/types/ReturnTypes.ts | 12 ++- 5 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 src/pages/orders/components/AddTrackCodeModal.tsx diff --git a/src/pages/orders/Native.tsx b/src/pages/orders/Native.tsx index 1f0431a..c70e093 100644 --- a/src/pages/orders/Native.tsx +++ b/src/pages/orders/Native.tsx @@ -5,11 +5,14 @@ import Error from '../../components/Error' import PaginationUi from '../../components/PaginationUi' import PageTitle from '../../components/PageTitle' import Td from '../../components/Td' -import { Eye } from 'iconsax-react' +import { Eye, Add } from 'iconsax-react' import { Link } from 'react-router-dom' import { type NativeOrderType } from '@/pages/orders/types/Types' import { useGetNativeOrders } from '@/pages/orders/hooks/useOrderData' import { Pages } from '@/config/Pages' +import Button from '@/components/Button' +import AddTrackCodeModal from '@/pages/orders/components/AddTrackCodeModal' +import { useQueryClient } from '@tanstack/react-query' const STATUS_CONFIG = { Cancelled: { label: 'کنسل شده', color: 'bg-red-100 text-red-800' }, @@ -30,6 +33,9 @@ const Native: FC = () => { const [searchParams] = useSearchParams() const status = searchParams.get('status') || '' const [currentPage, setCurrentPage] = useState(1) + const [openTrackModal, setOpenTrackModal] = useState(false) + const [selectedOrderId, setSelectedOrderId] = useState(null) + const queryClient = useQueryClient() const { data, isLoading, error } = useGetNativeOrders(currentPage, status === 'Admin' ? undefined : status) @@ -96,6 +102,22 @@ const Native: FC = () => { + {order.orderStatus === 'process_by_sellers' && ( + + )} @@ -135,6 +157,15 @@ const Native: FC = () => { onPageChange={setCurrentPage} /> )} + + setOpenTrackModal(false)} + orderId={selectedOrderId} + onSuccess={() => { + queryClient.invalidateQueries({ queryKey: ['orders'] }) + }} + /> ) } diff --git a/src/pages/orders/components/AddTrackCodeModal.tsx b/src/pages/orders/components/AddTrackCodeModal.tsx new file mode 100644 index 0000000..bf055c7 --- /dev/null +++ b/src/pages/orders/components/AddTrackCodeModal.tsx @@ -0,0 +1,86 @@ +import { type FC, useState } from 'react' +import DefaulModal from '@/components/DefaulModal' +import Input from '@/components/Input' +import DatePicker from '@/components/DatePicker' +import Button from '@/components/Button' +import { useAddTrackCode } from '@/pages/orders/hooks/useOrderData' +import type { AddTrackCodeType } from '@/pages/orders/types/ReturnTypes' + +type Props = { + open: boolean + onClose: () => void + orderId: string | null + onSuccess?: () => void +} + +const AddTrackCodeModal: FC = ({ open, onClose, orderId, onSuccess }) => { + const [trackCode, setTrackCode] = useState('') + const [postingDate, setPostingDate] = useState('') + const [postingReceipt, setPostingReceipt] = useState('') + + const { mutateAsync, isPending } = useAddTrackCode() + + const handleSubmit = async () => { + if (!orderId) return + if (!trackCode || !postingDate) return + + const payload: AddTrackCodeType = { + orderId, + trackCode, + postingDate, + postingReceipt, + } + + await mutateAsync(payload) + setTrackCode('') + setPostingDate('') + setPostingReceipt('') + onClose() + if (onSuccess) { + onSuccess() + } + } + + return ( + +
+ + setPostingDate(val)} + /> + + setTrackCode(e.target.value)} + /> + + + + setPostingReceipt(e.target.value)} + /> + +
+ + +
+
+
+ ) +} + +export default AddTrackCodeModal + + diff --git a/src/pages/orders/hooks/useOrderData.ts b/src/pages/orders/hooks/useOrderData.ts index 90425de..6881eb9 100644 --- a/src/pages/orders/hooks/useOrderData.ts +++ b/src/pages/orders/hooks/useOrderData.ts @@ -78,3 +78,9 @@ export const useGetOrderReturns = (page: number = 1) => { queryFn: () => api.getOrderReturns(page), }); }; + +export const useAddTrackCode = () => { + return useMutation({ + mutationFn: api.addTrackCode, + }); +}; diff --git a/src/pages/orders/service/OrderService.ts b/src/pages/orders/service/OrderService.ts index 7b01b95..174adfb 100644 --- a/src/pages/orders/service/OrderService.ts +++ b/src/pages/orders/service/OrderService.ts @@ -1,4 +1,5 @@ import axios from "../../../config/axios"; +import type { AddTrackCodeType } from "../types/ReturnTypes"; import type { CancelReasonsResponseType, CreateCancelReasonType, @@ -77,3 +78,11 @@ export const getOrderReturns = async (page: number = 1) => { }); return data; }; + +export const addTrackCode = async (params: AddTrackCodeType) => { + const { data } = await axios.post( + `/order/${params.orderId}/admin/track-code`, + params + ); + return data; +}; diff --git a/src/pages/orders/types/ReturnTypes.ts b/src/pages/orders/types/ReturnTypes.ts index 11bc377..875f2be 100644 --- a/src/pages/orders/types/ReturnTypes.ts +++ b/src/pages/orders/types/ReturnTypes.ts @@ -1,4 +1,7 @@ -import type { PagerType, ShipmentAddressType } from "@/pages/orders/types/Types"; +import type { + PagerType, + ShipmentAddressType, +} from "@/pages/orders/types/Types"; export type ReturnOrderItemType = { quantity: number; @@ -41,3 +44,10 @@ export type ReturnOrdersResponseType = { returnsOrders: ReturnOrderType[]; }; }; + +export type AddTrackCodeType = { + trackCode: string; + postingDate: string; + postingReceipt: string; + orderId: string; +};