"use client"; import { AlertCircle, CheckCircle, Loader2 } from "lucide-react"; import { useSearchParams, useRouter } from "next/navigation"; import { Suspense, useEffect, useState } from "react"; import { Button } from '@nextsparkjs/core/components/ui/button'; import { Alert, AlertDescription } from '@nextsparkjs/core/components/ui/alert'; import { getTemplateOrDefaultClient } from '@nextsparkjs/registries/template-registry.client' import { sel } from '@nextsparkjs/core/selectors' function VerifyEmailContent() { const searchParams = useSearchParams()!; const router = useRouter(); const token = searchParams.get("token") || ""; const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); const [error, setError] = useState(null); useEffect(() => { const handleVerification = async () => { if (!token) { setError("No verification token provided"); setStatus('error'); return; } try { // Call the Better Auth verify endpoint with special header to avoid redirect loop const response = await fetch(`/api/auth/verify-email?token=${token}`, { method: 'GET', credentials: 'include', headers: { 'x-verify-from-ui': 'true' } }); if (!response.ok) { const errorText = await response.text(); setError(errorText || "Email verification failed"); setStatus('error'); } else { setStatus('success'); // Create default metadata after successful verification try { const response = await fetch('/api/auth/session', { method: 'GET', credentials: 'include' }); if (response.ok) { const session = await response.json(); if (session?.user?.id) { // Create default metadata for the newly verified user await fetch('/api/internal/user-metadata', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ userId: session.user.id, metadata: { uiPreferences: { theme: "light", sidebarCollapsed: false }, securityPreferences: { twoFactorEnabled: false, loginAlertsEnabled: true }, notificationsPreferences: { pushEnabled: true, loginAlertsEmail: true, loginAlertsPush: true, passwordChangesEmail: true, passwordChangesPush: true, suspiciousActivityEmail: true, suspiciousActivityPush: true, mentionsEmail: true, mentionsPush: true, projectUpdatesEmail: true, projectUpdatesPush: false, teamInvitesEmail: true, teamInvitesPush: true, newsletterEmail: false, newsletterPush: false, promotionsEmail: false, promotionsPush: false, featureAnnouncementsEmail: true, featureAnnouncementsPush: false } } }) }); console.log('Default metadata created for verified user:', session.user.id); } } } catch (metaError) { console.error('Error creating default metadata:', metaError); // Don't fail the verification if metadata creation fails } // Redirect after successful verification setTimeout(() => { router.push('/dashboard'); }, 2000); } } catch { setError("An unexpected error occurred"); setStatus('error'); } }; handleVerification(); }, [token, router]); if (status === 'loading') { return (

Verifying Email

Please wait while we verify your email address

); } if (status === 'success') { return (

Email Verified

Your email has been successfully verified

Redirecting you to the dashboard...
); } return (

Verification Failed

We couldn't verify your email address

{error && ( {error} )}
); } function VerifyEmailPage() { return ( }> ); } export default getTemplateOrDefaultClient('app/(auth)/verify-email/page.tsx', VerifyEmailPage)