import { useState } from 'react' import { useTranslation } from 'react-i18next' import { setToken } from '../utils/api' import * as setupApi from '../api/setupApi' interface Props { onComplete: () => void } export default function SetupWizard({ onComplete }: Readonly) { const { t } = useTranslation() const [step, setStep] = useState(1) const [email, setEmail] = useState('') const [displayName, setDisplayName] = useState('') const [password, setPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') const [smtpHost, setSmtpHost] = useState('') const [smtpPort, setSmtpPort] = useState('587') const [smtpUser, setSmtpUser] = useState('') const [smtpPass, setSmtpPass] = useState('') const [smtpFrom, setSmtpFrom] = useState('') const [smtpSecure, setSmtpSecure] = useState('auto') const [appUrl, setAppUrl] = useState(window.location.origin) const [error, setError] = useState(null) const [submitting, setSubmitting] = useState(false) const validateStep1 = () => { if (!email.trim() || !email.includes('@')) { setError(t('setup.validEmailRequired')) return false } if (!displayName.trim()) { setError(t('setup.displayNameRequired')) return false } if (password.length < 8) { setError(t('setup.passwordMinLength')) return false } if (password !== confirmPassword) { setError(t('setup.passwordsDoNotMatch')) return false } return true } const handleNext = () => { setError(null) if (validateStep1()) setStep(2) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setError(null) setSubmitting(true) try { const data = await setupApi.completeSetup({ email, password, displayName: displayName.trim(), smtpHost, smtpPort, smtpUser, smtpPass, smtpFrom: smtpFrom || 'BrainWave ', smtpSecure, appUrl, }) setToken(data.token) onComplete() } catch (err) { setError( err instanceof Error ? err.message : t('setup.setupFailed'), ) } finally { setSubmitting(false) } } return (

{t('setup.welcome')}

{t('setup.subtitle')}

= 1 ? 'active' : ''}`}> 1 {t('setup.adminAccount')}
= 2 ? 'active' : ''}`}> 2 {t('setup.emailSettings')}
{error &&
{error}
} {step === 1 && ( <>
setEmail(e.target.value)} placeholder="admin@example.com" required autoComplete="email" />
setDisplayName(e.target.value)} placeholder="Your name" required autoComplete="name" />
setPassword(e.target.value)} placeholder="Min. 8 characters" required minLength={8} autoComplete="new-password" />
setConfirmPassword(e.target.value)} placeholder="••••••••" required minLength={8} autoComplete="new-password" />
)} {step === 2 && (
void handleSubmit(e)}>

{t('setup.setupHint1')}

{t('setup.setupHint2')}

setSmtpHost(e.target.value)} placeholder="smtp.example.com" />
setSmtpPort(e.target.value)} placeholder="587" />
setSmtpUser(e.target.value)} placeholder="user@example.com" />
setSmtpPass(e.target.value)} placeholder="••••••••" />
setSmtpFrom(e.target.value)} placeholder="BrainWave " />
setAppUrl(e.target.value)} placeholder="https://brainwave.example.com" />
)}
) }