From ee89008a9f45d33e3dc8c33934bef24b2c8895de Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sat, 27 Sep 2025 09:59:10 +0330 Subject: [PATCH] create + list + delete shipment --- src/config/Pages.ts | 5 + src/pages/shipment/Create.tsx | 228 ++++++++++++++++++++ src/pages/shipment/List.tsx | 141 ++++++++++++ src/pages/shipment/hooks/useShipmentData.ts | 30 +++ src/pages/shipment/servicce/Service.ts | 19 ++ src/pages/shipment/types/Types.ts | 48 +++++ src/router/Main.tsx | 5 + src/shared/SideBar.tsx | 46 +--- src/shared/components/ShippingSubMenu.tsx | 42 ++++ 9 files changed, 525 insertions(+), 39 deletions(-) create mode 100644 src/pages/shipment/Create.tsx create mode 100644 src/pages/shipment/List.tsx create mode 100644 src/pages/shipment/hooks/useShipmentData.ts create mode 100644 src/pages/shipment/servicce/Service.ts create mode 100644 src/pages/shipment/types/Types.ts create mode 100644 src/shared/components/ShippingSubMenu.tsx diff --git a/src/config/Pages.ts b/src/config/Pages.ts index c0039a8..b754f61 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -153,4 +153,9 @@ export const Pages = { detailUser: "/orders/detail-user/", detailSeller: "/orders/detail-seller/", }, + shipment: { + list: "/shipment/list", + create: "/shipment/create", + update: "/shipment/update/", + }, }; diff --git a/src/pages/shipment/Create.tsx b/src/pages/shipment/Create.tsx new file mode 100644 index 0000000..748187e --- /dev/null +++ b/src/pages/shipment/Create.tsx @@ -0,0 +1,228 @@ +import { type FC } from 'react' +import { useFormik } from 'formik' +import { type CreateShipper, type Cost } from './types/Types' +import * as Yup from 'yup' +import { useCreateShipment } from './hooks/useShipmentData' +import { useNavigate } from 'react-router-dom' +import Input from '../../components/Input' +import Textarea from '../../components/Textarea' +import Button from '../../components/Button' +import Select from '../../components/Select' +import { TickCircle, Add, Trash } from 'iconsax-react' +import { toast } from 'react-toastify' +import { extractErrorMessage } from '../../helpers/utils' +import { Pages } from '../../config/Pages' + +const CreateShipment: FC = () => { + const navigate = useNavigate() + const createShipmentMutation = useCreateShipment() + + const formik = useFormik({ + initialValues: { + name: '', + description: '', + costs: [], + deliveryTime: 0, + deliveryType: 'Standard', + }, + validationSchema: Yup.object({ + name: Yup.string().required('عنوان روش ارسال الزامی است'), + description: Yup.string().required('توضیحات روش ارسال الزامی است'), + costs: Yup.array().min(1, 'حداقل یک محدوده وزنی الزامی است'), + deliveryTime: Yup.number().min(0, 'زمان ارسال باید بزرگتر از صفر باشد').required('زمان ارسال الزامی است'), + deliveryType: Yup.string().oneOf(['Standard', 'SameDay', 'Express'], 'نوع ارسال نامعتبر است'), + }), + onSubmit: async (values) => { + values.deliveryTime = Number(values.deliveryTime) + createShipmentMutation.mutate(values, { + onSuccess: () => { + toast.success('روش ارسال با موفقیت ایجاد شد') + navigate(Pages.shipment.list) + }, + onError: (error) => { + toast.error(extractErrorMessage(error)) + } + }) + }, + }) + + const addCostRange = () => { + const newCost: Cost = { + weightRange: { min: 0, max: 0 }, + cost_first: 0, + cost_rest: 0 + } + formik.setFieldValue('costs', [...formik.values.costs, newCost]) + } + + const removeCostRange = (index: number) => { + const newCosts = formik.values.costs.filter((_, i) => i !== index) + formik.setFieldValue('costs', newCosts) + } + + const updateCostRange = (index: number, field: keyof Cost, value: number | { min?: number; max?: number }) => { + const newCosts = [...formik.values.costs] + if (field === 'weightRange') { + newCosts[index].weightRange = { ...newCosts[index].weightRange, ...(value as { min?: number; max?: number }) } + } else { + newCosts[index][field] = value as number + } + formik.setFieldValue('costs', newCosts) + } + + return ( +
+
+
+

ساخت روش ارسال جدید

+
+
+ +
+
+ +
+ {/* اطلاعات اصلی */} +
+

اطلاعات اصلی

+ +
+
+ + +
+ +