diff --git a/src/pages/shipmentMethod/Create.tsx b/src/pages/shipmentMethod/Create.tsx index f79cec6..66b50ba 100644 --- a/src/pages/shipmentMethod/Create.tsx +++ b/src/pages/shipmentMethod/Create.tsx @@ -1,271 +1,336 @@ -import { type FC, useState } from 'react' -import { useFormik } from 'formik' -import * as Yup from 'yup' -import { TickCircle } from 'iconsax-react' -import { toast } from 'react-toastify' -import { useNavigate } from 'react-router-dom' -import Button from '@/components/Button' -import Input from '@/components/Input' -import Select from '@/components/Select' -import Switch from '@/components/Switch' -import Textarea from '@/components/Textarea' -import RadioGroup from '@/components/RadioGroup' -import type { CreateShipmentMethodType } from './types/Types' -import { useCreateRestaurantShipmentMethod } from './hooks/useShipmentMethodData' -import { DeliveryMethodEnum, DeliveryFeeTypeEnum } from './enum/Enum' -import { Pages } from '@/config/Pages' -import type { ErrorType } from '@/helpers/types' -import { extractErrorMessage } from '@/config/func' -import { useTranslation } from 'react-i18next' +import Button from "@/components/Button"; +import Input from "@/components/Input"; +import RadioGroup from "@/components/RadioGroup"; +import Select from "@/components/Select"; +import Switch from "@/components/Switch"; +import Textarea from "@/components/Textarea"; +import { extractErrorMessage } from "@/config/func"; +import { Pages } from "@/config/Pages"; +import type { ErrorType } from "@/helpers/types"; +import { useFormik } from "formik"; +import { TickCircle } from "iconsax-react"; +import { type FC, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useNavigate } from "react-router-dom"; +import { toast } from "react-toastify"; +import * as Yup from "yup"; +import { DeliveryFeeTypeEnum, DeliveryMethodEnum } from "./enum/Enum"; +import { useCreateRestaurantShipmentMethod } from "./hooks/useShipmentMethodData"; +import type { CreateShipmentMethodType } from "./types/Types"; const CreateShipmentMethod: FC = () => { + const { t } = useTranslation("global"); + const navigate = useNavigate(); + const { mutate: createRestaurantShipmentMethod, isPending } = + useCreateRestaurantShipmentMethod(); + const [deliveryFeeType, setDeliveryFeeType] = useState( + DeliveryFeeTypeEnum.FIXED, + ); - const { t } = useTranslation('global') - const navigate = useNavigate() - const { mutate: createRestaurantShipmentMethod, isPending } = useCreateRestaurantShipmentMethod() - const [deliveryFeeType, setDeliveryFeeType] = useState(DeliveryFeeTypeEnum.FIXED) + const shipmentMethods = [ + { + label: t(`shipment.${DeliveryMethodEnum.DineIn}`), + value: DeliveryMethodEnum.DineIn, + }, + { + label: t(`shipment.${DeliveryMethodEnum.CustomerPickup}`), + value: DeliveryMethodEnum.CustomerPickup, + }, + { + label: t(`shipment.${DeliveryMethodEnum.DeliveryCar}`), + value: DeliveryMethodEnum.DeliveryCar, + }, + { + label: t(`shipment.${DeliveryMethodEnum.DeliveryCourier}`), + value: DeliveryMethodEnum.DeliveryCourier, + }, + ]; - const shipmentMethods = [ - { label: t(`shipment.${DeliveryMethodEnum.DineIn}`), value: DeliveryMethodEnum.DineIn }, - { label: t(`shipment.${DeliveryMethodEnum.CustomerPickup}`), value: DeliveryMethodEnum.CustomerPickup }, - { label: t(`shipment.${DeliveryMethodEnum.DeliveryCar}`), value: DeliveryMethodEnum.DeliveryCar }, - { label: t(`shipment.${DeliveryMethodEnum.DeliveryCourier}`), value: DeliveryMethodEnum.DeliveryCourier }, - ] + const isFixedDeliveryFee = deliveryFeeType === DeliveryFeeTypeEnum.FIXED; - const isFixedDeliveryFee = deliveryFeeType === DeliveryFeeTypeEnum.FIXED + const formik = useFormik({ + initialValues: { + method: "", + deliveryFee: 0, + minOrderPrice: 0, + description: "", + enabled: true, + order: 0, + perKilometerFee: 0, + distanceBasedMinCost: 0, + }, + validationSchema: Yup.object().shape({ + method: Yup.string().required("روش ارسال الزامی است"), + // perKilometerFee: Yup.number().min(0, 'هزینه ارسال به ازای هر کیلومتر باید مثبت باشد'), + // distanceBasedMinCost: Yup.number().min(0, 'حداقل هزینه برای روش کیلوتری باید مثبت باشد'), + minOrderPrice: Yup.number() + .required("حداقل قیمت سفارش الزامی است") + .min(0, "حداقل قیمت سفارش باید مثبت باشد"), + enabled: Yup.boolean(), + order: Yup.number() + .required("ترتیب الزامی است") + .min(0, "ترتیب باید مثبت باشد"), + }), + validate: (values) => { + const errors: Record = {}; - const formik = useFormik({ - initialValues: { - method: '', - deliveryFee: 0, - minOrderPrice: 0, - description: '', - enabled: true, - order: 0, - perKilometerFee: 0, - distanceBasedMinCost: 0, + if (values.method === DeliveryMethodEnum.DeliveryCourier) { + if (isFixedDeliveryFee) { + if (values.deliveryFee == null || values.deliveryFee < 0) { + errors.deliveryFee = "هزینه ارسال الزامی است"; + } + } else { + if (!values.perKilometerFee || values.perKilometerFee <= 0) { + errors.perKilometerFee = + "هزینه ارسال به ازای هر کیلومتر الزامی است"; + } + if ( + !values.distanceBasedMinCost || + values.distanceBasedMinCost <= 0 + ) { + errors.distanceBasedMinCost = + "حداقل هزینه برای روش کیلوتری الزامی است"; + } + } + } else { + if (values.deliveryFee == null || values.deliveryFee < 0) { + errors.deliveryFee = "هزینه ارسال الزامی است"; + } + } + + return errors; + }, + onSubmit: (values) => { + createRestaurantShipmentMethod(values, { + onSuccess: () => { + toast.success("روش ارسال با موفقیت ایجاد شد"); + navigate(Pages.shipment_methods.list); }, - validationSchema: Yup.object().shape({ - method: Yup.string().required('روش ارسال الزامی است'), - deliveryFee: Yup.number().min(0, 'هزینه ارسال باید مثبت باشد'), - perKilometerFee: Yup.number().min(0, 'هزینه ارسال به ازای هر کیلومتر باید مثبت باشد'), - distanceBasedMinCost: Yup.number().min(0, 'حداقل هزینه برای روش کیلوتری باید مثبت باشد'), - minOrderPrice: Yup.number().required('حداقل قیمت سفارش الزامی است').min(0, 'حداقل قیمت سفارش باید مثبت باشد'), - description: Yup.string().required('توضیحات الزامی است'), - enabled: Yup.boolean(), - order: Yup.number().required('ترتیب الزامی است').min(0, 'ترتیب باید مثبت باشد'), - }), - validate: (values) => { - const errors: Record = {} - - if (values.method === DeliveryMethodEnum.DeliveryCourier) { - if (isFixedDeliveryFee) { - if (!values.deliveryFee || values.deliveryFee <= 0) { - errors.deliveryFee = 'هزینه ارسال الزامی است' - } - } else { - if (!values.perKilometerFee || values.perKilometerFee <= 0) { - errors.perKilometerFee = 'هزینه ارسال به ازای هر کیلومتر الزامی است' - } - if (!values.distanceBasedMinCost || values.distanceBasedMinCost <= 0) { - errors.distanceBasedMinCost = 'حداقل هزینه برای روش کیلوتری الزامی است' - } - } - } else { - if (!values.deliveryFee || values.deliveryFee <= 0) { - errors.deliveryFee = 'هزینه ارسال الزامی است' - } - } - - return errors + onError: (error: ErrorType) => { + toast.error(extractErrorMessage(error)); }, - onSubmit: (values) => { - createRestaurantShipmentMethod(values, { - onSuccess: () => { - toast.success('روش ارسال با موفقیت ایجاد شد') - navigate(Pages.shipment_methods.list) - }, - onError: (error: ErrorType) => { - toast.error(extractErrorMessage(error)) - }, - }) - }, - }) + }); + }, + }); - return ( -
-
-
- افزودن روش ارسال -
-
- -
-
- - - -
-
-
- formik.setFieldValue('enabled', value)} - label='فعال' - /> -
-
- { - const value = e.target.value === '' ? 0 : Number(e.target.value) - formik.setFieldValue('deliveryFee', value) - }} - error_text={formik.touched.deliveryFee && formik.errors.deliveryFee ? formik.errors.deliveryFee : ''} - /> -
- ) : ( - <> -
- { - const value = e.target.value === '' ? 0 : Number(e.target.value) - formik.setFieldValue('perKilometerFee', value) - }} - error_text={formik.touched.perKilometerFee && formik.errors.perKilometerFee ? formik.errors.perKilometerFee : ''} - /> -
-
- { - const value = e.target.value === '' ? 0 : Number(e.target.value) - formik.setFieldValue('distanceBasedMinCost', value) - }} - error_text={formik.touched.distanceBasedMinCost && formik.errors.distanceBasedMinCost ? formik.errors.distanceBasedMinCost : ''} - /> -
- - )} - - ) : ( -
- { - const value = e.target.value === '' ? 0 : Number(e.target.value) - formik.setFieldValue('deliveryFee', value) - }} - error_text={formik.touched.deliveryFee && formik.errors.deliveryFee ? formik.errors.deliveryFee : ''} - /> -
- )} - - )} -
- { - const value = e.target.value === '' ? 0 : Number(e.target.value) - formik.setFieldValue('minOrderPrice', value) - }} - error_text={formik.touched.minOrderPrice && formik.errors.minOrderPrice ? formik.errors.minOrderPrice : ''} - /> -
-
-