deliverfee can be zero
deploy to danak / build_and_deploy (push) Has been cancelled

This commit is contained in:
hamid zarghami
2026-06-03 10:51:34 +03:30
parent 94c6a9663b
commit c404ac14be
2 changed files with 705 additions and 561 deletions
+215 -150
View File
@@ -1,271 +1,336 @@
import { type FC, useState } from 'react' import Button from "@/components/Button";
import { useFormik } from 'formik' import Input from "@/components/Input";
import * as Yup from 'yup' import RadioGroup from "@/components/RadioGroup";
import { TickCircle } from 'iconsax-react' import Select from "@/components/Select";
import { toast } from 'react-toastify' import Switch from "@/components/Switch";
import { useNavigate } from 'react-router-dom' import Textarea from "@/components/Textarea";
import Button from '@/components/Button' import { extractErrorMessage } from "@/config/func";
import Input from '@/components/Input' import { Pages } from "@/config/Pages";
import Select from '@/components/Select' import type { ErrorType } from "@/helpers/types";
import Switch from '@/components/Switch' import { useFormik } from "formik";
import Textarea from '@/components/Textarea' import { TickCircle } from "iconsax-react";
import RadioGroup from '@/components/RadioGroup' import { type FC, useState } from "react";
import type { CreateShipmentMethodType } from './types/Types' import { useTranslation } from "react-i18next";
import { useCreateRestaurantShipmentMethod } from './hooks/useShipmentMethodData' import { useNavigate } from "react-router-dom";
import { DeliveryMethodEnum, DeliveryFeeTypeEnum } from './enum/Enum' import { toast } from "react-toastify";
import { Pages } from '@/config/Pages' import * as Yup from "yup";
import type { ErrorType } from '@/helpers/types' import { DeliveryFeeTypeEnum, DeliveryMethodEnum } from "./enum/Enum";
import { extractErrorMessage } from '@/config/func' import { useCreateRestaurantShipmentMethod } from "./hooks/useShipmentMethodData";
import { useTranslation } from 'react-i18next' import type { CreateShipmentMethodType } from "./types/Types";
const CreateShipmentMethod: FC = () => { const CreateShipmentMethod: FC = () => {
const { t } = useTranslation("global");
const { t } = useTranslation('global') const navigate = useNavigate();
const navigate = useNavigate() const { mutate: createRestaurantShipmentMethod, isPending } =
const { mutate: createRestaurantShipmentMethod, isPending } = useCreateRestaurantShipmentMethod() useCreateRestaurantShipmentMethod();
const [deliveryFeeType, setDeliveryFeeType] = useState<string>(DeliveryFeeTypeEnum.FIXED) const [deliveryFeeType, setDeliveryFeeType] = useState<string>(
DeliveryFeeTypeEnum.FIXED,
);
const shipmentMethods = [ const shipmentMethods = [
{ label: t(`shipment.${DeliveryMethodEnum.DineIn}`), value: DeliveryMethodEnum.DineIn }, {
{ label: t(`shipment.${DeliveryMethodEnum.CustomerPickup}`), value: DeliveryMethodEnum.CustomerPickup }, label: t(`shipment.${DeliveryMethodEnum.DineIn}`),
{ label: t(`shipment.${DeliveryMethodEnum.DeliveryCar}`), value: DeliveryMethodEnum.DeliveryCar }, value: DeliveryMethodEnum.DineIn,
{ label: t(`shipment.${DeliveryMethodEnum.DeliveryCourier}`), value: DeliveryMethodEnum.DeliveryCourier }, },
] {
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<CreateShipmentMethodType>({ const formik = useFormik<CreateShipmentMethodType>({
initialValues: { initialValues: {
method: '', method: "",
deliveryFee: 0, deliveryFee: 0,
minOrderPrice: 0, minOrderPrice: 0,
description: '', description: "",
enabled: true, enabled: true,
order: 0, order: 0,
perKilometerFee: 0, perKilometerFee: 0,
distanceBasedMinCost: 0, distanceBasedMinCost: 0,
}, },
validationSchema: Yup.object().shape({ validationSchema: Yup.object().shape({
method: Yup.string().required('روش ارسال الزامی است'), method: Yup.string().required("روش ارسال الزامی است"),
deliveryFee: Yup.number().min(0, 'هزینه ارسال باید مثبت باشد'), // perKilometerFee: Yup.number().min(0, 'هزینه ارسال به ازای هر کیلومتر باید مثبت باشد'),
perKilometerFee: Yup.number().min(0, 'هزینه ارسال به ازای هر کیلومتر باید مثبت باشد'), // distanceBasedMinCost: Yup.number().min(0, 'حداقل هزینه برای روش کیلوتری باید مثبت باشد'),
distanceBasedMinCost: Yup.number().min(0, 'حداقل هزینه برای روش کیلوتری باید مثبت باشد'), minOrderPrice: Yup.number()
minOrderPrice: Yup.number().required('حداقل قیمت سفارش الزامی است').min(0, 'حداقل قیمت سفارش باید مثبت باشد'), .required("حداقل قیمت سفارش الزامی است")
description: Yup.string().required('توضیحات الزامی است'), .min(0, "حداقل قیمت سفارش باید مثبت باشد"),
enabled: Yup.boolean(), enabled: Yup.boolean(),
order: Yup.number().required('ترتیب الزامی است').min(0, 'ترتیب باید مثبت باشد'), order: Yup.number()
.required("ترتیب الزامی است")
.min(0, "ترتیب باید مثبت باشد"),
}), }),
validate: (values) => { validate: (values) => {
const errors: Record<string, string> = {} const errors: Record<string, string> = {};
if (values.method === DeliveryMethodEnum.DeliveryCourier) { if (values.method === DeliveryMethodEnum.DeliveryCourier) {
if (isFixedDeliveryFee) { if (isFixedDeliveryFee) {
if (!values.deliveryFee || values.deliveryFee <= 0) { if (values.deliveryFee == null || values.deliveryFee < 0) {
errors.deliveryFee = 'هزینه ارسال الزامی است' errors.deliveryFee = "هزینه ارسال الزامی است";
} }
} else { } else {
if (!values.perKilometerFee || values.perKilometerFee <= 0) { if (!values.perKilometerFee || values.perKilometerFee <= 0) {
errors.perKilometerFee = 'هزینه ارسال به ازای هر کیلومتر الزامی است' errors.perKilometerFee =
"هزینه ارسال به ازای هر کیلومتر الزامی است";
} }
if (!values.distanceBasedMinCost || values.distanceBasedMinCost <= 0) { if (
errors.distanceBasedMinCost = 'حداقل هزینه برای روش کیلوتری الزامی است' !values.distanceBasedMinCost ||
values.distanceBasedMinCost <= 0
) {
errors.distanceBasedMinCost =
"حداقل هزینه برای روش کیلوتری الزامی است";
} }
} }
} else { } else {
if (!values.deliveryFee || values.deliveryFee <= 0) { if (values.deliveryFee == null || values.deliveryFee < 0) {
errors.deliveryFee = 'هزینه ارسال الزامی است' errors.deliveryFee = "هزینه ارسال الزامی است";
} }
} }
return errors return errors;
}, },
onSubmit: (values) => { onSubmit: (values) => {
createRestaurantShipmentMethod(values, { createRestaurantShipmentMethod(values, {
onSuccess: () => { onSuccess: () => {
toast.success('روش ارسال با موفقیت ایجاد شد') toast.success("روش ارسال با موفقیت ایجاد شد");
navigate(Pages.shipment_methods.list) navigate(Pages.shipment_methods.list);
}, },
onError: (error: ErrorType) => { onError: (error: ErrorType) => {
toast.error(extractErrorMessage(error)) toast.error(extractErrorMessage(error));
}, },
}) });
}, },
}) });
return ( return (
<div className='mt-5'> <div className="mt-5">
<div className='flex w-full justify-between items-center'> <div className="flex w-full justify-between items-center">
<div className='text-lg font-light'> <div className="text-lg font-light">افزودن روش ارسال</div>
افزودن روش ارسال
</div>
<div> <div>
<Button <Button
className='px-5' className="px-5"
onClick={() => formik.handleSubmit()} onClick={() => formik.handleSubmit()}
isloading={isPending} isloading={isPending}
> >
<div className='flex gap-2 items-center'> <div className="flex gap-2 items-center">
<TickCircle className='size-5' color='white' /> <TickCircle className="size-5" color="white" />
<div>ثبت روش ارسال</div> <div>ثبت روش ارسال</div>
</div> </div>
</Button> </Button>
</div> </div>
</div> </div>
<div className="mt-6">
<div className="bg-white rounded-3xl p-6">
<div className='mt-6'> <div className="flex">
<div className='bg-white rounded-3xl p-6'>
<div className='flex'>
<Switch <Switch
active={formik.values.enabled} active={formik.values.enabled}
onChange={(value) => formik.setFieldValue('enabled', value)} onChange={(value) => formik.setFieldValue("enabled", value)}
label='فعال' label="فعال"
/> />
</div> </div>
<div className='my-4'> <div className="my-4">
<Select <Select
label='روش ارسال' label="روش ارسال"
name='method' name="method"
value={formik.values.method} value={formik.values.method}
onChange={(e) => { onChange={(e) => {
formik.handleChange(e) formik.handleChange(e);
if (e.target.value !== DeliveryMethodEnum.DeliveryCourier) { if (e.target.value !== DeliveryMethodEnum.DeliveryCourier) {
setDeliveryFeeType(DeliveryFeeTypeEnum.FIXED) setDeliveryFeeType(DeliveryFeeTypeEnum.FIXED);
formik.setFieldValue('perKilometerFee', 0) formik.setFieldValue("perKilometerFee", 0);
formik.setFieldValue('distanceBasedMinCost', 0) formik.setFieldValue("distanceBasedMinCost", 0);
} }
}} }}
items={shipmentMethods} items={shipmentMethods}
placeholder='روش ارسال را انتخاب کنید' placeholder="روش ارسال را انتخاب کنید"
error_text={formik.touched.method && formik.errors.method ? formik.errors.method : ''} error_text={
formik.touched.method && formik.errors.method
? formik.errors.method
: ""
}
/> />
</div> </div>
{formik.values.method && ( {formik.values.method && (
<> <>
{formik.values.method === DeliveryMethodEnum.DeliveryCourier ? ( {formik.values.method === DeliveryMethodEnum.DeliveryCourier ? (
<> <>
<div className='mt-6'> <div className="mt-6">
<div className='text-sm mb-3'>تحویل با پیک</div> <div className="text-sm mb-3">تحویل با پیک</div>
<RadioGroup <RadioGroup
items={[ items={[
{ label: 'ثابت', value: DeliveryFeeTypeEnum.FIXED }, { label: "ثابت", value: DeliveryFeeTypeEnum.FIXED },
{ label: 'بر اساس مسافت', value: DeliveryFeeTypeEnum.DISTANCE_BASED }, {
label: "بر اساس مسافت",
value: DeliveryFeeTypeEnum.DISTANCE_BASED,
},
]} ]}
selected={deliveryFeeType} selected={deliveryFeeType}
onChange={(value) => { onChange={(value) => {
setDeliveryFeeType(value as string) setDeliveryFeeType(value as string);
if (value === DeliveryFeeTypeEnum.FIXED) { if (value === DeliveryFeeTypeEnum.FIXED) {
formik.setFieldValue('perKilometerFee', 0) formik.setFieldValue("perKilometerFee", 0);
formik.setFieldValue('distanceBasedMinCost', 0) formik.setFieldValue("distanceBasedMinCost", 0);
} else { } else {
formik.setFieldValue('deliveryFee', 0) formik.setFieldValue("deliveryFee", 0);
} }
formik.validateForm() formik.validateForm();
}} }}
/> />
</div> </div>
{isFixedDeliveryFee ? ( {isFixedDeliveryFee ? (
<div className='mt-6'> <div className="mt-6">
<Input <Input
label='هزینه ارسال' label="هزینه ارسال"
name='deliveryFee' name="deliveryFee"
type='number' type="number"
value={formik.values.deliveryFee ?? ''} value={formik.values.deliveryFee ?? ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value) const value =
formik.setFieldValue('deliveryFee', 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.deliveryFee &&
formik.errors.deliveryFee
? formik.errors.deliveryFee
: ""
}
/> />
</div> </div>
) : ( ) : (
<> <>
<div className='mt-6'> <div className="mt-6">
<Input <Input
label='هزینه ارسال به ازای هر کیلومتر' label="هزینه ارسال به ازای هر کیلومتر"
name='perKilometerFee' name="perKilometerFee"
type='number' type="number"
value={formik.values.perKilometerFee ?? ''} value={formik.values.perKilometerFee ?? ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value) const value =
formik.setFieldValue('perKilometerFee', value) e.target.value === ""
? 0
: Number(e.target.value);
formik.setFieldValue("perKilometerFee", value);
}} }}
error_text={formik.touched.perKilometerFee && formik.errors.perKilometerFee ? formik.errors.perKilometerFee : ''} error_text={
formik.touched.perKilometerFee &&
formik.errors.perKilometerFee
? formik.errors.perKilometerFee
: ""
}
/> />
</div> </div>
<div className='mt-6'> <div className="mt-6">
<Input <Input
label='حداقل هزینه برای روش کیلوتری' label="حداقل هزینه برای روش کیلوتری"
name='distanceBasedMinCost' name="distanceBasedMinCost"
type='number' type="number"
value={formik.values.distanceBasedMinCost ?? ''} value={formik.values.distanceBasedMinCost ?? ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value) const value =
formik.setFieldValue('distanceBasedMinCost', value) e.target.value === ""
? 0
: Number(e.target.value);
formik.setFieldValue("distanceBasedMinCost", value);
}} }}
error_text={formik.touched.distanceBasedMinCost && formik.errors.distanceBasedMinCost ? formik.errors.distanceBasedMinCost : ''} error_text={
formik.touched.distanceBasedMinCost &&
formik.errors.distanceBasedMinCost
? formik.errors.distanceBasedMinCost
: ""
}
/> />
</div> </div>
</> </>
)} )}
</> </>
) : ( ) : (
<div className='mt-6'> <div className="mt-6">
<Input <Input
label='هزینه ارسال' label="هزینه ارسال"
name='deliveryFee' name="deliveryFee"
type='number' type="number"
value={formik.values.deliveryFee ?? ''} value={formik.values.deliveryFee ?? ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value) const value =
formik.setFieldValue('deliveryFee', 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.deliveryFee && formik.errors.deliveryFee
? formik.errors.deliveryFee
: ""
}
/> />
</div> </div>
)} )}
</> </>
)} )}
<div className='mt-6'> <div className="mt-6">
<Input <Input
label='حداقل قیمت سفارش' label="حداقل قیمت سفارش"
name='minOrderPrice' name="minOrderPrice"
type='number' type="number"
value={formik.values.minOrderPrice ?? ''} value={formik.values.minOrderPrice ?? ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value) const value =
formik.setFieldValue('minOrderPrice', value) e.target.value === "" ? 0 : Number(e.target.value);
formik.setFieldValue("minOrderPrice", value);
}} }}
error_text={formik.touched.minOrderPrice && formik.errors.minOrderPrice ? formik.errors.minOrderPrice : ''} error_text={
formik.touched.minOrderPrice && formik.errors.minOrderPrice
? formik.errors.minOrderPrice
: ""
}
/> />
</div> </div>
<div className='mt-6'> <div className="mt-6">
<Textarea <Textarea
label='توضیحات' label="توضیحات"
name='description' name="description"
value={formik.values.description} value={formik.values.description}
onChange={formik.handleChange} onChange={formik.handleChange}
error_text={formik.touched.description && formik.errors.description ? formik.errors.description : ''} error_text={
/> formik.touched.description && formik.errors.description
</div> ? formik.errors.description
<div className='mt-6'> : ""
<Input
label='ترتیب'
name='order'
type='number'
value={formik.values.order ?? ''}
onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value)
formik.setFieldValue('order', value)
}}
error_text={formik.touched.order && formik.errors.order ? formik.errors.order : ''}
/>
</div>
</div>
</div>
</div>
)
} }
/>
</div>
<div className="mt-6">
<Input
label="ترتیب"
name="order"
type="number"
value={formik.values.order ?? ""}
onChange={(e) => {
const value =
e.target.value === "" ? 0 : Number(e.target.value);
formik.setFieldValue("order", value);
}}
error_text={
formik.touched.order && formik.errors.order
? formik.errors.order
: ""
}
/>
</div>
</div>
</div>
</div>
);
};
export default CreateShipmentMethod export default CreateShipmentMethod;
+243 -164
View File
@@ -1,42 +1,60 @@
import { type FC, useMemo, useState, useEffect } from 'react' import Button from "@/components/Button";
import { useFormik } from 'formik' import Input from "@/components/Input";
import * as Yup from 'yup' import RadioGroup from "@/components/RadioGroup";
import { TickCircle } from 'iconsax-react' import Select from "@/components/Select";
import { toast } from 'react-toastify' import Switch from "@/components/Switch";
import { useNavigate, useParams } from 'react-router-dom' import Textarea from "@/components/Textarea";
import Button from '@/components/Button' import { extractErrorMessage } from "@/config/func";
import Input from '@/components/Input' import { Pages } from "@/config/Pages";
import Select from '@/components/Select' import type { ErrorType } from "@/helpers/types";
import Switch from '@/components/Switch' import { useFormik } from "formik";
import Textarea from '@/components/Textarea' import { TickCircle } from "iconsax-react";
import RadioGroup from '@/components/RadioGroup' import { type FC, useEffect, useMemo, useState } from "react";
import type { CreateShipmentMethodType } from './types/Types' import { useTranslation } from "react-i18next";
import { useUpdateRestaurantShipmentMethod, useGetRestaurantShipmentMethod } from './hooks/useShipmentMethodData' import { useNavigate, useParams } from "react-router-dom";
import { DeliveryMethodEnum, DeliveryFeeTypeEnum } from './enum/Enum' import { toast } from "react-toastify";
import { Pages } from '@/config/Pages' import * as Yup from "yup";
import type { ErrorType } from '@/helpers/types' import { DeliveryFeeTypeEnum, DeliveryMethodEnum } from "./enum/Enum";
import { extractErrorMessage } from '@/config/func' import {
import { useTranslation } from 'react-i18next' useGetRestaurantShipmentMethod,
useUpdateRestaurantShipmentMethod,
} from "./hooks/useShipmentMethodData";
import type { CreateShipmentMethodType } from "./types/Types";
const UpdateShipmentMethod: FC = () => { const UpdateShipmentMethod: FC = () => {
const { t } = useTranslation("global");
const { t } = useTranslation('global') const navigate = useNavigate();
const navigate = useNavigate() const { id } = useParams<{ id: string }>();
const { id } = useParams<{ id: string }>() const { mutate: updateRestaurantShipmentMethod, isPending } =
const { mutate: updateRestaurantShipmentMethod, isPending } = useUpdateRestaurantShipmentMethod() useUpdateRestaurantShipmentMethod();
const { data: shipmentMethodData, isLoading } = useGetRestaurantShipmentMethod(id || '') const { data: shipmentMethodData, isLoading } =
const [deliveryFeeType, setDeliveryFeeType] = useState<string>(DeliveryFeeTypeEnum.FIXED) useGetRestaurantShipmentMethod(id || "");
const [deliveryFeeType, setDeliveryFeeType] = useState<string>(
DeliveryFeeTypeEnum.FIXED,
);
const shipmentMethods = [ const shipmentMethods = [
{ label: t(`shipment.${DeliveryMethodEnum.DineIn}`), value: DeliveryMethodEnum.DineIn }, {
{ label: t(`shipment.${DeliveryMethodEnum.CustomerPickup}`), value: DeliveryMethodEnum.CustomerPickup }, label: t(`shipment.${DeliveryMethodEnum.DineIn}`),
{ label: t(`shipment.${DeliveryMethodEnum.DeliveryCar}`), value: DeliveryMethodEnum.DeliveryCar }, value: DeliveryMethodEnum.DineIn,
{ label: t(`shipment.${DeliveryMethodEnum.DeliveryCourier}`), value: DeliveryMethodEnum.DeliveryCourier }, },
] {
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<CreateShipmentMethodType>(() => { const initialValues = useMemo<CreateShipmentMethodType>(() => {
if (shipmentMethodData?.data) { if (shipmentMethodData?.data) {
const data = shipmentMethodData.data const data = shipmentMethodData.data;
return { return {
method: data.method, method: data.method,
deliveryFee: data.deliveryFee, deliveryFee: data.deliveryFee,
@@ -46,268 +64,329 @@ const UpdateShipmentMethod: FC = () => {
order: data.order, order: data.order,
perKilometerFee: data.perKilometerFee ?? 0, perKilometerFee: data.perKilometerFee ?? 0,
distanceBasedMinCost: data.distanceBasedMinCost ?? 0, distanceBasedMinCost: data.distanceBasedMinCost ?? 0,
} };
} }
return { return {
method: '', method: "",
deliveryFee: 0, deliveryFee: 0,
minOrderPrice: 0, minOrderPrice: 0,
description: '', description: "",
enabled: true, enabled: true,
order: 0, order: 0,
perKilometerFee: 0, perKilometerFee: 0,
distanceBasedMinCost: 0, distanceBasedMinCost: 0,
} };
}, [shipmentMethodData]) }, [shipmentMethodData]);
useEffect(() => { useEffect(() => {
if (shipmentMethodData?.data) { if (shipmentMethodData?.data) {
const data = shipmentMethodData.data const data = shipmentMethodData.data;
const hasDistanceBased = data.perKilometerFee && data.perKilometerFee > 0 const hasDistanceBased = data.perKilometerFee && data.perKilometerFee > 0;
if (hasDistanceBased) { if (hasDistanceBased) {
setDeliveryFeeType(DeliveryFeeTypeEnum.DISTANCE_BASED) setDeliveryFeeType(DeliveryFeeTypeEnum.DISTANCE_BASED);
} else { } else {
setDeliveryFeeType(DeliveryFeeTypeEnum.FIXED) setDeliveryFeeType(DeliveryFeeTypeEnum.FIXED);
} }
} }
}, [shipmentMethodData]) }, [shipmentMethodData]);
const isFixedDeliveryFee = deliveryFeeType === DeliveryFeeTypeEnum.FIXED const isFixedDeliveryFee = deliveryFeeType === DeliveryFeeTypeEnum.FIXED;
const formik = useFormik<CreateShipmentMethodType>({ const formik = useFormik<CreateShipmentMethodType>({
initialValues, initialValues,
enableReinitialize: true, enableReinitialize: true,
validationSchema: Yup.object().shape({ validationSchema: Yup.object().shape({
method: Yup.string().required('روش ارسال الزامی است'), method: Yup.string().required("روش ارسال الزامی است"),
deliveryFee: Yup.number().min(0, 'هزینه ارسال باید مثبت باشد'), deliveryFee: Yup.number().min(0, "هزینه ارسال باید مثبت باشد"),
perKilometerFee: Yup.number().min(0, 'هزینه ارسال به ازای هر کیلومتر باید مثبت باشد'), perKilometerFee: Yup.number().min(
distanceBasedMinCost: Yup.number().min(0, 'حداقل هزینه برای روش کیلوتری باید مثبت باشد'), 0,
minOrderPrice: Yup.number().required('حداقل قیمت سفارش الزامی است').min(0, 'حداقل قیمت سفارش باید مثبت باشد'), "هزینه ارسال به ازای هر کیلومتر باید مثبت باشد",
description: Yup.string().required('توضیحات الزامی است'), ),
distanceBasedMinCost: Yup.number().min(
0,
"حداقل هزینه برای روش کیلوتری باید مثبت باشد",
),
minOrderPrice: Yup.number()
.required("حداقل قیمت سفارش الزامی است")
.min(0, "حداقل قیمت سفارش باید مثبت باشد"),
// description: Yup.string().required('توضیحات الزامی است'),
enabled: Yup.boolean(), enabled: Yup.boolean(),
order: Yup.number().required('ترتیب الزامی است').min(0, 'ترتیب باید مثبت باشد'), order: Yup.number()
.required("ترتیب الزامی است")
.min(0, "ترتیب باید مثبت باشد"),
}), }),
validate: (values) => { validate: (values) => {
const errors: Record<string, string> = {} const errors: Record<string, string> = {};
if (values.method === DeliveryMethodEnum.DeliveryCourier) { if (values.method === DeliveryMethodEnum.DeliveryCourier) {
if (isFixedDeliveryFee) { if (isFixedDeliveryFee) {
if (!values.deliveryFee || values.deliveryFee <= 0) { if (values.deliveryFee == null || values.deliveryFee < 0) {
errors.deliveryFee = 'هزینه ارسال الزامی است' errors.deliveryFee = "هزینه ارسال الزامی است";
} }
} else { } else {
if (!values.perKilometerFee || values.perKilometerFee <= 0) { if (!values.perKilometerFee || values.perKilometerFee <= 0) {
errors.perKilometerFee = 'هزینه ارسال به ازای هر کیلومتر الزامی است' errors.perKilometerFee =
"هزینه ارسال به ازای هر کیلومتر الزامی است";
} }
if (!values.distanceBasedMinCost || values.distanceBasedMinCost <= 0) { if (
errors.distanceBasedMinCost = 'حداقل هزینه برای روش کیلوتری الزامی است' !values.distanceBasedMinCost ||
values.distanceBasedMinCost <= 0
) {
errors.distanceBasedMinCost =
"حداقل هزینه برای روش کیلوتری الزامی است";
} }
} }
} else { } else {
if (!values.deliveryFee || values.deliveryFee <= 0) { if (values.deliveryFee == null || values.deliveryFee < 0) {
errors.deliveryFee = 'هزینه ارسال الزامی است' errors.deliveryFee = "هزینه ارسال الزامی است";
} }
} }
return errors return errors;
}, },
onSubmit: (values) => { onSubmit: (values) => {
if (!id) return if (!id) return;
updateRestaurantShipmentMethod( updateRestaurantShipmentMethod(
{ id, params: values }, { id, params: values },
{ {
onSuccess: () => { onSuccess: () => {
toast.success('روش ارسال با موفقیت ویرایش شد') toast.success("روش ارسال با موفقیت ویرایش شد");
navigate(Pages.shipment_methods.list) navigate(Pages.shipment_methods.list);
}, },
onError: (error: ErrorType) => { onError: (error: ErrorType) => {
toast.error(extractErrorMessage(error)) toast.error(extractErrorMessage(error));
}, },
}
)
}, },
}) );
},
});
if (isLoading) { if (isLoading) {
return ( return (
<div className='mt-5'> <div className="mt-5">
<div className='text-lg font-light'>در حال بارگذاری...</div> <div className="text-lg font-light">در حال بارگذاری...</div>
</div> </div>
) );
} }
return ( return (
<div className='mt-5'> <div className="mt-5">
<div className='flex w-full justify-between items-center'> <div className="flex w-full justify-between items-center">
<div className='text-lg font-light'> <div className="text-lg font-light">ویرایش روش ارسال</div>
ویرایش روش ارسال
</div>
<div> <div>
<Button <Button
className='px-5' className="px-5"
onClick={() => formik.handleSubmit()} onClick={() => formik.handleSubmit()}
isloading={isPending} isloading={isPending}
> >
<div className='flex gap-2 items-center'> <div className="flex gap-2 items-center">
<TickCircle className='size-5' color='white' /> <TickCircle className="size-5" color="white" />
<div>ثبت تغییرات</div> <div>ثبت تغییرات</div>
</div> </div>
</Button> </Button>
</div> </div>
</div> </div>
<div className='mt-6'> <div className="mt-6">
<div className='bg-white rounded-3xl p-6'> <div className="bg-white rounded-3xl p-6">
<div className='flex'> <div className="flex">
<Switch <Switch
active={formik.values.enabled} active={formik.values.enabled}
onChange={(value) => formik.setFieldValue('enabled', value)} onChange={(value) => formik.setFieldValue("enabled", value)}
label='فعال' label="فعال"
/> />
</div> </div>
<div className='my-4'> <div className="my-4">
<Select <Select
label='روش ارسال' label="روش ارسال"
name='method' name="method"
value={formik.values.method} value={formik.values.method}
onChange={(e) => { onChange={(e) => {
formik.handleChange(e) formik.handleChange(e);
if (e.target.value !== DeliveryMethodEnum.DeliveryCourier) { if (e.target.value !== DeliveryMethodEnum.DeliveryCourier) {
setDeliveryFeeType(DeliveryFeeTypeEnum.FIXED) setDeliveryFeeType(DeliveryFeeTypeEnum.FIXED);
formik.setFieldValue('perKilometerFee', 0) formik.setFieldValue("perKilometerFee", 0);
formik.setFieldValue('distanceBasedMinCost', 0) formik.setFieldValue("distanceBasedMinCost", 0);
} }
}} }}
items={shipmentMethods} items={shipmentMethods}
placeholder='روش ارسال را انتخاب کنید' placeholder="روش ارسال را انتخاب کنید"
error_text={formik.touched.method && formik.errors.method ? formik.errors.method : ''} error_text={
formik.touched.method && formik.errors.method
? formik.errors.method
: ""
}
/> />
</div> </div>
{formik.values.method && ( {formik.values.method && (
<> <>
{formik.values.method === DeliveryMethodEnum.DeliveryCourier ? ( {formik.values.method === DeliveryMethodEnum.DeliveryCourier ? (
<> <>
<div className='mt-6'> <div className="mt-6">
<div className='text-sm mb-3'>تحویل با پیک</div> <div className="text-sm mb-3">تحویل با پیک</div>
<RadioGroup <RadioGroup
items={[ items={[
{ label: 'ثابت', value: DeliveryFeeTypeEnum.FIXED }, { label: "ثابت", value: DeliveryFeeTypeEnum.FIXED },
{ label: 'بر اساس مسافت', value: DeliveryFeeTypeEnum.DISTANCE_BASED }, {
label: "بر اساس مسافت",
value: DeliveryFeeTypeEnum.DISTANCE_BASED,
},
]} ]}
selected={deliveryFeeType} selected={deliveryFeeType}
onChange={(value) => { onChange={(value) => {
setDeliveryFeeType(value as string) setDeliveryFeeType(value as string);
if (value === DeliveryFeeTypeEnum.FIXED) { if (value === DeliveryFeeTypeEnum.FIXED) {
formik.setFieldValue('perKilometerFee', 0) formik.setFieldValue("perKilometerFee", 0);
formik.setFieldValue('distanceBasedMinCost', 0) formik.setFieldValue("distanceBasedMinCost", 0);
} else { } else {
formik.setFieldValue('deliveryFee', 0) formik.setFieldValue("deliveryFee", 0);
} }
formik.validateForm() formik.validateForm();
}} }}
/> />
</div> </div>
{isFixedDeliveryFee ? ( {isFixedDeliveryFee ? (
<div className='mt-6'> <div className="mt-6">
<Input <Input
label='هزینه ارسال' label="هزینه ارسال"
name='deliveryFee' name="deliveryFee"
type='number' type="number"
value={formik.values.deliveryFee ?? ''} value={formik.values.deliveryFee ?? ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value) const value =
formik.setFieldValue('deliveryFee', 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.deliveryFee &&
formik.errors.deliveryFee
? formik.errors.deliveryFee
: ""
}
/> />
</div> </div>
) : ( ) : (
<> <>
<div className='mt-6'> <div className="mt-6">
<Input <Input
label='هزینه ارسال به ازای هر کیلومتر' label="هزینه ارسال به ازای هر کیلومتر"
name='perKilometerFee' name="perKilometerFee"
type='number' type="number"
value={formik.values.perKilometerFee ?? ''} value={formik.values.perKilometerFee ?? ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value) const value =
formik.setFieldValue('perKilometerFee', value) e.target.value === ""
? 0
: Number(e.target.value);
formik.setFieldValue("perKilometerFee", value);
}} }}
error_text={formik.touched.perKilometerFee && formik.errors.perKilometerFee ? formik.errors.perKilometerFee : ''} error_text={
formik.touched.perKilometerFee &&
formik.errors.perKilometerFee
? formik.errors.perKilometerFee
: ""
}
/> />
</div> </div>
<div className='mt-6'> <div className="mt-6">
<Input <Input
label='حداقل هزینه برای روش کیلوتری' label="حداقل هزینه برای روش کیلوتری"
name='distanceBasedMinCost' name="distanceBasedMinCost"
type='number' type="number"
value={formik.values.distanceBasedMinCost ?? ''} value={formik.values.distanceBasedMinCost ?? ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value) const value =
formik.setFieldValue('distanceBasedMinCost', value) e.target.value === ""
? 0
: Number(e.target.value);
formik.setFieldValue("distanceBasedMinCost", value);
}} }}
error_text={formik.touched.distanceBasedMinCost && formik.errors.distanceBasedMinCost ? formik.errors.distanceBasedMinCost : ''} error_text={
formik.touched.distanceBasedMinCost &&
formik.errors.distanceBasedMinCost
? formik.errors.distanceBasedMinCost
: ""
}
/> />
</div> </div>
</> </>
)} )}
</> </>
) : ( ) : (
<div className='mt-6'> <div className="mt-6">
<Input <Input
label='هزینه ارسال' label="هزینه ارسال"
name='deliveryFee' name="deliveryFee"
type='number' type="number"
value={formik.values.deliveryFee ?? ''} value={formik.values.deliveryFee ?? ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value) const value =
formik.setFieldValue('deliveryFee', 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.deliveryFee && formik.errors.deliveryFee
? formik.errors.deliveryFee
: ""
}
/> />
</div> </div>
)} )}
</> </>
)} )}
<div className='mt-6'> <div className="mt-6">
<Input <Input
label='حداقل قیمت سفارش' label="حداقل قیمت سفارش"
name='minOrderPrice' name="minOrderPrice"
type='number' type="number"
value={formik.values.minOrderPrice ?? ''} value={formik.values.minOrderPrice ?? ""}
onChange={(e) => { onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value) const value =
formik.setFieldValue('minOrderPrice', value) e.target.value === "" ? 0 : Number(e.target.value);
formik.setFieldValue("minOrderPrice", value);
}} }}
error_text={formik.touched.minOrderPrice && formik.errors.minOrderPrice ? formik.errors.minOrderPrice : ''} error_text={
formik.touched.minOrderPrice && formik.errors.minOrderPrice
? formik.errors.minOrderPrice
: ""
}
/> />
</div> </div>
<div className='mt-6'> <div className="mt-6">
<Textarea <Textarea
label='توضیحات' label="توضیحات"
name='description' name="description"
value={formik.values.description} value={formik.values.description}
onChange={formik.handleChange} onChange={formik.handleChange}
error_text={formik.touched.description && formik.errors.description ? formik.errors.description : ''} error_text={
/> formik.touched.description && formik.errors.description
</div> ? formik.errors.description
<div className='mt-6'> : ""
<Input
label='ترتیب'
name='order'
type='number'
value={formik.values.order ?? ''}
onChange={(e) => {
const value = e.target.value === '' ? 0 : Number(e.target.value)
formik.setFieldValue('order', value)
}}
error_text={formik.touched.order && formik.errors.order ? formik.errors.order : ''}
/>
</div>
</div>
</div>
</div>
)
} }
/>
</div>
<div className="mt-6">
<Input
label="ترتیب"
name="order"
type="number"
value={formik.values.order ?? ""}
onChange={(e) => {
const value =
e.target.value === "" ? 0 : Number(e.target.value);
formik.setFieldValue("order", value);
}}
error_text={
formik.touched.order && formik.errors.order
? formik.errors.order
: ""
}
/>
</div>
</div>
</div>
</div>
);
};
export default UpdateShipmentMethod export default UpdateShipmentMethod;