import { useState } from 'react'; import { Button, Form, Spinner } from 'react-bootstrap'; import { AuthResponse, AuthErrorResponse, User, isAuthErrorResponse } from '@/types/auth'; //import { Helmet, HelmetProvider } from 'react-helmet-async'; import utils from '@/ts/utils.ts'; import ForgotPasswordModal from '@/components/modals/ForgotPasswordModal'; type SpinnerState = Record; type FormErrors = Record; function Login() { const [isLoading, setIsLoading] = useState(false); const [spinners, setSpinnersState] = useState({}); const [formErrors, setFormErrors] = useState({}); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [showForgotPasswordModal, setShowForgotPasswordModal] = useState(false); //const [user, setUser] = useState(null); const [loginError, setLoginError] = useState(false); const [loginErrorMessage, setLoginErrorMessage] = useState(''); //const setSpinners = (newValues: Partial) => { // setSpinnersState((prevSpinners) => ({ // ...prevSpinners, // ...newValues, // })); //}; const setSpinners = (newValues: Partial) => { setSpinnersState((prevSpinners) => { const updatedSpinners: SpinnerState = { ...prevSpinners }; for (const key in newValues) { if (newValues[key] !== undefined) { updatedSpinners[key] = newValues[key] as boolean; } } return updatedSpinners; }); }; const handleCloseForgotPasswordModal = () => { setShowForgotPasswordModal(false); }; const validateLoginForm = () => { setFormErrors({}); const errors: FormErrors = {}; if (!username.trim()) { errors.username = 'Username is required'; //} else if (!/\S+@\S+\.\S+/.test(email)) { // errors.email = 'Invalid email address'; } if (!password.trim()) { errors.password = 'Password is required'; } if (Object.keys(errors).length > 0) { setFormErrors(errors); } }; const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); spinners.Login = true; setSpinners(spinners); validateLoginForm(); if (Object.keys(formErrors).length > 0) return; //setUser(null); setLoginError(false); setLoginErrorMessage(''); let loggedInUser: User | null = null; let hadLoginError: boolean = false; let hadLoginErrorMessage: string = ''; await utils.webMethod({ methodPage: 'authentication', methodName: 'authenticate', parameters: { username, password }, success: (json: AuthResponse) => { try { loggedInUser = json.user; //setUser(loggedInUser); } catch { const errorMsg: string = "Unexpected Error"; hadLoginError = true; hadLoginErrorMessage = errorMsg; } }, error: (err: unknown) => { let errorMsg: string = "Unexpected Error"; if (isAuthErrorResponse(err)) { if (err && err as AuthErrorResponse) { if (err.data) { if (err.data.message) errorMsg = err.data.message; } console.error(errorMsg); setLoginErrorMessage(errorMsg); } } hadLoginError = true; hadLoginErrorMessage = errorMsg; } }); if (hadLoginError) { setLoginErrorMessage(hadLoginErrorMessage); setLoginError(true); setIsLoading(false); spinners.Login = false; setSpinners(spinners); return; } if (loggedInUser == null) { setLoginError(true); setIsLoading(false); spinners.Login = false; setSpinners(spinners); } else { await finishUserLogin(loggedInUser); } }; const finishUserLogin = async (loggedInUser: User) => { setIsLoading(false); spinners.Login = false; spinners.LoginWithPasskey = false; setSpinners(spinners); utils.localStorage("session_currentUser", loggedInUser); const redirectUrl = utils.sessionStorage("redirect_url"); if (redirectUrl) { utils.sessionStorage("redirect_url", null); document.location.href = redirectUrl; } else { document.location.href = '/home'; } }; return (

surge365 - React

Please sign in

{loginError && ( {loginErrorMessage ?? "Login error"} )} Username setUsername(e.target.value)} required autoFocus size="sm" /> {spinners.Username && } Password setPassword(e.target.value)} required size="sm" />
); } export default Login;