71 lines
2.3 KiB
TypeScript
71 lines
2.3 KiB
TypeScript
import React, { useCallback, useEffect, useRef } from 'react';
|
|
import { Button } from 'react-bootstrap';
|
|
import { useAuth } from './context/auth';
|
|
import { login } from '../../types';
|
|
import './Login.css';
|
|
|
|
/**
|
|
* Formulář pro prvotní zadání přihlašovacího jména.
|
|
*/
|
|
export default function Login() {
|
|
const auth = useAuth();
|
|
const loginRef = useRef<HTMLInputElement>(null);
|
|
|
|
useEffect(() => {
|
|
if (auth && !auth.login) {
|
|
// Vyzkoušíme přihlášení "naprázdno", pokud projde, přihlásili nás trusted headers
|
|
login().then(response => {
|
|
const token = response.data;
|
|
if (token) {
|
|
auth?.setToken(token as unknown as string); // TODO vyřešit, API definice je špatně, je to skutečně string
|
|
}
|
|
}).catch(error => {
|
|
// nezajímá nás
|
|
});
|
|
}
|
|
}, [auth]);
|
|
|
|
const doLogin = useCallback(async () => {
|
|
const length = loginRef?.current?.value.length && loginRef.current.value.replaceAll(/\s/g, '').length
|
|
if (length) {
|
|
const response = await login({ body: { login: loginRef.current?.value } });
|
|
if (response.data) {
|
|
auth?.setToken(response.data as unknown as string); // TODO vyřešit
|
|
}
|
|
}
|
|
}, [auth]);
|
|
|
|
if (!auth?.login) {
|
|
return (
|
|
<div className='login-page'>
|
|
<div className='login-card'>
|
|
<h1 className='login-logo'>Luncher</h1>
|
|
<p className='login-subtitle'>Aplikace pro profesionální management obědů</p>
|
|
<div className='login-form'>
|
|
<div>
|
|
<label htmlFor="login-input">Zobrazované jméno</label>
|
|
<input
|
|
id="login-input"
|
|
ref={loginRef}
|
|
type='text'
|
|
placeholder="Např. Jan Novák"
|
|
onKeyDown={event => {
|
|
if (event.key === 'Enter') {
|
|
doLogin()
|
|
}
|
|
}}
|
|
/>
|
|
<p className='hint'>
|
|
Zadejte jméno nebo přezdívku, pod kterou vás kolegové snadno identifikují.
|
|
Jméno je možné kdykoli změnit.
|
|
</p>
|
|
</div>
|
|
<Button onClick={doLogin}>Pokračovat</Button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
return <div>Neplatný stav</div>
|
|
}
|