import { ImageResponse } from 'next/og'; import { NextRequest } from 'next/server'; import * as admin from 'firebase-admin'; import adminCred from '@/config/firebase-admin'; export const runtime = 'nodejs'; export async function GET(request: NextRequest) { const { searchParams } = new URL(request.url); const slug = searchParams.get('slug'); if (!slug) { return new ImageResponse(<>No Slug, { width: 1200, height: 630 }); } if (!admin.apps.length) { try { admin.initializeApp({ credential: admin.credential.cert(adminCred as admin.ServiceAccount), }); } catch (error) { console.error('Firebase admin init error', error); } } let guestName = 'Guest'; try { const db = admin.firestore(); const docSnap = await db.collection('invitation').doc(slug).get(); if (docSnap.exists) { const data = docSnap.data(); guestName = data?.name || 'Guest'; } } catch (e) { console.error('Error fetching guest data:', e); } // Fetch font const fontData = await fetch( 'https://github.com/google/fonts/blob/main/ofl/greatvibes/GreatVibes-Regular.ttf?raw=true' ).then((res) => { if (!res.ok) throw new Error('Failed to fetch font'); return res.arrayBuffer(); }); return new ImageResponse( (
Titas & Sukanya
Wedding Invitation
Inviting
{guestName}
Join us as we tie the knot
), { width: 1200, height: 630, fonts: [ { name: 'Great Vibes', data: fontData, style: 'normal', }, ], } ); }