diff --git a/src/langs/fa.json b/src/langs/fa.json index da65d08..78d73c8 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -71,8 +71,9 @@ "statistics": "گزارشات" }, "shipment": { - "dineIn": "سرو در محل", - "pickup": "دریافت از محل", + "dineIn": "سرو در رستوران", + "customerPickup": "دریافت از محل", + "deliveryCar": "تحویل به خودرو", "deliveryCourier": "بیرون بر" }, "slider": { diff --git a/src/pages/shipmentMethod/Create.tsx b/src/pages/shipmentMethod/Create.tsx index be9c4ae..d4d7fe0 100644 --- a/src/pages/shipmentMethod/Create.tsx +++ b/src/pages/shipmentMethod/Create.tsx @@ -1,4 +1,4 @@ -import { type FC } from 'react' +import { type FC, useState } 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 { useCreateRestaurantShipmentMethod } 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' @@ -22,32 +23,62 @@ 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.Pickup}`), value: DeliveryMethodEnum.Pickup }, + { 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: '', - title: '', deliveryFee: 0, minOrderPrice: 0, description: '', enabled: true, order: 0, + perKilometerFee: 0, + distanceBasedMinCost: 0, }, validationSchema: Yup.object().shape({ method: Yup.string().required('روش ارسال الزامی است'), - title: 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) => { createRestaurantShipmentMethod(values, { onSuccess: () => { @@ -88,34 +119,105 @@ const CreateShipmentMethod: 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 : ''} + /> +
+ )} + + )}
{ const shipmentMethods = [ { label: t(`shipment.${DeliveryMethodEnum.DineIn}`), value: DeliveryMethodEnum.DineIn }, - { label: t(`shipment.${DeliveryMethodEnum.Pickup}`), value: DeliveryMethodEnum.Pickup }, + { label: t(`shipment.${DeliveryMethodEnum.CustomerPickup}`), value: DeliveryMethodEnum.CustomerPickup }, + { label: t(`shipment.${DeliveryMethodEnum.DeliveryCar}`), value: DeliveryMethodEnum.DeliveryCar }, { label: t(`shipment.${DeliveryMethodEnum.DeliveryCourier}`), value: DeliveryMethodEnum.DeliveryCourier }, ] @@ -36,22 +37,24 @@ const UpdateShipmentMethod: FC = () => { const data = shipmentMethodData.data return { method: data.method, - title: data.title, 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: '', - title: '', deliveryFee: 0, minOrderPrice: 0, description: '', enabled: true, order: 0, + perKilometerFee: 0, + distanceBasedMinCost: 0, } }, [shipmentMethodData]) @@ -60,7 +63,6 @@ const UpdateShipmentMethod: FC = () => { enableReinitialize: true, validationSchema: Yup.object().shape({ method: Yup.string().required('روش ارسال الزامی است'), - title: Yup.string().required('عنوان الزامی است'), deliveryFee: Yup.number().required('هزینه ارسال الزامی است').min(0, 'هزینه ارسال باید مثبت باشد'), minOrderPrice: Yup.number().required('حداقل قیمت سفارش الزامی است').min(0, 'حداقل قیمت سفارش باید مثبت باشد'), description: Yup.string().required('توضیحات الزامی است'), @@ -125,15 +127,6 @@ const UpdateShipmentMethod: FC = () => { error_text={formik.touched.method && formik.errors.method ? formik.errors.method : ''} />
-
- -
{ 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 : ''} + /> +