Skip to content

Commit

Permalink
chore: address reviews
Browse files Browse the repository at this point in the history
  • Loading branch information
riqwan committed May 13, 2024
1 parent 0145798 commit 0021adc
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 51 deletions.
3 changes: 1 addition & 2 deletions packages/admin-next/dashboard/src/types/api-payloads.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import {
CreateShippingProfileDTO,
CreateStockLocationInput,
InventoryNext,
ShippingOptionDTO,
UpdateApiKeyDTO,
UpdateCampaignDTO,
UpdateCustomerDTO,
Expand Down Expand Up @@ -102,7 +101,7 @@ export type DeletePriceListPricesReq = { ids: string[] }

// Promotion
export type CreatePromotionReq = CreatePromotionDTO
export type UpdatePromotionReq = UpdatePromotionDTO
export type UpdatePromotionReq = Omit<UpdatePromotionDTO, "id">
export type BatchAddPromotionRulesReq = { rules: CreatePromotionRuleDTO[] }
export type BatchRemovePromotionRulesReq = { rule_ids: string[] }
export type BatchUpdatePromotionRulesReq = { rules: UpdatePromotionRuleDTO[] }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { CreateCampaignFormFields } from "../../../common/components/create-camp
export const CreateCampaignSchema = zod.object({
name: zod.string().min(1),
description: zod.string().optional(),
currency: zod.string(),
currency: zod.string().min(1),
campaign_identifier: zod.string().min(1),
starts_at: zod.date().optional(),
ends_at: zod.date().optional(),
Expand All @@ -26,10 +26,10 @@ export const CreateCampaignSchema = zod.object({
})

export const defaultCampaignValues = {
name: undefined,
description: undefined,
currency: undefined,
campaign_identifier: undefined,
name: "",
description: "",
currency: "",
campaign_identifier: "",
starts_at: undefined,
ends_at: undefined,
budget: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
Select,
Text,
} from "@medusajs/ui"
import { useEffect } from "react"
import { useWatch } from "react-hook-form"
import { useTranslation } from "react-i18next"
import { Form } from "../../../../../components/common/form"
Expand All @@ -28,6 +29,10 @@ export const CreateCampaignFormFields = ({ form, fieldScope = "" }) => {
name: `${fieldScope}currency`,
})

useEffect(() => {
form.setValue(`${fieldScope}budget.limit`, undefined)
}, [watchValueType])

return (
<div className="flex w-full max-w-[720px] flex-col gap-y-8">
<div>
Expand Down Expand Up @@ -243,6 +248,7 @@ export const CreateCampaignFormFields = ({ form, fieldScope = "" }) => {
/>
) : (
<Input
type="number"
key="usage"
min={0}
{...field}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,38 @@
import { CampaignDTO, PromotionDTO } from "@medusajs/types"
import { zodResolver } from "@hookform/resolvers/zod"
import { CampaignResponse, PromotionDTO } from "@medusajs/types"
import { Button, clx, RadioGroup, Select } from "@medusajs/ui"
import { useWatch } from "react-hook-form"
import { useEffect } from "react"
import { useForm, useWatch } from "react-hook-form"
import { useTranslation } from "react-i18next"
import * as zod from "zod"
import { CampaignDetails } from "./campaign-details"

import { useEffect } from "react"
import { Form } from "../../../../../components/common/form"
import { RouteDrawer } from "../../../../../components/route-modal"
import { defaultCampaignValues } from "../../../../campaigns/campaign-create/components/create-campaign-form/create-campaign-form"
import {
RouteDrawer,
useRouteModal,
} from "../../../../../components/route-modal"
import { useUpdatePromotion } from "../../../../../hooks/api/promotions"
import { CreateCampaignFormFields } from "../../../../campaigns/common/components/create-campaign-form-fields"
import { CampaignDetails } from "./campaign-details"

type EditPromotionFormProps = {
promotion: PromotionDTO
campaigns: CampaignDTO[]
campaigns: CampaignResponse[]
}

const EditPromotionSchema = zod.object({
campaign_id: zod.string().optional(),
existing: zod.string().toLowerCase(),
campaign_id: zod.string().optional().nullable(),
campaign_choice: zod.enum(["none", "existing"]).optional(),
})

export const AddCampaignPromotionFields = ({ form, campaigns }) => {
export const AddCampaignPromotionFields = ({
form,
campaigns,
withNewCampaign = true,
}: {
form: any
campaigns: CampaignResponse[]
withNewCampaign?: boolean
}) => {
const { t } = useTranslation()
const watchCampaignId = useWatch({
control: form.control,
Expand All @@ -33,24 +44,6 @@ export const AddCampaignPromotionFields = ({ form, campaigns }) => {
name: "campaign_choice",
})

useEffect(() => {
const formData = form.getValues()

if (watchCampaignChoice !== "existing") {
form.setValue("campaign_id", undefined)
}

if (watchCampaignChoice !== "new") {
form.setValue("campaign", undefined)
}

if (watchCampaignChoice === "new") {
if (!formData.campaign) {
form.setValue("campaign", defaultCampaignValues)
}
}
}, [watchCampaignChoice])

const selectedCampaign = campaigns.find((c) => c.id === watchCampaignId)

return (
Expand Down Expand Up @@ -92,15 +85,19 @@ export const AddCampaignPromotionFields = ({ form, campaigns }) => {
})}
/>

<RadioGroup.ChoiceBox
value={"new"}
label={t("promotions.form.campaign.new.title")}
description={t("promotions.form.campaign.new.description")}
className={clx("border", {
"border border-ui-border-interactive":
"new" === field.value,
})}
/>
{withNewCampaign && (
<RadioGroup.ChoiceBox
value={"new"}
label={t("promotions.form.campaign.new.title")}
description={t(
"promotions.form.campaign.new.description"
)}
className={clx("border", {
"border border-ui-border-interactive":
"new" === field.value,
})}
/>
)}
</RadioGroup>
</Form.Control>

Expand Down Expand Up @@ -163,7 +160,7 @@ export const AddCampaignPromotionForm = ({
const form = useForm<zod.infer<typeof EditPromotionSchema>>({
defaultValues: {
campaign_id: campaign?.id,
existing: "true",
campaign_choice: campaign?.id ? "existing" : "none",
},
resolver: zodResolver(EditPromotionSchema),
})
Expand All @@ -176,11 +173,30 @@ export const AddCampaignPromotionForm = ({
)
})

const watchCampaignChoice = useWatch({
control: form.control,
name: "campaign_choice",
})

useEffect(() => {
if (watchCampaignChoice === "none") {
form.setValue("campaign_id", null)
}

if (watchCampaignChoice === "existing") {
form.setValue("campaign_id", campaign?.id)
}
}, [watchCampaignChoice])

return (
<RouteDrawer.Form form={form}>
<form onSubmit={handleSubmit} className="flex h-full flex-col">
<RouteDrawer.Body>
<AddCampaignPromotionFields form={form} campaigns={campaigns} />
<AddCampaignPromotionFields
form={form}
campaigns={campaigns}
withNewCampaign={false}
/>
</RouteDrawer.Body>

<RouteDrawer.Footer>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { CampaignDTO } from "@medusajs/types"
import { CampaignResponse } from "@medusajs/types"
import { Heading, Text } from "@medusajs/ui"
import { Fragment } from "react"
import { useTranslation } from "react-i18next"

type CampaignDetailsProps = {
campaign?: CampaignDTO
campaign?: CampaignResponse
}

export const CampaignDetails = ({ campaign }: CampaignDetailsProps) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {
} from "../../../../../components/route-modal"
import { useCreatePromotion } from "../../../../../hooks/api/promotions"
import { getCurrencySymbol } from "../../../../../lib/currencies"
import { defaultCampaignValues } from "../../../../campaigns/campaign-create/components/create-campaign-form"
import { RulesFormField } from "../../../common/edit-rules/components/edit-rules-form"
import { AddCampaignPromotionFields } from "../../../promotion-add-campaign/components/add-campaign-promotion-form"
import { Tab } from "./constants"
Expand Down Expand Up @@ -89,6 +90,7 @@ export const CreatePromotionForm = ({
target_rules: generateRuleAttributes(targetRules),
buy_rules: generateRuleAttributes(buyRules),
},
campaign: undefined,
},
resolver: zodResolver(CreatePromotionSchema),
})
Expand Down Expand Up @@ -296,6 +298,29 @@ export const CreatePromotionForm = ({
return "not-started"
}, [detailsValidated])

const watchCampaignChoice = useWatch({
control: form.control,
name: "campaign_choice",
})

useEffect(() => {
const formData = form.getValues()

if (watchCampaignChoice !== "existing") {
form.setValue("campaign_id", undefined)
}

if (watchCampaignChoice !== "new") {
form.setValue("campaign", undefined)
}

if (watchCampaignChoice === "new") {
if (!formData.campaign || !formData.campaign?.budget?.type) {
form.setValue("campaign", defaultCampaignValues)
}
}
}, [watchCampaignChoice])

return (
<RouteFocusModal.Form form={form}>
<form
Expand Down
4 changes: 2 additions & 2 deletions packages/medusa/src/api-v2/admin/promotions/validators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ export const AdminCreatePromotion = z
code: z.string(),
is_automatic: z.boolean().optional(),
type: z.nativeEnum(PromotionType),
campaign_id: z.string().optional(),
campaign_id: z.string().optional().nullable(),
campaign: AdminCreateCampaign.optional(),
application_method: AdminCreateApplicationMethod,
rules: z.array(AdminCreatePromotionRule).optional(),
Expand All @@ -181,7 +181,7 @@ export const AdminUpdatePromotion = z
code: z.string().optional(),
is_automatic: z.boolean().optional(),
type: z.nativeEnum(PromotionType).optional(),
campaign_id: z.string().optional(),
campaign_id: z.string().optional().nullable(),
campaign: AdminCreateCampaign.optional(),
application_method: AdminUpdateApplicationMethod.optional(),
rules: z.array(AdminCreatePromotionRule).optional(),
Expand Down

0 comments on commit 0021adc

Please sign in to comment.