From 2403a314d9aa9b020bf9195c667bc4c048669739 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sun, 7 Dec 2025 09:05:40 +0330 Subject: [PATCH] change create coupon --- src/pages/coupon/Create.tsx | 19 +++++++++++-------- .../coupon/components/CategorySelector.tsx | 16 ++++++++-------- .../coupon/components/CouponBasicInfo.tsx | 17 ----------------- .../coupon/components/CouponUsageSettings.tsx | 17 ++++++++++++++++- src/pages/coupon/components/FoodSelector.tsx | 16 ++++++++-------- src/pages/coupon/types/Types.ts | 7 ++++--- src/shared/SideBar.tsx | 2 +- 7 files changed, 48 insertions(+), 46 deletions(-) diff --git a/src/pages/coupon/Create.tsx b/src/pages/coupon/Create.tsx index 6562c55..80effc6 100644 --- a/src/pages/coupon/Create.tsx +++ b/src/pages/coupon/Create.tsx @@ -23,7 +23,6 @@ const CreateCoupon: FC = () => { const { data: categoriesData } = useGetCategories() const { data: foodsData } = useGetFoods() - const [discountType, setDiscountType] = useState<'DIRECT' | 'CODE'>('CODE') const [couponType, setCouponType] = useState<'PERCENTAGE' | 'FIXED'>('PERCENTAGE') const categories = useMemo(() => categoriesData?.data || [], [categoriesData?.data]) @@ -34,7 +33,6 @@ const CreateCoupon: FC = () => { code: '', name: '', description: '', - type: 'PERCENTAGE', value: 0, maxDiscount: null, minOrderAmount: 0, @@ -43,14 +41,16 @@ const CreateCoupon: FC = () => { startDate: null, endDate: null, isActive: true, - categoryIds: [], - foodIds: [], + foodCategories: [], + foods: [], + userPhone: '', + type: 'PERCENTAGE', }, validationSchema: Yup.object().shape({ + type: Yup.string().required('نوع کوپن الزامی است'), code: Yup.string().required('کد کوپن الزامی است'), name: Yup.string().required('نام کوپن الزامی است'), description: Yup.string(), - type: Yup.string().required('نوع کوپن الزامی است'), value: Yup.number().min(0, 'مقدار باید بیشتر از صفر باشد').required('مقدار کوپن الزامی است'), maxDiscount: Yup.number().nullable().min(0, 'حداکثر تخفیف باید بیشتر از صفر باشد'), minOrderAmount: Yup.number().min(0, 'حداقل مبلغ سفارش باید بیشتر از صفر باشد').required('حداقل مبلغ سفارش الزامی است'), @@ -58,9 +58,14 @@ const CreateCoupon: FC = () => { maxUsesPerUser: Yup.number().nullable().min(0, 'حداکثر استفاده برای هر کاربر باید بیشتر از صفر باشد'), startDate: Yup.string().nullable(), endDate: Yup.string().nullable(), + userPhone: Yup.string().nullable(), }), onSubmit: (values) => { - createCoupon(values, { + const submitValues = { + ...values, + userPhone: values.userPhone?.trim() || undefined, + } + createCoupon(submitValues, { onSuccess: () => { toast.success('کوپن با موفقیت ایجاد شد') navigate(Pages.coupons.list) @@ -98,8 +103,6 @@ const CreateCoupon: FC = () => { = ({ formik, categories }) => }, [categories, search]) const handleToggle = (categoryId: string, checked: boolean) => { - const currentIds = formik.values.categoryIds || [] + const currentIds = formik.values.foodCategories || [] if (checked) { - formik.setFieldValue('categoryIds', [...currentIds, categoryId]) + formik.setFieldValue('foodCategories', [...currentIds, categoryId]) } else { - formik.setFieldValue('categoryIds', currentIds.filter((id) => id !== categoryId)) + formik.setFieldValue('foodCategories', currentIds.filter((id) => id !== categoryId)) } } const handleSelectAll = (checked: boolean) => { if (checked) { - formik.setFieldValue('categoryIds', filteredCategories.map((cat) => cat.id)) + formik.setFieldValue('foodCategories', filteredCategories.map((cat) => cat.id)) } else { - formik.setFieldValue('categoryIds', []) + formik.setFieldValue('foodCategories', []) } } const isAllSelected = useMemo(() => { return filteredCategories.length > 0 && - filteredCategories.every((cat) => formik.values.categoryIds?.includes(cat.id)) - }, [filteredCategories, formik.values.categoryIds]) + filteredCategories.every((cat) => formik.values.foodCategories?.includes(cat.id)) + }, [filteredCategories, formik.values.foodCategories]) return (
@@ -68,7 +68,7 @@ const CategorySelector: FC = ({ formik, categories }) => {filteredCategories.map((category) => (
handleToggle(category.id, checked as boolean) } diff --git a/src/pages/coupon/components/CouponBasicInfo.tsx b/src/pages/coupon/components/CouponBasicInfo.tsx index 5a6d53f..a6df2ca 100644 --- a/src/pages/coupon/components/CouponBasicInfo.tsx +++ b/src/pages/coupon/components/CouponBasicInfo.tsx @@ -3,7 +3,6 @@ import { Refresh } from 'iconsax-react' import type { FormikProps } from 'formik' import Input from '@/components/Input' import Textarea from '@/components/Textarea' -import RadioGroup from '@/components/RadioGroup' import Button from '@/components/Button' import type { CreateCouponType } from '../types/Types' import { useGenerateCouponCode } from '../hooks/useCouponData' @@ -12,14 +11,10 @@ import { toast } from 'react-toastify' interface CouponBasicInfoProps { formik: FormikProps - discountType: 'DIRECT' | 'CODE' - onDiscountTypeChange: (value: 'DIRECT' | 'CODE') => void } const CouponBasicInfo: FC = ({ formik, - discountType, - onDiscountTypeChange, }) => { const { mutate: generateCouponCode, isPending: isGenerating } = useGenerateCouponCode() @@ -38,18 +33,6 @@ const CouponBasicInfo: FC = ({ return ( <> -
-
نوع تخفیف
- onDiscountTypeChange(value as 'DIRECT' | 'CODE')} - /> -
-
diff --git a/src/pages/coupon/components/CouponUsageSettings.tsx b/src/pages/coupon/components/CouponUsageSettings.tsx index 08cde35..a544d35 100644 --- a/src/pages/coupon/components/CouponUsageSettings.tsx +++ b/src/pages/coupon/components/CouponUsageSettings.tsx @@ -42,7 +42,7 @@ const CouponUsageSettings: FC = ({ formik }) => { />
-
+
= ({ formik }) => { }} />
+ +
+ { + const value = e.target.value.trim() + formik.setFieldValue('userPhone', value || undefined) + }} + error_text={formik.touched.userPhone && formik.errors.userPhone ? formik.errors.userPhone : ''} + /> +
) } diff --git a/src/pages/coupon/components/FoodSelector.tsx b/src/pages/coupon/components/FoodSelector.tsx index 2bd588e..747602f 100644 --- a/src/pages/coupon/components/FoodSelector.tsx +++ b/src/pages/coupon/components/FoodSelector.tsx @@ -25,26 +25,26 @@ const FoodSelector: FC = ({ formik, foods }) => { }, [foods, search]) const handleToggle = (foodId: string, checked: boolean) => { - const currentIds = formik.values.foodIds || [] + const currentIds = formik.values.foods || [] if (checked) { - formik.setFieldValue('foodIds', [...currentIds, foodId]) + formik.setFieldValue('foods', [...currentIds, foodId]) } else { - formik.setFieldValue('foodIds', currentIds.filter((id) => id !== foodId)) + formik.setFieldValue('foods', currentIds.filter((id) => id !== foodId)) } } const handleSelectAll = (checked: boolean) => { if (checked) { - formik.setFieldValue('foodIds', filteredFoods.map((food) => food.id)) + formik.setFieldValue('foods', filteredFoods.map((food) => food.id)) } else { - formik.setFieldValue('foodIds', []) + formik.setFieldValue('foods', []) } } const isAllSelected = useMemo(() => { return filteredFoods.length > 0 && - filteredFoods.every((food) => formik.values.foodIds?.includes(food.id)) - }, [filteredFoods, formik.values.foodIds]) + filteredFoods.every((food) => formik.values.foods?.includes(food.id)) + }, [filteredFoods, formik.values.foods]) return (
@@ -68,7 +68,7 @@ const FoodSelector: FC = ({ formik, foods }) => { {filteredFoods.map((food) => (
handleToggle(food.id, checked as boolean) } diff --git a/src/pages/coupon/types/Types.ts b/src/pages/coupon/types/Types.ts index 1d78b11..7809596 100644 --- a/src/pages/coupon/types/Types.ts +++ b/src/pages/coupon/types/Types.ts @@ -30,7 +30,6 @@ export type CreateCouponType = { code: string; name: string; description: string; - type: CouponType; value: number; maxDiscount: number | null; minOrderAmount: number; @@ -39,6 +38,8 @@ export type CreateCouponType = { startDate: string | null; endDate: string | null; isActive: boolean; - categoryIds?: string[]; - foodIds?: string[]; + foodCategories?: string[]; + foods?: string[]; + userPhone?: string; + type: CouponType; }; diff --git a/src/shared/SideBar.tsx b/src/shared/SideBar.tsx index d48d16d..faf8a1f 100644 --- a/src/shared/SideBar.tsx +++ b/src/shared/SideBar.tsx @@ -142,7 +142,7 @@ const SideBar: FC = () => { icon={} title={t('sidebar.discount')} isActive={isActive('discounts')} - link={Pages.discount.list} + link={Pages.coupons.list} name='discounts' activeName='discounts' />