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 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 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 = {}; 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); }, 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 : "" } />