Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -88,7 +88,7 @@ export function ProgramPartnersApplicationsPageClient() {
});

const { executeAsync: rejectPartners, isPending: isRejectingPartners } =
useAction(rejectPartnersBulkAction, {
useAction(bulkRejectPartnersAction, {
onError: ({ error }) => {
toast.error(error.serverError);
},
Expand Down
4 changes: 2 additions & 2 deletions apps/web/lib/actions/partners/bulk-approve-partners.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
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";

// 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
20 changes: 14 additions & 6 deletions apps/web/lib/partners/sort-rewards-by-event-order.ts
Original file line number Diff line number Diff line change
@@ -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<T extends Pick<Reward, "event">>(
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) => {
Expand Down
4 changes: 2 additions & 2 deletions apps/web/lib/zod/schemas/partners.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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())
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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);

Expand All @@ -52,7 +53,7 @@ export function EarningsCalculatorBlock({
htmlFor={`${id}-slider`}
className="text-base font-semibold text-neutral-700"
>
Customer sales
Customer referrals
</label>
<div className="mt-1.5">
<NumberFlow
Expand Down