import { FormEvent, useState } from 'react' import { api } from './api' import { Spinner } from './ui' // Drawn, not typed: 👁 is an emoji on phones, full colour and its own size. Outline strokes // match the glyphs in the rail and the power button. const EyeIcon = ( ) const EyeOffIcon = ( ) const USER_KEY = 'hamlab.user' // the last account signed in on this device, offered again export default function Login({ onLogin }: { onLogin: () => void }) { const [user, setUser] = useState(localStorage.getItem(USER_KEY) ?? '') const [pw, setPw] = useState('') const [err, setErr] = useState('') const [busy, setBusy] = useState(false) // Shown on request: a generated password is typed by hand off a message, and a wrong // character looks exactly like a wrong password from here. const [show, setShow] = useState(false) async function submit(e: FormEvent) { e.preventDefault() setBusy(true); setErr('') try { const r = await api.login(user.trim(), pw) localStorage.setItem(USER_KEY, r?.user ?? user.trim()) onLogin() } catch (e) { setErr((e instanceof Error && e.message) || 'login failed'); setBusy(false) } } return (