diff --git a/src/config/Pages.ts b/src/config/Pages.ts index 36b2209..b8a9a7c 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -36,6 +36,8 @@ export const Pages = { groups: "/customers/groups", groupsAdd: "/customers/groups/add", groupsUpdate: "/customers/groups/update/", + campaigns: "/customers/campaigns", + campaignsAdd: "/customers/campaigns/add", }, discount: { list: "/discounts/list", diff --git a/src/langs/fa.json b/src/langs/fa.json index 352d2bd..4b2829b 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -105,7 +105,8 @@ "add_discount": "افزودن تخفیف", "customers_list": "لیست مشتریان", "add_customer": "افزودن مشتری", - "groups": "گروه مشتری" + "groups": "گروه مشتری", + "campaigns": "کمپین‌ها" }, "guide": { "list_guide": "لیست راهنمای سرویس", diff --git a/src/pages/customers/campaigns/Create.tsx b/src/pages/customers/campaigns/Create.tsx new file mode 100644 index 0000000..a35ad76 --- /dev/null +++ b/src/pages/customers/campaigns/Create.tsx @@ -0,0 +1,152 @@ +import Button from "@/components/Button"; +import Input from "@/components/Input"; +import MultiSelect from "@/components/MultiSelect"; +import Select from "@/components/Select"; +import { extractErrorMessage } from "@/config/func"; +import { Pages } from "@/config/Pages"; +import type { ErrorType } from "@/helpers/types"; +import { useFormik } from "formik"; +import { TickCircle } from "iconsax-react"; +import { type FC, useMemo } from "react"; +import { useNavigate } from "react-router-dom"; +import { toast } from "react-toastify"; +import * as Yup from "yup"; +import { useGetUserGroups } from "@/pages/customers/groups/hooks/useUserGroupData"; +import { useCreateDiscountCampaign } from "./hooks/useCampaignData"; +import type { CreateDiscountCampaignType } from "./types/Types"; + +const sentTypeOptions = [ + { value: "push", label: "پوش نوتیفیکیشن" }, + { value: "sms", label: "پیامک" }, +]; + +const CreateCampaign: FC = () => { + const navigate = useNavigate(); + const { mutate: createCampaign, isPending } = useCreateDiscountCampaign(); + const { data: groupsData } = useGetUserGroups(); + + const groupOptions = useMemo( + () => + (groupsData?.data || []).map((group) => ({ + value: group.id, + label: group.name, + })), + [groupsData] + ); + + const formik = useFormik({ + initialValues: { + title: "", + groups: [], + sentType: "push", + discountCode: "", + ocasion: "", + }, + validationSchema: Yup.object().shape({ + title: Yup.string().required("عنوان کمپین الزامی است"), + groups: Yup.array() + .of(Yup.string()) + .min(1, "حداقل یک گروه باید انتخاب شود"), + sentType: Yup.string().required("نوع ارسال الزامی است"), + discountCode: Yup.string().required("کد تخفیف الزامی است"), + ocasion: Yup.string().required("مناسبت الزامی است"), + }), + onSubmit: (values) => { + createCampaign(values, { + onSuccess: () => { + toast.success("کمپین با موفقیت ایجاد شد"); + navigate(Pages.customers.campaigns); + }, + onError: (error: ErrorType) => { + toast.error(extractErrorMessage(error)); + }, + }); + }, + }); + + return ( +
+
+
افزودن کمپین تخفیف
+ +
+ +
+
+ + + + + + + -
+
+
{id && } diff --git a/src/router/Main.tsx b/src/router/Main.tsx index 1b06ce3..b6d544d 100644 --- a/src/router/Main.tsx +++ b/src/router/Main.tsx @@ -53,6 +53,8 @@ import UpdateSlider from '@/pages/sliders/Update' import UserGroupsList from '@/pages/customers/groups/List' import CreateUserGroup from '@/pages/customers/groups/Create' import UpdateUserGroup from '@/pages/customers/groups/Update' +import CampaignsList from '@/pages/customers/campaigns/List' +import CreateCampaign from '@/pages/customers/campaigns/Create' const MainRouter: FC = () => { const { hasSubMenu } = useSharedStore() @@ -84,6 +86,8 @@ const MainRouter: FC = () => { } /> } /> } /> + } /> + } /> } /> } /> } /> diff --git a/src/shared/components/CustomersSubMenu.tsx b/src/shared/components/CustomersSubMenu.tsx index e4c1afe..4407b66 100644 --- a/src/shared/components/CustomersSubMenu.tsx +++ b/src/shared/components/CustomersSubMenu.tsx @@ -25,6 +25,7 @@ const CustomersSubMenu: FC = () => { +
);