diff --git a/apps/web/app/(app)/[emailAccountId]/onboarding/page.tsx b/apps/web/app/(app)/[emailAccountId]/onboarding/page.tsx index e598522d87..ba11259fa8 100644 --- a/apps/web/app/(app)/[emailAccountId]/onboarding/page.tsx +++ b/apps/web/app/(app)/[emailAccountId]/onboarding/page.tsx @@ -1,5 +1,6 @@ import { Suspense } from "react"; import type { Metadata } from "next"; +import { cookies } from "next/headers"; import { after } from "next/server"; import { OnboardingContent } from "@/app/(app)/[emailAccountId]/onboarding/OnboardingContent"; import { fetchUserAndStoreUtms } from "@/app/(landing)/welcome/utms"; @@ -21,10 +22,11 @@ export default async function OnboardingPage(props: { const authPromise = auth(); + const cookieStore = await cookies(); after(async () => { const user = await authPromise; if (!user?.user) return; - await fetchUserAndStoreUtms(user.user.id); + await fetchUserAndStoreUtms(user.user.id, cookieStore); }); return ( diff --git a/apps/web/app/(landing)/welcome/page.tsx b/apps/web/app/(landing)/welcome/page.tsx index 3c2f26be85..85593284ab 100644 --- a/apps/web/app/(landing)/welcome/page.tsx +++ b/apps/web/app/(landing)/welcome/page.tsx @@ -1,4 +1,5 @@ import { Suspense } from "react"; +import { cookies } from "next/headers"; import type { Metadata } from "next"; import { after } from "next/server"; import { OnboardingForm } from "@/app/(landing)/welcome/form"; @@ -25,10 +26,11 @@ export default async function WelcomePage(props: { const authPromise = auth(); + const cookieStore = await cookies(); after(async () => { const user = await authPromise; if (!user?.user) return; - await fetchUserAndStoreUtms(user.user.id); + await fetchUserAndStoreUtms(user.user.id, cookieStore); }); return ( diff --git a/apps/web/app/(landing)/welcome/utms.tsx b/apps/web/app/(landing)/welcome/utms.tsx index 03c46fdc89..4fbf6c5c6f 100644 --- a/apps/web/app/(landing)/welcome/utms.tsx +++ b/apps/web/app/(landing)/welcome/utms.tsx @@ -1,10 +1,13 @@ -import { cookies } from "next/headers"; import prisma from "@/utils/prisma"; import { createScopedLogger } from "@/utils/logger"; +import type { ReadonlyRequestCookies } from "next/dist/server/web/spec-extension/adapters/request-cookies"; const logger = createScopedLogger("utms"); -export async function fetchUserAndStoreUtms(userId: string) { +export async function fetchUserAndStoreUtms( + userId: string, + cookies: ReadonlyRequestCookies, +) { const user = await prisma.user .findUnique({ where: { id: userId }, @@ -16,21 +19,19 @@ export async function fetchUserAndStoreUtms(userId: string) { }); if (user && !user.utms) { - await storeUtms(userId).catch((error) => { - logger.error("Failed to store utms", { error, userId }); - }); + await storeUtms(userId, cookies); } } -export async function storeUtms(userId: string) { +// `cookies` passed in as we can't do await cookies() in the `after` hook +async function storeUtms(userId: string, cookies: ReadonlyRequestCookies) { logger.info("Storing utms", { userId }); - const cookieStore = await cookies(); - const utmCampaign = cookieStore.get("utm_campaign"); - const utmMedium = cookieStore.get("utm_medium"); - const utmSource = cookieStore.get("utm_source"); - const utmTerm = cookieStore.get("utm_term"); - const affiliate = cookieStore.get("affiliate"); + const utmCampaign = cookies.get("utm_campaign"); + const utmMedium = cookies.get("utm_medium"); + const utmSource = cookies.get("utm_source"); + const utmTerm = cookies.get("utm_term"); + const affiliate = cookies.get("affiliate"); const utms = { utmCampaign: utmCampaign?.value, @@ -40,10 +41,14 @@ export async function storeUtms(userId: string) { affiliate: affiliate?.value, }; - await prisma.user.update({ - where: { id: userId }, - data: { utms }, - }); + try { + await prisma.user.update({ + where: { id: userId }, + data: { utms }, + }); - logger.info("Stored utms", { utms, userId }); + logger.info("Stored utms", { utms, userId }); + } catch (error) { + logger.error("Failed to store utms", { error, userId }); + } } diff --git a/apps/web/env.ts b/apps/web/env.ts index ac51e78c75..9ca6ed34b2 100644 --- a/apps/web/env.ts +++ b/apps/web/env.ts @@ -164,6 +164,10 @@ export const env = createEnv({ .default(false), NEXT_PUBLIC_AXIOM_DATASET: z.string().optional(), NEXT_PUBLIC_AXIOM_TOKEN: z.string().optional(), + NEXT_PUBLIC_LOG_SCOPES: z + .string() + .optional() + .transform((value) => value?.split(",")), NEXT_PUBLIC_BEDROCK_SONNET_MODEL: z .string() .default("us.anthropic.claude-3-7-sonnet-20250219-v1:0"), @@ -218,6 +222,7 @@ export const env = createEnv({ process.env.NEXT_PUBLIC_WELCOME_UPGRADE_ENABLED, NEXT_PUBLIC_AXIOM_DATASET: process.env.NEXT_PUBLIC_AXIOM_DATASET, NEXT_PUBLIC_AXIOM_TOKEN: process.env.NEXT_PUBLIC_AXIOM_TOKEN, + NEXT_PUBLIC_LOG_SCOPES: process.env.NEXT_PUBLIC_LOG_SCOPES, NEXT_PUBLIC_BEDROCK_SONNET_MODEL: process.env.NEXT_PUBLIC_BEDROCK_SONNET_MODEL, NEXT_PUBLIC_OLLAMA_MODEL: process.env.NEXT_PUBLIC_OLLAMA_MODEL, diff --git a/apps/web/utils/logger.ts b/apps/web/utils/logger.ts index d64fa344b0..91be5291dd 100644 --- a/apps/web/utils/logger.ts +++ b/apps/web/utils/logger.ts @@ -14,13 +14,10 @@ const colors = { reset: "\x1b[0m", } as const; -// const logScopes = new Map(); -// logScopes.set("reply-tracker/outbound", true); -// logScopes.set("outlook/webhook", true); - export function createScopedLogger(scope: string) { if (env.NEXT_PUBLIC_AXIOM_TOKEN) return createAxiomLogger(scope); - // if (!logScopes.has(scope)) return createNullLogger(); + if (env.NEXT_PUBLIC_LOG_SCOPES && !env.NEXT_PUBLIC_LOG_SCOPES.includes(scope)) + return createNullLogger(); const createLogger = (fields: Record = {}) => { const formatMessage = ( @@ -89,15 +86,15 @@ function createAxiomLogger(scope: string) { return createLogger(); } -// function createNullLogger() { -// return { -// info: () => {}, -// error: () => {}, -// warn: () => {}, -// trace: () => {}, -// with: () => createNullLogger(), -// }; -// } +function createNullLogger() { + return { + info: () => {}, + error: () => {}, + warn: () => {}, + trace: () => {}, + with: () => createNullLogger(), + }; +} function formatError(args?: Record) { if (env.NODE_ENV !== "production") return args; diff --git a/version.txt b/version.txt index 2de9a404d9..4b0854b77c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -v2.8.7 +v2.8.8