From 0f104996d0fd54d59a2f29fdc66aa9d1536340f0 Mon Sep 17 00:00:00 2001 From: Steven Tey Date: Thu, 4 Jun 2026 15:41:57 -0700 Subject: [PATCH] Improve `markApplicationEventSubmitted` --- .../partners/applications/page-client.tsx | 22 ++++---- .../partners/create-program-application.ts | 4 +- .../update-application-event.ts | 55 +++++++++++++------ .../partners/complete-program-applications.ts | 4 +- apps/web/ui/partners/partner-info-cards.tsx | 6 +- 5 files changed, 59 insertions(+), 32 deletions(-) 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 3259082c66d..14fba3b6cbd 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 @@ -13,6 +13,7 @@ import { useBulkRejectPartnersModal } from "@/ui/modals/bulk-reject-partners-mod import { useRejectPartnerApplicationModal } from "@/ui/modals/reject-partner-application-modal"; import { GroupColorCircle } from "@/ui/partners/groups/group-color-circle"; import { PartnerApplicationSheet } from "@/ui/partners/partner-application-sheet"; +import { PartnerApplicationSource } from "@/ui/partners/partner-application-source"; import { PartnerRowItem } from "@/ui/partners/partner-row-item"; import { PartnerSocialColumn } from "@/ui/partners/partner-social-column"; import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state"; @@ -196,17 +197,16 @@ export function ProgramPartnersApplicationsPageClient() { header: "Applied", accessorFn: (d) => formatDate(d.createdAt, { month: "short" }), }, - // TODO: add source column back once we fix application source display - // { - // id: "source", - // header: "Source", - // minSize: 170, - // cell: ({ row }) => ( - // - // ), - // }, + { + id: "source", + header: "Source", + minSize: 170, + cell: ({ row }) => ( + + ), + }, { id: "group", header: "Group", diff --git a/apps/web/lib/actions/partners/create-program-application.ts b/apps/web/lib/actions/partners/create-program-application.ts index e819bed0437..170d7f0e307 100644 --- a/apps/web/lib/actions/partners/create-program-application.ts +++ b/apps/web/lib/actions/partners/create-program-application.ts @@ -381,7 +381,9 @@ async function createApplicationAndEnrollment({ }, }), - markApplicationEventSubmitted(programEnrollment), + markApplicationEventSubmitted(programEnrollment, { + partnerNetworkStatus: partner.networkStatus, + }), ]); })(), ); diff --git a/apps/web/lib/application-events/update-application-event.ts b/apps/web/lib/application-events/update-application-event.ts index 141e8f79760..10b1e908236 100644 --- a/apps/web/lib/application-events/update-application-event.ts +++ b/apps/web/lib/application-events/update-application-event.ts @@ -1,5 +1,5 @@ import { prisma } from "@dub/prisma"; -import { Prisma } from "@dub/prisma/client"; +import { PartnerNetworkStatus, Prisma } from "@dub/prisma/client"; import { cookies } from "next/headers"; import { getApplicationEventCookieName } from "./utils"; @@ -7,14 +7,14 @@ import { getApplicationEventCookieName } from "./utils"; // event via the browser cookie and backfill partnerId + submittedAt. // Fallback to the (programId, partnerId) lookup if no cookie is present (e.g. the // partner visited while already logged in on a different browser). -export async function markApplicationEventSubmitted({ - programId, - partnerId, - applicationId, -}: Pick< - Prisma.ProgramEnrollmentCreateManyInput, - "programId" | "partnerId" | "applicationId" ->) { +export async function markApplicationEventSubmitted( + programEnrollment: Pick< + Prisma.ProgramEnrollmentCreateManyInput, + "programId" | "partnerId" | "applicationId" + >, + { partnerNetworkStatus }: { partnerNetworkStatus: PartnerNetworkStatus }, +) { + const { programId, partnerId, applicationId } = programEnrollment; const cookieStore = await cookies(); const cookieName = getApplicationEventCookieName(programId); const applicationEventId = cookieStore.get(cookieName)?.value; @@ -25,21 +25,44 @@ export async function markApplicationEventSubmitted({ return; } + const applicationEvent = await prisma.programApplicationEvent.findUnique({ + where: { + ...(applicationEventId + ? { id: applicationEventId } + : { programId_partnerId: { programId, partnerId } }), + }, + }); + + if (!applicationEvent) { + console.error( + "[markApplicationEventSubmitted]: No application event found, skipping...", + ); + return; + } + try { - await prisma.programApplicationEvent.updateMany({ + await prisma.programApplicationEvent.update({ where: { - ...(applicationEventId - ? { id: applicationEventId } - : { programId, partnerId }), - submittedAt: null, + id: applicationEvent.id, }, data: { - partnerId, submittedAt: new Date(), + partnerId, programApplicationId: applicationId, + ...(applicationEvent.referralSource === "marketplace" && + !["approved", "trusted"].includes(partnerNetworkStatus) + ? { + referralSource: "direct", + } + : {}), }, }); - } catch {} + } catch (error) { + console.error( + "[markApplicationEventSubmitted]: Error updating application event:", + error, + ); + } } export async function trackApplicationEvents({ diff --git a/apps/web/lib/partners/complete-program-applications.ts b/apps/web/lib/partners/complete-program-applications.ts index 20e08f0be32..bd477cb6dba 100644 --- a/apps/web/lib/partners/complete-program-applications.ts +++ b/apps/web/lib/partners/complete-program-applications.ts @@ -260,7 +260,9 @@ export async function completeProgramApplications(userEmail: string) { await Promise.allSettled( programEnrollments.map((programEnrollment) => - markApplicationEventSubmitted(programEnrollment), + markApplicationEventSubmitted(programEnrollment, { + partnerNetworkStatus: partner.networkStatus, + }), ), ); } catch (error) { diff --git a/apps/web/ui/partners/partner-info-cards.tsx b/apps/web/ui/partners/partner-info-cards.tsx index ce4181a8345..087be5e28c0 100644 --- a/apps/web/ui/partners/partner-info-cards.tsx +++ b/apps/web/ui/partners/partner-info-cards.tsx @@ -45,6 +45,7 @@ import { PartnerFraudBanner, } from "./fraud-risks/partner-fraud-banner"; import { PartnerFraudIndicator } from "./fraud-risks/partner-fraud-indicator"; +import { PartnerApplicationSource } from "./partner-application-source"; import { PartnerAvatar } from "./partner-avatar"; import { PartnerInfoGroup } from "./partner-info-group"; import { PartnerStarButton } from "./partner-star-button"; @@ -175,8 +176,7 @@ export function PartnerInfoCards({ > Applied {formatDate(partner.createdAt)} - {/* TODO: add source column back once we fix application source display */} - {/* {applicationReferralSource && ( + {applicationReferralSource && ( <> via - )} */} + )} ) : ( `${isPendingApplication ? "Applied" : "Partner since"} ${formatDate(partner.createdAt)}`