From 6653e3db82b73e4e27ad0642e8f4235dfed1530e Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sun, 7 Jun 2026 12:43:43 +0330 Subject: [PATCH] save request --- src/pages/designer/Request.tsx | 106 ++++++++++-------- src/pages/designer/hooks/useDesignerData.ts | 8 ++ src/pages/designer/service/DesignerService.ts | 12 ++ src/pages/designer/types/Types.ts | 7 ++ 4 files changed, 85 insertions(+), 48 deletions(-) create mode 100644 src/pages/designer/hooks/useDesignerData.ts create mode 100644 src/pages/designer/service/DesignerService.ts create mode 100644 src/pages/designer/types/Types.ts diff --git a/src/pages/designer/Request.tsx b/src/pages/designer/Request.tsx index 634b598..d4cfd5e 100644 --- a/src/pages/designer/Request.tsx +++ b/src/pages/designer/Request.tsx @@ -2,36 +2,30 @@ import Button from "@/components/Button"; import DatePicker from "@/components/DatePicker"; import Error from "@/components/Error"; import Input from "@/components/Input"; -import Select from "@/components/Select"; import Textarea from "@/components/Textarea"; +import { toast } from "@/components/Toast"; import UploadBoxDraggble from "@/components/UploadBoxDraggble"; +import { extractErrorMessage } from "@/helpers/utils"; import { usePageTitle } from "@/hooks/usePageTitle"; -import { useSingleUpload } from "@/pages/uploader/hooks/useUploaderData"; -import { Form, Formik, type FormikProps } from "formik"; +import { useInitiateDesignRequest } from "@/pages/designer/hooks/useDesignerData"; +import { useMultipleUpload } from "@/pages/uploader/hooks/useUploaderData"; +import { Form, Formik, type FormikHelpers, type FormikProps } from "formik"; import { type FC } from "react"; import * as Yup from "yup"; const PRICE_PER_PAGE = 1000; -const pageCountOptions = Array.from({ length: 20 }, (_, index) => { - const value = index + 1; - return { - value: String(value), - label: String(value), - }; -}); - export type DesignerRequestFormValues = { title: string; - count: number; + count: number | ""; desc: string; expectedDate: string; - attachments: string[]; + attachments: File[]; }; const initialValues: DesignerRequestFormValues = { title: "", - count: 1, + count: "", desc: "", expectedDate: "", attachments: [], @@ -39,16 +33,16 @@ const initialValues: DesignerRequestFormValues = { const validationSchema = Yup.object({ title: Yup.string().trim().required("عنوان کاتالوگ الزامی است"), - count: Yup.number().min(1, "حداقل تعداد صفحات ۱ است").max(20, "حداکثر تعداد صفحات ۲۰ است").required("تعداد صفحات الزامی است"), + count: Yup.number() + .transform((value, originalValue) => (originalValue === "" ? undefined : value)) + .optional() + .min(1, "حداقل تعداد صفحات ۱ است"), desc: Yup.string().trim(), expectedDate: Yup.string().required("زمان تحویل الزامی است"), - attachments: Yup.array().of(Yup.string()), + attachments: Yup.array(), }); -type DesignerRequestFormFieldsProps = FormikProps & { - uploadFile: ReturnType["mutateAsync"]; - isUploading: boolean; -}; +type DesignerRequestFormFieldsProps = FormikProps; const DesignerRequestFormFields: FC = ({ values, @@ -59,26 +53,12 @@ const DesignerRequestFormFields: FC = ({ setFieldTouched, handleChange, handleBlur, - uploadFile, - isUploading, }) => { - const totalPrice = values.count * PRICE_PER_PAGE; + const totalPrice = (values.count === "" ? 0 : values.count) * PRICE_PER_PAGE; - const handleAttachmentChange = async (files: File[]) => { - if (files.length === 0) { - await setFieldValue("attachments", []); - setFieldTouched("attachments", true); - return; - } - - try { - const response = await uploadFile(files[0]); - await setFieldValue("attachments", [response.data.url]); - } catch { - await setFieldValue("attachments", []); - } finally { - setFieldTouched("attachments", true); - } + const handleAttachmentChange = (files: File[]) => { + setFieldValue("attachments", files); + setFieldTouched("attachments", true); }; return ( @@ -96,12 +76,16 @@ const DesignerRequestFormFields: FC = ({ }} error_text={touched.expectedDate ? errors.expectedDate : undefined} /> -