From 79377fb210410b7e9e479f99f11c81294378137c Mon Sep 17 00:00:00 2001 From: Avery Felts Date: Sat, 31 Jan 2026 18:05:10 -0700 Subject: [PATCH] Fix: Runtime VAPID key fetching to avoid build-time environment dependency --- src/app/api/notifications/config/route.ts | 7 +++++++ src/hooks/useNotifications.ts | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 src/app/api/notifications/config/route.ts diff --git a/src/app/api/notifications/config/route.ts b/src/app/api/notifications/config/route.ts new file mode 100644 index 0000000..72816af --- /dev/null +++ b/src/app/api/notifications/config/route.ts @@ -0,0 +1,7 @@ +import { NextResponse } from 'next/server'; + +export async function GET() { + return NextResponse.json({ + publicKey: process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY + }); +} diff --git a/src/hooks/useNotifications.ts b/src/hooks/useNotifications.ts index 0ec23f8..9f6f0bb 100644 --- a/src/hooks/useNotifications.ts +++ b/src/hooks/useNotifications.ts @@ -52,9 +52,20 @@ export function useNotifications(reminderSettings: ReminderSettings) { throw new Error('Service Worker not ready'); } - const publicVapidKey = process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY; + let publicVapidKey = process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY; + + // If missing from build-time env, fetch it from runtime API if (!publicVapidKey) { - throw new Error('Missing VAPID key'); + console.log('VAPID key missing from build-time env, fetching from runtime API...'); + const configRes = await fetch('/api/notifications/config'); + if (configRes.ok) { + const config = await configRes.json() as { publicKey?: string }; + publicVapidKey = config.publicKey || ''; + } + } + + if (!publicVapidKey) { + throw new Error('Missing VAPID key (neither in build env nor runtime API). Please ensure NEXT_PUBLIC_VAPID_PUBLIC_KEY is set in Cloudflare secrets.'); } // 1. Ensure we have a subscription