From f93daee912875bf5229fbe7a36b07c6be1f709af Mon Sep 17 00:00:00 2001 From: Steven Tey Date: Thu, 31 Jul 2025 09:45:31 -0700 Subject: [PATCH] Fix reward order --- .../partners/applications/page-client.tsx | 4 ++-- .../actions/partners/bulk-approve-partners.ts | 4 ++-- ...rtners-bulk.ts => bulk-reject-partners.ts} | 6 +++--- .../partners/sort-rewards-by-event-order.ts | 20 +++++++++++++------ apps/web/lib/zod/schemas/partners.ts | 4 ++-- .../blocks/earnings-calculator-block.tsx | 5 +++-- 6 files changed, 26 insertions(+), 17 deletions(-) rename apps/web/lib/actions/partners/{reject-partners-bulk.ts => bulk-reject-partners.ts} (91%) diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/page-client.tsx index 4db2d2959c4..cdbf2c9ff0f 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/page-client.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/partners/applications/page-client.tsx @@ -1,8 +1,8 @@ "use client"; import { bulkApprovePartnersAction } from "@/lib/actions/partners/bulk-approve-partners"; +import { bulkRejectPartnersAction } from "@/lib/actions/partners/bulk-reject-partners"; import { rejectPartnerAction } from "@/lib/actions/partners/reject-partner"; -import { rejectPartnersBulkAction } from "@/lib/actions/partners/reject-partners-bulk"; import { mutatePrefix } from "@/lib/swr/mutate"; import usePartner from "@/lib/swr/use-partner"; import usePartnersCount from "@/lib/swr/use-partners-count"; @@ -88,7 +88,7 @@ export function ProgramPartnersApplicationsPageClient() { }); const { executeAsync: rejectPartners, isPending: isRejectingPartners } = - useAction(rejectPartnersBulkAction, { + useAction(bulkRejectPartnersAction, { onError: ({ error }) => { toast.error(error.serverError); }, diff --git a/apps/web/lib/actions/partners/bulk-approve-partners.ts b/apps/web/lib/actions/partners/bulk-approve-partners.ts index b84a362c151..480ebd116e8 100644 --- a/apps/web/lib/actions/partners/bulk-approve-partners.ts +++ b/apps/web/lib/actions/partners/bulk-approve-partners.ts @@ -3,7 +3,7 @@ import { getDefaultProgramIdOrThrow } from "@/lib/api/programs/get-default-program-id-or-throw"; import { bulkApprovePartners } from "@/lib/partners/bulk-approve-partners"; import { getProgramApplicationRewardsAndDiscount } from "@/lib/partners/get-program-application-rewards"; -import { approvePartnersBulkSchema } from "@/lib/zod/schemas/partners"; +import { bulkApprovePartnersSchema } from "@/lib/zod/schemas/partners"; import { ProgramWithLanderDataSchema } from "@/lib/zod/schemas/programs"; import { prisma } from "@dub/prisma"; import { authActionClient } from "../safe-action"; @@ -11,7 +11,7 @@ import { authActionClient } from "../safe-action"; // Approve partners applications in bulk // A referral link will be created for each partner export const bulkApprovePartnersAction = authActionClient - .schema(approvePartnersBulkSchema) + .schema(bulkApprovePartnersSchema) .action(async ({ parsedInput, ctx }) => { const { workspace, user } = ctx; const programId = getDefaultProgramIdOrThrow(workspace); diff --git a/apps/web/lib/actions/partners/reject-partners-bulk.ts b/apps/web/lib/actions/partners/bulk-reject-partners.ts similarity index 91% rename from apps/web/lib/actions/partners/reject-partners-bulk.ts rename to apps/web/lib/actions/partners/bulk-reject-partners.ts index f6e5b3e9f28..c4d81306121 100644 --- a/apps/web/lib/actions/partners/reject-partners-bulk.ts +++ b/apps/web/lib/actions/partners/bulk-reject-partners.ts @@ -2,15 +2,15 @@ import { recordAuditLog } from "@/lib/api/audit-logs/record-audit-log"; import { getDefaultProgramIdOrThrow } from "@/lib/api/programs/get-default-program-id-or-throw"; -import { rejectPartnersBulkSchema } from "@/lib/zod/schemas/partners"; +import { bulkRejectPartnersSchema } from "@/lib/zod/schemas/partners"; import { prisma } from "@dub/prisma"; import { ProgramEnrollmentStatus } from "@prisma/client"; import { waitUntil } from "@vercel/functions"; import { authActionClient } from "../safe-action"; // Reject a list of pending partners -export const rejectPartnersBulkAction = authActionClient - .schema(rejectPartnersBulkSchema) +export const bulkRejectPartnersAction = authActionClient + .schema(bulkRejectPartnersSchema) .action(async ({ parsedInput, ctx }) => { const { workspace, user } = ctx; const { partnerIds } = parsedInput; diff --git a/apps/web/lib/partners/sort-rewards-by-event-order.ts b/apps/web/lib/partners/sort-rewards-by-event-order.ts index aa5b07e3c80..30ad105829a 100644 --- a/apps/web/lib/partners/sort-rewards-by-event-order.ts +++ b/apps/web/lib/partners/sort-rewards-by-event-order.ts @@ -1,14 +1,22 @@ -import { Reward } from "@prisma/client"; +import { EventType, Reward } from "@prisma/client"; -const REWARD_EVENT_ORDER = ["click", "lead", "sale"] as const; - -const eventOrderMap = new Map( - REWARD_EVENT_ORDER.map((event, index) => [event, index]), -); +const DEFAULT_REWARD_EVENT_ORDER = [ + EventType.click, + EventType.lead, + EventType.sale, +] as const; export function sortRewardsByEventOrder>( rewards: T[], + customEventOrder?: (typeof DEFAULT_REWARD_EVENT_ORDER)[number][], ): T[] { + const finalEventOrder = (customEventOrder ?? + DEFAULT_REWARD_EVENT_ORDER) as EventType[]; + + const eventOrderMap = new Map( + finalEventOrder.map((event, index) => [event, index]), + ); + const sortedRewards = [...rewards]; sortedRewards.sort((a, b) => { diff --git a/apps/web/lib/zod/schemas/partners.ts b/apps/web/lib/zod/schemas/partners.ts index 331fef5a44f..a9f3515598f 100644 --- a/apps/web/lib/zod/schemas/partners.ts +++ b/apps/web/lib/zod/schemas/partners.ts @@ -533,7 +533,7 @@ export const approvePartnerSchema = z.object({ linkId: z.string().nullable(), }); -export const approvePartnersBulkSchema = z.object({ +export const bulkApprovePartnersSchema = z.object({ workspaceId: z.string(), partnerIds: z .array(z.string()) @@ -547,7 +547,7 @@ export const rejectPartnerSchema = z.object({ partnerId: z.string(), }); -export const rejectPartnersBulkSchema = z.object({ +export const bulkRejectPartnersSchema = z.object({ workspaceId: z.string(), partnerIds: z .array(z.string()) diff --git a/apps/web/ui/partners/lander/blocks/earnings-calculator-block.tsx b/apps/web/ui/partners/lander/blocks/earnings-calculator-block.tsx index 739eeb558d8..5dc80860357 100644 --- a/apps/web/ui/partners/lander/blocks/earnings-calculator-block.tsx +++ b/apps/web/ui/partners/lander/blocks/earnings-calculator-block.tsx @@ -1,6 +1,7 @@ "use client"; import { getProgramApplicationRewardsAndDiscount } from "@/lib/partners/get-program-application-rewards"; +import { sortRewardsByEventOrder } from "@/lib/partners/sort-rewards-by-event-order"; import { ProgramWithLanderDataProps } from "@/lib/types"; import { programLanderEarningsCalculatorBlockSchema } from "@/lib/zod/schemas/program-lander"; import { InvoiceDollar } from "@dub/ui"; @@ -31,7 +32,7 @@ export function EarningsCalculatorBlock({ if (!rewards.length) return null; - const reward = rewards[0]; + const reward = sortRewardsByEventOrder(rewards, ["sale", "lead", "click"])[0]; const rewardAmount = reward.amount ?? 0; const revenue = value * ((block.data.productPrice || 30_00) / 100); @@ -52,7 +53,7 @@ export function EarningsCalculatorBlock({ htmlFor={`${id}-slider`} className="text-base font-semibold text-neutral-700" > - Customer sales + Customer referrals