import { useState, type FormEvent } from 'react'; import { Navigate } from 'react-router-dom'; import { useAuth } from '../context/AuthContext'; import { ApiError } from '../api/client'; function extractErrorMessage(err: unknown): string { if (err instanceof ApiError && err.body && typeof err.body === 'object' && 'error' in err.body) { const code = String((err.body as { error: unknown }).error); if (code === 'username_taken') return 'That username is already taken.'; if (code === 'setup_already_complete') return 'Setup was already completed. Please log in.'; } return 'Something went wrong. Please try again.'; } export function SetupPage() { const { completeSetup, user, needsSetup } = useAuth(); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); if (user) return ; if (!needsSetup) return ; async function handleSubmit(e: FormEvent) { e.preventDefault(); setError(null); if (password !== confirmPassword) { setError('Passwords do not match.'); return; } setSubmitting(true); try { await completeSetup(username, password); } catch (err) { setError(extractErrorMessage(err)); } finally { setSubmitting(false); } } return (

Welcome to CityTracker

Create the first admin account to get started.

{error &&

{error}

}
); }