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, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate, useParams } from "react-router-dom"; import { toast } from "react-toastify"; import * as Yup from "yup"; import { DeliveryFeeTypeEnum, DeliveryMethodEnum } from "./enum/Enum"; import { useGetRestaurantShipmentMethod, useUpdateRestaurantShipmentMethod, } from "./hooks/useShipmentMethodData"; import type { CreateShipmentMethodType } from "./types/Types"; const UpdateShipmentMethod: FC = () => { const { t } = useTranslation("global"); const navigate = useNavigate(); const { id } = useParams<{ id: string }>(); const { mutate: updateRestaurantShipmentMethod, isPending } = useUpdateRestaurantShipmentMethod(); const { data: shipmentMethodData, isLoading } = useGetRestaurantShipmentMethod(id || ""); 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 initialValues = useMemo(() => { if (shipmentMethodData?.data) { const data = shipmentMethodData.data; return { method: data.method, deliveryFee: data.deliveryFee, minOrderPrice: data.minOrderPrice, description: data.description, enabled: data.enabled, order: data.order, perKilometerFee: data.perKilometerFee ?? 0, distanceBasedMinCost: data.distanceBasedMinCost ?? 0, }; } return { method: "", deliveryFee: 0, minOrderPrice: 0, description: "", enabled: true, order: 0, perKilometerFee: 0, distanceBasedMinCost: 0, }; }, [shipmentMethodData]); useEffect(() => { if (shipmentMethodData?.data) { const data = shipmentMethodData.data; const hasDistanceBased = data.perKilometerFee && data.perKilometerFee > 0; if (hasDistanceBased) { setDeliveryFeeType(DeliveryFeeTypeEnum.DISTANCE_BASED); } else { setDeliveryFeeType(DeliveryFeeTypeEnum.FIXED); } } }, [shipmentMethodData]); const isFixedDeliveryFee = deliveryFeeType === DeliveryFeeTypeEnum.FIXED; const formik = useFormik({ initialValues, enableReinitialize: true, 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 == 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) => { if (!id) return; updateRestaurantShipmentMethod( { id, params: values }, { onSuccess: () => { toast.success("روش ارسال با موفقیت ویرایش شد"); navigate(Pages.shipment_methods.list); }, onError: (error: ErrorType) => { toast.error(extractErrorMessage(error)); }, }, ); }, }); if (isLoading) { return (
در حال بارگذاری...
); } 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 : "" } />