From 54b86b718cea5d4c74eec4758eb9b9a83dd9d1c7 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Thu, 26 Feb 2026 09:04:13 +0330 Subject: [PATCH] edit order --- src/pages/order/EditOrder.tsx | 271 ++++++++++++-------- src/pages/order/hooks/useOrderData.ts | 6 +- src/pages/order/service/OrderService.ts | 7 +- src/pages/order/types/Types.ts | 11 + src/pages/product/List.tsx | 2 +- src/pages/product/hooks/useProductData.ts | 2 +- src/pages/product/service/ProductService.ts | 2 +- src/pages/user/Create.tsx | 2 +- src/pages/user/Update.tsx | 5 +- 9 files changed, 195 insertions(+), 113 deletions(-) diff --git a/src/pages/order/EditOrder.tsx b/src/pages/order/EditOrder.tsx index a0979b3..87f56a3 100644 --- a/src/pages/order/EditOrder.tsx +++ b/src/pages/order/EditOrder.tsx @@ -1,58 +1,81 @@ import { useEffect, useState, type FC } from 'react' import Button from '@/components/Button' import { TickSquare } from 'iconsax-react' -import { useOrderStore } from './store/OrderStore' import { useGetOrderDetails, useUpdateOrder } from './hooks/useOrderData' import { toast } from '@/shared/toast' -import { useNavigate } from 'react-router-dom' +import { useNavigate, useParams } from 'react-router-dom' import { Paths } from '@/config/Paths' import { extractErrorMessage } from '@/config/func' import { useFormik } from 'formik' -import type { CreateBaseOrderType } from '../product/types/Types' -import { OrderStatusEnum } from './enum/OrderEnum' import * as Yup from 'yup' import Input from '@/components/Input' import Select from '@/components/Select' +import Textarea from '@/components/Textarea' +import UploadBox from '@/components/UploadBox' import { useGetUsers } from '../user/hooks/useUserData' -import { useParams } from 'react-router-dom' -import EditOrderComponent from './components/SingleOrderEdit' -import type { CreateOrderType } from './types/Types' +import { useGetCategory } from '@/pages/product/hooks/useProductData' +import { useGetProducts } from './hooks/useOrderData' +import type { UpdateOrderType } from './types/Types' +import type { OrderDetailDataType } from './types/Types' +import { useMultiUpload } from '@/pages/uploader/hooks/useUploader' +import { Link } from 'iconsax-react' +import TrashWithConfrim from '@/components/TrashWithConfrim' +import { getFileNameAndExtensionFromUrl } from '@/config/func' + +const normalizeAttachments = (attachments: unknown[]): string[] => { + return attachments.map((att) => + typeof att === 'string' ? att : (att as { url?: string })?.url ?? '' + ).filter(Boolean) +} const EditOrder: FC = () => { - const { id } = useParams() const { data } = useGetOrderDetails(id!) const navigate = useNavigate() const { mutate: submitOrder, isPending } = useUpdateOrder() const { data: users } = useGetUsers() - const [showOrders, setShowOrders] = useState([0]) - const { items, setItems } = useOrderStore() + const { data: categories } = useGetCategory() + const { data: products } = useGetProducts() + const multiUpload = useMultiUpload() + const [attachmentFiles, setAttachmentFiles] = useState([]) - const formik = useFormik({ + const order = data?.data as OrderDetailDataType | undefined + + const formik = useFormik({ initialValues: { - enableTax: true, - estimatedDays: 0, - paymentMethod: '', - status: OrderStatusEnum.CREATED, userId: '', + invoiceItemId: '', + typeId: '', + estimatedDays: 0, + productId: '', + title: '', + attachments: [], + description: '', }, validationSchema: Yup.object({ - userId: Yup.string().required('این فیلد اجباری می باشد.'), - estimatedDays: Yup.number().required('این فیلد اجباری می باشد.'), - paymentMethod: Yup.string().required('این فیلد اجباری می باشد.'), + userId: Yup.string().required('انتخاب کاربر اجباری است.'), + typeId: Yup.string().required('انتخاب نوع اجباری است.'), + estimatedDays: Yup.number().required('تخمین روز اجباری است.').min(0, 'باید عدد مثبت باشد'), + productId: Yup.string().required('انتخاب محصول اجباری است.'), + title: Yup.string().required('عنوان اجباری است.'), }), - onSubmit: (values) => { - values.estimatedDays = Number(values.estimatedDays) - onSubmit(values) - } - }) + enableReinitialize: true, + onSubmit: async (values) => { + const attachments: string[] = [...values.attachments] - const onSubmit = (values: CreateBaseOrderType) => { - if (items.length > 0) { - const params = { - ...values, - items: items + if (attachmentFiles.length > 0) { + const result = await multiUpload.mutateAsync(attachmentFiles) + result?.data?.forEach((item) => { + attachments.push(item.url) + }) } + + const params: UpdateOrderType = { + ...values, + estimatedDays: Number(values.estimatedDays), + attachments, + } + submitOrder({ orderId: id!, params }, { onSuccess: () => { toast('سفارش با موفقیت ویرایش شد', 'success') @@ -62,46 +85,29 @@ const EditOrder: FC = () => { toast(extractErrorMessage(error), 'error') } }) - } else { - toast('حداقل یک سفارش باید اضافه کنید.', 'error') } - } + }) useEffect(() => { - if (data && data?.data) { + if (order) { formik.setValues({ - enableTax: data?.data?.enableTax, - estimatedDays: data?.data?.estimatedDays as number, - paymentMethod: data?.data?.paymentMethod, - status: data?.data?.status as OrderStatusEnum, - userId: data?.data?.user.id, + userId: order.user?.id ?? '', + invoiceItemId: order.invoiceItem ?? '', + typeId: order.type?.id ?? '', + estimatedDays: order.estimatedDays ?? 0, + productId: order.product?.id ?? '', + title: order.title ?? '', + attachments: normalizeAttachments(order.attachments ?? []), + description: (order as OrderDetailDataType & { description?: string })?.description ?? '', }) } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [data]) - - useEffect(() => { - if (data && data?.data) { - - const items: CreateOrderType[] = [] - data?.data?.items.map((item) => { - items.push({ - id: item.id, - productId: item.product.id, - quantity: item.quantity, - attributes: item.attributes, - attachments: item.attachments, - discount: item.discount, - unitPrice: item.unitPrice, - description: item.description, - }) - }) - setItems(items) - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [data]) - + }, [order]) + const handleDeleteAttachment = (url: string) => { + const attachments = formik.values.attachments.filter((u) => u !== url) + formik.setFieldValue('attachments', attachments) + } return (
@@ -112,7 +118,7 @@ const EditOrder: FC = () => {