diff --git a/src/api/backend/schemas/discounts/discountSchema.ts b/src/api/backend/schemas/discounts/discountSchema.ts index 501e7e7..8322a96 100644 --- a/src/api/backend/schemas/discounts/discountSchema.ts +++ b/src/api/backend/schemas/discounts/discountSchema.ts @@ -1,6 +1,12 @@ import z from 'zod'; -import { discountEligibilities, discountMethods, discountTargets, discountValueTypes } from '../../const'; +import { + discountEligibilities, + discountMethods, + discountTargets, + discountValueTypes, + paymentMethods, +} from '../../const'; import { Brand, Category, SearchUser, VariantWithProduct } from '../../types'; export const discountSchema = z.object({ @@ -21,6 +27,7 @@ export const discountSchema = z.object({ brands: z.array(z.custom()).optional(), eligibility: z.enum(discountEligibilities), eligibleUsers: z.array(z.custom()).optional(), + paymentMethods: z.array(z.enum(paymentMethods)).optional(), }); export type DiscountSchema = z.infer; diff --git a/src/api/backend/types.ts b/src/api/backend/types.ts index 2707d84..7fb7a7f 100644 --- a/src/api/backend/types.ts +++ b/src/api/backend/types.ts @@ -319,6 +319,7 @@ export interface Discount { categories: Category[]; brands: Brand[]; eligibleUsers: SearchUser[]; + paymentMethods: PaymentMethod[] | null; createdAt: string; updatedAt: string; } diff --git a/src/app/(hydration)/(base)/discounts/[id]/page.tsx b/src/app/(hydration)/(base)/discounts/[id]/page.tsx index 4944c01..1eb621e 100644 --- a/src/app/(hydration)/(base)/discounts/[id]/page.tsx +++ b/src/app/(hydration)/(base)/discounts/[id]/page.tsx @@ -10,6 +10,7 @@ import { DiscountApplicability, DiscountEligibility, DiscountStatus, + DiscountPaymentMethods, } from '@/components'; import { useDiscountQuery } from '@/hooks'; import { PagePropsWithParams } from '@/app/types'; @@ -44,6 +45,8 @@ export default async function EditDiscount(props: PagePropsWithParams<{ id: stri + + diff --git a/src/app/(hydration)/(base)/discounts/add/page.tsx b/src/app/(hydration)/(base)/discounts/add/page.tsx index 10d8e6e..b706017 100644 --- a/src/app/(hydration)/(base)/discounts/add/page.tsx +++ b/src/app/(hydration)/(base)/discounts/add/page.tsx @@ -8,6 +8,7 @@ import { DiscountRestrictions, DiscountApplicability, DiscountEligibility, + DiscountPaymentMethods, } from '@/components'; export const metadata: Metadata = { title: 'Gamers Core | Discounts | Add Discount' }; @@ -24,6 +25,8 @@ export default async function AddDiscount() { + + diff --git a/src/components/discounts/DiscountForm.tsx b/src/components/discounts/DiscountForm.tsx index 5a53f1f..fc2828d 100644 --- a/src/components/discounts/DiscountForm.tsx +++ b/src/components/discounts/DiscountForm.tsx @@ -52,4 +52,5 @@ const mapDiscountToSchema = (discount: Discount): DiscountSchema => ({ usageLimitPerUser: discount.usageLimitPerUser ?? undefined, startsAt: discount.startsAt ?? undefined, expiresAt: discount.expiresAt ?? undefined, + paymentMethods: discount.paymentMethods ?? undefined, }); diff --git a/src/components/discounts/DiscountPaymentMethods.tsx b/src/components/discounts/DiscountPaymentMethods.tsx new file mode 100644 index 0000000..c2a1f71 --- /dev/null +++ b/src/components/discounts/DiscountPaymentMethods.tsx @@ -0,0 +1,61 @@ +'use client'; + +import { Controller, useFormContext } from 'react-hook-form'; + +import { paymentMethods, DiscountSchema } from '@/api'; + +import { Field, FieldError, FieldGroup } from '../ui'; +import { Button } from '../Button'; + +export const DiscountPaymentMethods = () => { + const form = useFormContext(); + + return ( +
+

Payment Methods

+ + + { + const selected = field.value ?? []; + + const toggle = (method: (typeof paymentMethods)[number]) => { + const next = selected.includes(method) ? selected.filter((m) => m !== method) : [...selected, method]; + + field.onChange(next.length ? next : undefined); + }; + + return ( + <> + + {paymentMethods.map((method) => ( + + ))} + + +

+ {selected.length + ? 'Discount only applies to selected payment methods.' + : 'Applies to all payment methods.'} +

+ + {fieldState.invalid && ( + + )} + + ); + }} + /> +
+
+ ); +}; diff --git a/src/components/discounts/index.ts b/src/components/discounts/index.ts index b7a0ca3..7805bd5 100644 --- a/src/components/discounts/index.ts +++ b/src/components/discounts/index.ts @@ -9,3 +9,4 @@ export * from './DiscountRestrictions'; export * from './DiscountApplicability'; export * from './DiscountEligibility'; export * from './DiscountUsagesModal'; +export * from './DiscountPaymentMethods';