Skip to content

Commit edc914b

Browse files
committed
fix(env): avoid crashing when NEXT_PUBLIC vars missing
1 parent f5519a8 commit edc914b

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

common/src/env-schema.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,21 @@ import z from 'zod/v4'
33
export const CLIENT_ENV_PREFIX = 'NEXT_PUBLIC_'
44

55
export const clientEnvSchema = z.object({
6-
NEXT_PUBLIC_CB_ENVIRONMENT: z.enum(['dev', 'test', 'prod']),
7-
NEXT_PUBLIC_CODEBUFF_APP_URL: z.url().min(1),
8-
NEXT_PUBLIC_SUPPORT_EMAIL: z.email().min(1),
9-
NEXT_PUBLIC_POSTHOG_API_KEY: z.string().min(1),
10-
NEXT_PUBLIC_POSTHOG_HOST_URL: z.url().min(1),
11-
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: z.string().min(1),
12-
NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL: z.url().min(1),
6+
NEXT_PUBLIC_CB_ENVIRONMENT: z.enum(['dev', 'test', 'prod']).default('prod'),
7+
NEXT_PUBLIC_CODEBUFF_APP_URL: z.url().min(1).default('https://codebuff.com'),
8+
NEXT_PUBLIC_SUPPORT_EMAIL: z
9+
.email()
10+
.min(1)
11+
.default('support@codebuff.com'),
12+
NEXT_PUBLIC_POSTHOG_API_KEY: z.string().min(1).optional(),
13+
NEXT_PUBLIC_POSTHOG_HOST_URL: z
14+
.url()
15+
.min(1)
16+
.default('https://us.i.posthog.com'),
17+
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: z.string().min(1).optional(),
18+
NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL: z.url().min(1).optional(),
1319
NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION_ID: z.string().optional(),
14-
NEXT_PUBLIC_WEB_PORT: z.coerce.number().min(1000),
20+
NEXT_PUBLIC_WEB_PORT: z.coerce.number().min(1000).default(3000),
1521
} satisfies Record<`${typeof CLIENT_ENV_PREFIX}${string}`, any>)
1622
export const clientEnvVars = clientEnvSchema.keyof().options
1723
export type ClientEnvVar = (typeof clientEnvVars)[number]

web/src/app/profile/components/usage-section.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@ const ManageCreditsCard = ({ isLoading = false }: { isLoading?: boolean }) => {
3838
},
3939
onSuccess: async (data) => {
4040
if (data.sessionId) {
41+
if (!env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY) {
42+
toast({
43+
title: 'Error',
44+
description: 'Stripe publishable key is not configured.',
45+
variant: 'destructive',
46+
})
47+
return
48+
}
49+
4150
const stripePromise = loadStripe(env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY)
4251
const stripe = await stripePromise
4352
if (!stripe) {
@@ -83,7 +92,11 @@ const ManageCreditsCard = ({ isLoading = false }: { isLoading?: boolean }) => {
8392
isPurchasePending={buyCreditsMutation.isPending}
8493
showAutoTopup={true}
8594
isLoading={isLoading}
86-
billingPortalUrl={`${env.NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL}?prefilled_email=${email}`}
95+
billingPortalUrl={
96+
env.NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL
97+
? `${env.NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL}?prefilled_email=${email}`
98+
: undefined
99+
}
87100
/>
88101
</div>
89102
</CardContent>

0 commit comments

Comments
 (0)