import type { Me } from '@spendlight/shared'; import { useQueryClient } from '@tanstack/react-query'; import { useState, type FormEvent } from 'react'; import { Navigate, useNavigate } from 'react-router'; import { toast } from 'sonner'; import { AuthLayout, FormError } from '@/components/AuthLayout'; import { Splash } from '@/components/RequireAuth'; import { Button } from '@/components/ui/button'; import { Field, Input, PasswordInput } from '@/components/ui/form'; import { api, errorMessage } from '@/lib/api'; import { useConfig } from '@/lib/session'; export default function SetupPage() { const config = useConfig(); const client = useQueryClient(); const navigate = useNavigate(); const [displayName, setDisplayName] = useState(''); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(null); const [busy, setBusy] = useState(false); if (config.isPending) return ; if (config.data && !config.data.needsSetup) return ; const submit = async (e: FormEvent) => { e.preventDefault(); setBusy(true); setError(null); try { const me = await api('/setup', { method: 'POST', body: { displayName, username, password } }); client.setQueryData(['me'], me); await client.invalidateQueries({ queryKey: ['config'] }); toast.success(`Welcome to Spendlight, ${me.displayName}!`); navigate('/', { replace: true }); } catch (err) { setError(errorMessage(err)); } finally { setBusy(false); } }; return (
{(id) => setDisplayName(e.target.value)} autoComplete="name" placeholder="Chris" required />} {(id) => ( setUsername(e.target.value)} autoComplete="username" autoCapitalize="none" autoCorrect="off" spellCheck={false} placeholder="chris" required /> )} {(id) => setPassword(e.target.value)} autoComplete="new-password" minLength={8} required />}
); }