import ForwardIcon from '@mui/icons-material/Forward'; import { Box, Paper, Typography, MenuItem, TextField, Button } from '@mui/material'; import { useRequest } from 'alova'; import { useContext, useState } from 'react'; import { toast } from 'react-toastify'; import { FeaturesContext } from './contexts/features'; import type { ValidateFieldsError } from 'async-validator'; import type { Locales } from 'i18n/i18n-types'; import type { ChangeEventHandler, FC } from 'react'; import type { SignInRequest } from 'types'; import * as AuthenticationApi from 'api/authentication'; import { PROJECT_NAME } from 'api/env'; import { ValidatedPasswordField, ValidatedTextField } from 'components'; import { AuthenticationContext } from 'contexts/authentication'; import DEflag from 'i18n/DE.svg'; import FRflag from 'i18n/FR.svg'; import GBflag from 'i18n/GB.svg'; import ITflag from 'i18n/IT.svg'; import NLflag from 'i18n/NL.svg'; import NOflag from 'i18n/NO.svg'; import PLflag from 'i18n/PL.svg'; import SKflag from 'i18n/SK.svg'; import SVflag from 'i18n/SV.svg'; import TRflag from 'i18n/TR.svg'; import { I18nContext } from 'i18n/i18n-react'; import { loadLocaleAsync } from 'i18n/i18n-util.async'; import { onEnterCallback, updateValue } from 'utils'; import { SIGN_IN_REQUEST_VALIDATOR, validate } from 'validators'; const SignIn: FC = () => { const authenticationContext = useContext(AuthenticationContext); const { LL, setLocale, locale } = useContext(I18nContext); const { features } = useContext(FeaturesContext); const [signInRequest, setSignInRequest] = useState({ username: '', password: '' }); const [processing, setProcessing] = useState(false); const [fieldErrors, setFieldErrors] = useState(); const { send: callSignIn, onSuccess } = useRequest((request: SignInRequest) => AuthenticationApi.signIn(request), { immediate: false }); onSuccess((response) => { if (response.data) { authenticationContext.signIn(response.data.access_token); } }); const updateLoginRequestValue = updateValue(setSignInRequest); const signIn = async () => { await callSignIn(signInRequest).catch((event) => { if (event.message === 'Unauthorized') { toast.warning(LL.INVALID_LOGIN()); } else { toast.error(LL.ERROR() + ' ' + event.message); } setProcessing(false); }); }; const validateAndSignIn = async () => { setProcessing(true); SIGN_IN_REQUEST_VALIDATOR.messages({ required: LL.IS_REQUIRED('%s') }); try { await validate(SIGN_IN_REQUEST_VALIDATOR, signInRequest); await signIn(); } catch (errors: any) { setFieldErrors(errors); setProcessing(false); } }; const submitOnEnter = onEnterCallback(signIn); const onLocaleSelected: ChangeEventHandler = async ({ target }) => { const loc = target.value as Locales; localStorage.setItem('lang', loc); await loadLocaleAsync(loc); setLocale(loc); }; return ( theme.breakpoints.values.sm} > ({ textAlign: 'center', padding: theme.spacing(2), paddingTop: '172px', backgroundImage: 'url("/app/icon.png")', backgroundRepeat: 'no-repeat', backgroundPosition: '50% ' + theme.spacing(2), width: '100%' })} > {PROJECT_NAME} {features.version}  DE  EN  FR  IT  NL  NO  PL  SV  TR  SK ); }; export default SignIn;