import React, { useState } from 'react'; import { LoginComponentProps } from './types'; import { getTranslations } from '../../shared/utils/localization-util'; import { useFormik } from 'formik'; import * as Yup from 'yup'; import { decodeTokenToMemberInfo, loginMember, passwordForgotten } from './login-services'; const LoginComponent: React.FC = ({ tideClientConfig, portalId, languageCode, member, setMember, handleBackToHome }) => { const [isLoggedIn, setIsLoggedIn] = useState(false); const [showPassword, setShowPassword] = useState(false); const [isForgotPassword, setIsForgotPassword] = useState(false); const [newPasswordRequested, setNewPasswordRequested] = useState(false); const [apiError, setApiError] = useState(false); const translations = getTranslations(languageCode ?? 'en-GB'); const formik = useFormik({ initialValues: { username: '', password: '' }, validationSchema: Yup.object({ username: Yup.string().email(translations.LOGIN.EMAIL_INVALID).required(translations.LOGIN.EMAIL_REQUIRED), password: Yup.string().required(translations.LOGIN.PASSWORD_REQUIRED) }), onSubmit: async (values) => { try { const response = await loginMember(values.username, values.password, tideClientConfig, portalId); const member = decodeTokenToMemberInfo(response.token); if (member && member.id !== 0) { setMember(member); localStorage.setItem('token', response.token); setIsLoggedIn(true); } } catch (error) { setApiError(true); } } }); const handleForgotPasswordClick = async (e: React.MouseEvent) => { e.preventDefault(); formik.setTouched({ username: true }, true); const errors = await formik.validateForm(); if (!errors.username) { handleForgotPassword(); } }; const handleForgotPassword = async () => { try { const response = await passwordForgotten(formik.values.username, tideClientConfig, portalId); if (response) { setNewPasswordRequested(true); } } catch (error) { setApiError(true); } }; return ( <> {!isLoggedIn && !isForgotPassword && ( <>

{translations.LOGIN.LOGIN_INTO}

{formik.touched.username && formik.errors.username && (
{formik.errors.username}
)}
{(formik.touched.password || formik.submitCount > 0) && formik.errors.password && (
{formik.values.password === '' ? translations.LOGIN.PASSWORD_REQUIRED : formik.errors.password}
)}
{!formik.errors.password && apiError &&
{translations.LOGIN.INVALID_CREDENTIALS}
}
)} {isLoggedIn && member && !isForgotPassword && (

{translations.LOGIN.WELCOME_X} {member?.name}

)} {isForgotPassword && !newPasswordRequested && ( <>

{translations.LOGIN.FORGOT_PASSWORD}

{(((formik.submitCount > 0 || formik.touched.username) && formik.errors.username) || apiError) && (
{translations.LOGIN.EMAIL_REQUIRED}
)}
)} {newPasswordRequested &&

{translations.LOGIN.RESET_REQUESTED}

} ); }; export default LoginComponent;