import { Suspense } from 'react' import type { Metadata } from 'next' import { redirect } from 'next/navigation' import { SignupForm } from '@nextsparkjs/core/components/auth/forms/SignupForm' import { getTemplateOrDefault, getMetadataOrDefault } from '@nextsparkjs/core/lib/template-resolver' import { AUTH_CONFIG } from '@nextsparkjs/core/lib/config' import { TeamService } from '@nextsparkjs/core/lib/services' // This page reads DB state (TeamService.hasGlobal) and redirect()s during render, // so it must render per-request and never be statically prerendered at build time. export const dynamic = 'force-dynamic' const defaultMetadata: Metadata = { title: 'Create Account', description: 'Create your account to start using our platform', } export const metadata: Metadata = getMetadataOrDefault( 'app/(auth)/signup/page.tsx', defaultMetadata ) async function SignupPageContent() { const registrationMode = AUTH_CONFIG?.registration?.mode ?? 'open' // In invitation-only mode, allow the first user to register // (when no global team exists yet). Subsequent users need invitations. if (registrationMode === 'invitation-only') { const hasGlobalTeam = await TeamService.hasGlobal() if (hasGlobalTeam) { // A team exists, so this is not the first user - redirect to login // Invitation links use /accept-invite/[token] route, not /signup redirect('/login') } // No team exists yet - allow first user to register } // In domain-restricted mode, always redirect to login if (registrationMode === 'domain-restricted') { redirect('/login') } return } function SignupPage() { return ( ) } export default getTemplateOrDefault('app/(auth)/signup/page.tsx', SignupPage)