'use client'; /** * Registrierungsseite (plan.md Abschnitt 3 und 11). * Mit Invite-Token (aus URL) wird dem Kalender automatisch zugeordnet. */ import { Suspense, useState } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import Link from 'next/link'; import { Button, Card, ErrorMessage, Input, Label } from '@/components/ui/ui'; function RegisterForm() { const router = useRouter(); const searchParams = useSearchParams(); const inviteToken = searchParams.get('token') ?? ''; const [error, setError] = useState(null); const [busy, setBusy] = useState(false); async function handleSubmit(event: React.FormEvent) { event.preventDefault(); setBusy(true); setError(null); const formData = new FormData(event.currentTarget); const password = String(formData.get('password') ?? ''); const passwordRepeat = String(formData.get('passwordRepeat') ?? ''); if (password !== passwordRepeat) { setError('Die Passwoerter stimmen nicht ueberein.'); setBusy(false); return; } try { const username = String(formData.get('username') ?? '').trim(); const response = await fetch('/api/auth/register', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: formData.get('email'), password, ...(username ? { username } : {}), ...(inviteToken ? { inviteToken } : {}), }), }); if (!response.ok) { const data = (await response.json()) as { error?: string }; setError(data.error ?? 'Registrierung fehlgeschlagen.'); return; } router.push('/dashboard'); router.refresh(); } catch { setError('Netzwerkfehler. Bitte erneut versuchen.'); } finally { setBusy(false); } } return ( {inviteToken && (

Du wurdest zu einem Kalender eingeladen. Nach der Registrierung siehst du ausschliesslich diesen Kalender.

)}

2-32 Zeichen; Buchstaben, Ziffern, _ - . erlaubt.

Mindestens 10 Zeichen mit Gross-/Kleinbuchstabe und Ziffer.

Bereits registriert?{' '} Anmelden

); } export default function RegisterPage() { return (

Konto erstellen

Wird geladen …}>
); }