import { useCallback, useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import Button from '/src/components/Button/Button' import Error from '/src/components/Error/Error' import TextField from '/src/components/TextField/TextField' import { getPerson, PersonResponse } from '/src/config/api' import { useTranslation } from '/src/i18n/client' import styles from './Login.module.scss' const defaultValues = { username: '', password: '', } interface LoginProps { eventId?: string user: PersonResponse | undefined onChange: (user: PersonResponse | undefined, password?: string) => void } const Login = ({ eventId, user, onChange }: LoginProps) => { const { t } = useTranslation('event') const { register, handleSubmit, setFocus, reset, setValue, } = useForm({ defaultValues }) const [error, setError] = useState() const [isLoading, setIsLoading] = useState(false) const focusName = useCallback(() => setFocus('username'), [setFocus]) useEffect(() => { document.addEventListener('focusName', focusName) return () => document.removeEventListener('focusName', focusName) }, []) const onSubmit: SubmitHandler = async ({ username, password }) => { if (username.length === 0) { focusName() return setError(t('form.errors.name_required')) } setIsLoading(true) setError(undefined) try { if (!eventId) throw 'Event ID not set' const resUser = await getPerson(eventId, username, password || undefined) onChange(resUser, password || undefined) reset() } catch (e) { if (e && typeof e === 'object' && 'status' in e && e.status === 401) { setError(t('form.errors.password_incorrect')) setValue('password', '') } else { setError(t('form.errors.unknown')) } } finally { setIsLoading(false) } } return user ?

{t('form.signed_in', { name: user.name })}

: <>

{t('form.signed_out')}

setError(undefined)}>{error}

{t('form.info')}

} export default Login