import { type FC, useState, useMemo, useEffect } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { useFormik } from 'formik' import * as Yup from 'yup' import { TickCircle } from 'iconsax-react' import { toast } from 'react-toastify' import Button from '@/components/Button' import type { CreateCouponType } from './types/Types' import { useGetCouponDetails, useUpdateCoupon } from './hooks/useCouponData' import { useGetCategories } from '@/pages/food/hooks/useFoodData' import { useGetFoods } from '@/pages/food/hooks/useFoodData' import { Pages } from '@/config/Pages' import type { ErrorType } from '@/helpers/types' import { extractErrorMessage } from '@/config/func' import CouponBasicInfo from './components/CouponBasicInfo' import CouponDiscountSettings from './components/CouponDiscountSettings' import CouponUsageSettings from './components/CouponUsageSettings' import CouponSidebar from './components/CouponSidebar' const UpdateCoupon: FC = () => { const navigate = useNavigate() const { id } = useParams<{ id: string }>() const { data: couponData, isLoading } = useGetCouponDetails(id || '') const { mutate: updateCoupon, isPending: isUpdating } = useUpdateCoupon() const { data: categoriesData } = useGetCategories() const { data: foodsData } = useGetFoods() const [couponType, setCouponType] = useState<'PERCENTAGE' | 'FIXED'>('PERCENTAGE') const categories = useMemo(() => categoriesData?.data || [], [categoriesData?.data]) const foods = useMemo(() => foodsData?.data || [], [foodsData?.data]) const formik = useFormik({ initialValues: { code: '', name: '', description: '', value: 0, maxDiscount: null, minOrderAmount: 0, maxUses: 0, maxUsesPerUser: null, startDate: null, endDate: null, isActive: true, foodCategories: [], foods: [], userPhone: '', type: 'PERCENTAGE', }, validationSchema: Yup.object().shape({ type: Yup.string().required('نوع کوپن الزامی است'), code: Yup.string().required('کد کوپن الزامی است'), name: Yup.string().required('نام کوپن الزامی است'), description: Yup.string(), value: Yup.number().min(0, 'مقدار باید بیشتر از صفر باشد').required('مقدار کوپن الزامی است'), maxDiscount: Yup.number().nullable().min(0, 'حداکثر تخفیف باید بیشتر از صفر باشد'), minOrderAmount: Yup.number().min(0, 'حداقل مبلغ سفارش باید بیشتر از صفر باشد').required('حداقل مبلغ سفارش الزامی است'), maxUses: Yup.number().min(0, 'حداکثر استفاده باید بیشتر از صفر باشد').required('حداکثر استفاده الزامی است'), maxUsesPerUser: Yup.number().nullable().min(0, 'حداکثر استفاده برای هر کاربر باید بیشتر از صفر باشد'), startDate: Yup.string().nullable(), endDate: Yup.string().nullable(), userPhone: Yup.string().nullable(), }), enableReinitialize: true, onSubmit: (values) => { if (!id) { toast.error('شناسه کوپن یافت نشد') return } const submitValues = { ...values, userPhone: values.userPhone?.trim() || undefined, } updateCoupon( { id, params: submitValues }, { onSuccess: () => { toast.success('کوپن با موفقیت به‌روزرسانی شد') navigate(Pages.coupons.list) }, onError: (error: ErrorType) => { toast.error(extractErrorMessage(error)) }, } ) }, }) useEffect(() => { if (couponData?.data) { const coupon = couponData.data setCouponType(coupon.type) formik.setValues({ code: coupon.code, name: coupon.name, description: coupon.description || '', value: coupon.value, maxDiscount: coupon.maxDiscount, minOrderAmount: coupon.minOrderAmount, maxUses: coupon.maxUses, maxUsesPerUser: coupon.maxUsesPerUser, startDate: coupon.startDate, endDate: coupon.endDate, isActive: coupon.isActive, foodCategories: coupon.foodCategories || [], foods: coupon.foods || [], userPhone: coupon.userPhone || '', type: coupon.type, }) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [couponData?.data]) if (isLoading) { return (
در حال بارگذاری...
) } return (

ویرایش کد تخفیف

ویرایش کد تخفیف
{ formik.values.startDate && ( ) }
) } export default UpdateCoupon