import { useEffect, useState } from "react"; import { currentUser, login, User } from "./api"; import Header from "./Header"; import { useLocation, useNavigate } from "react-router"; import { Eye, EyeSlash } from "./Icons"; export interface LoginProps { onLogin: (user: User) => void; } export const Login = ({ onLogin }: LoginProps) => { const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); const [visible, setVisible] = useState(false); const navigate = useNavigate(); const location = useLocation(); async function doLogin() { setLoading(true); setError(""); const timeout = new Promise((r) => setTimeout(r, 1000)); let user: User; try { await login({ username, password }); user = await currentUser(); } catch (e) { await timeout; setError("failed"); setLoading(false); return; } await timeout; onLogin(user); } function handleSubmit(e: React.FormEvent) { e.preventDefault(); doLogin(); } useEffect(() => { if (location.state) { const queryUsername = location.state.username; const queryPassword = location.state.password; if (queryUsername) setUsername(queryUsername); if (queryPassword) setPassword(queryPassword); navigate(location.pathname, { replace: true }); } }, []); return ( <>
{ setError(""); setUsername(evt.target.value); }} />
{ setError(""); setPassword(evt.target.value); }} />
setVisible(!visible)} > {visible ? : }
{error && {error}} {loading && } ); };