import { zodResolver } from "@hookform/resolvers/zod" import { Button, toast } from "@medusajs/ui" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import * as zod from "zod" import { RouteFocusModal, useRouteModal, } from "../../../../../components/modals" import { KeyboundForm } from "../../../../../components/utilities/keybound-form" import { VisuallyHidden } from "../../../../../components/utilities/visually-hidden" import { useCreateCampaign } from "../../../../../hooks/api/campaigns" import { CreateCampaignFormFields } from "../../../common/components/create-campaign-form-fields" import { DEFAULT_CAMPAIGN_VALUES } from "../../../common/constants" export const CreateCampaignSchema = zod.object({ name: zod.string().min(1), description: zod.string().optional(), campaign_identifier: zod.string().min(1), starts_at: zod.date().nullable(), ends_at: zod.date().nullable(), budget: zod.object({ attribute: zod.string().nullish(), limit: zod.number().min(0).nullish(), type: zod.enum([ "spend", "usage", "use_by_attribute", "spend_by_attribute", ]), currency_code: zod.string().nullish(), }), }) export const CreateCampaignForm = () => { const { t } = useTranslation() const { handleSuccess } = useRouteModal() const { mutateAsync, isPending } = useCreateCampaign() const form = useForm>({ defaultValues: DEFAULT_CAMPAIGN_VALUES, resolver: zodResolver(CreateCampaignSchema), }) const handleSubmit = form.handleSubmit(async (data) => { const attribute = data.budget.attribute || null const type = attribute ? "use_by_attribute" : data.budget.type await mutateAsync( { name: data.name, description: data.description, campaign_identifier: data.campaign_identifier, starts_at: data.starts_at, ends_at: data.ends_at, budget: { type, attribute, limit: data.budget.limit ? data.budget.limit : undefined, currency_code: data.budget.currency_code, }, }, { onSuccess: ({ campaign }) => { toast.success( t("campaigns.create.successToast", { name: campaign.name, }) ) handleSuccess(`/campaigns/${campaign.id}`) }, onError: (error) => { toast.error(error.message) }, } ) }) return ( {t("campaigns.create.title")} {t("campaigns.create.description")}
) }