diff --git a/src/pages/shipmentMethod/Update.tsx b/src/pages/shipmentMethod/Update.tsx index 9ed99d0..f642bef 100644 --- a/src/pages/shipmentMethod/Update.tsx +++ b/src/pages/shipmentMethod/Update.tsx @@ -1,4 +1,4 @@ -import { type FC, useMemo } from 'react' +import { type FC, useMemo, useState, useEffect } from 'react' import { useFormik } from 'formik' import * as Yup from 'yup' import { TickCircle } from 'iconsax-react' @@ -9,9 +9,10 @@ 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 { useUpdateRestaurantShipmentMethod, useGetRestaurantShipmentMethod } from './hooks/useShipmentMethodData' -import { DeliveryMethodEnum } from './enum/Enum' +import { DeliveryMethodEnum, DeliveryFeeTypeEnum } from './enum/Enum' import { Pages } from '@/config/Pages' import type { ErrorType } from '@/helpers/types' import { extractErrorMessage } from '@/config/func' @@ -24,6 +25,7 @@ const UpdateShipmentMethod: FC = () => { 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 }, @@ -58,17 +60,57 @@ const UpdateShipmentMethod: FC = () => { } }, [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().required('هزینه ارسال الزامی است').min(0, 'هزینه ارسال باید مثبت باشد'), + 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 + }, onSubmit: (values) => { if (!id) return updateRestaurantShipmentMethod( @@ -128,25 +170,105 @@ const UpdateShipmentMethod: FC = () => { label='روش ارسال' name='method' value={formik.values.method} - onChange={formik.handleChange} + onChange={(e) => { + formik.handleChange(e) + if (e.target.value !== DeliveryMethodEnum.DeliveryCourier) { + setDeliveryFeeType(DeliveryFeeTypeEnum.FIXED) + formik.setFieldValue('perKilometerFee', 0) + formik.setFieldValue('distanceBasedMinCost', 0) + } + }} items={shipmentMethods} placeholder='روش ارسال را انتخاب کنید' error_text={formik.touched.method && formik.errors.method ? formik.errors.method : ''} /> -
- { - 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 : ''} - /> -
+ {formik.values.method && ( + <> + {formik.values.method === DeliveryMethodEnum.DeliveryCourier ? ( + <> +
+
تحویل با پیک
+ { + setDeliveryFeeType(value as string) + if (value === DeliveryFeeTypeEnum.FIXED) { + formik.setFieldValue('perKilometerFee', 0) + formik.setFieldValue('distanceBasedMinCost', 0) + } else { + formik.setFieldValue('deliveryFee', 0) + } + formik.validateForm() + }} + /> +
+ {isFixedDeliveryFee ? ( +
+ { + 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 : ''} + /> +
+ )} + + )}
{ error_text={formik.touched.minOrderPrice && formik.errors.minOrderPrice ? formik.errors.minOrderPrice : ''} />
-
- { - 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 : ''} - /> -