import React, { useEffect, useState } from 'react' import { View, Image, Text, StyleSheet } from 'react-native' import { useForm, Controller } from 'react-hook-form' import { useNavigate } from 'react-router-native' import { createSelector } from '@reduxjs/toolkit' import { CustomInput, Button, TextHelper, ErrorMessage } from '../components/FormElements' import { completeAuthentication, login, setEmail, setToken, startAuthentication, setRecaptcha, MedTechApiState } from '../services/api' import { useAppDispatch, useAppSelector } from '../redux/hooks' import { WebViewComponent } from '../components/WebViewComponent' import { YourAppState } from '../config/YourAppState' import { routes } from '../navigation/Routes' import { CustomActivityIndicator } from '../components/CustomActivityIndicator' const selectMedTechApiData = (state: { medTechApi: MedTechApiState }) => state.medTechApi const selectPetraData = (state: { petra: YourAppState }) => state.petra const combinedSelector = createSelector([selectMedTechApiData, selectPetraData], (medTechApi: MedTechApiState, petra: YourAppState) => ({ online: medTechApi.online, lsUsername: petra?.savedCredentials?.login, lsToken: petra?.savedCredentials?.token, loginProcessStarted: medTechApi.loginProcessStarted, })) export const Login = () => { const [isWaitingForCode, setWaitingForCodeState] = useState(false) const { online, lsUsername, lsToken, loginProcessStarted } = useAppSelector(combinedSelector) const { control, handleSubmit, formState: { errors }, } = useForm({ defaultValues: { userEmail: '', userCode: '', }, }) const dispatch = useAppDispatch() const navigate = useNavigate() useEffect(() => { if (lsUsername && lsToken && dispatch) { dispatch(setEmail({ email: lsUsername })) dispatch(setToken({ token: lsToken })) dispatch(login()) } }, [navigate, lsUsername, lsToken, dispatch]) useEffect(() => { if (online) { navigate(routes.home) } }, [online, navigate]) const askForCode = (data: { userEmail: string }) => { setWaitingForCodeState(true) dispatch(setEmail({ email: data.userEmail })) dispatch(startAuthentication()) } const performLogin = (data: { userCode: string }) => { setWaitingForCodeState(false) dispatch(setToken({ token: data.userCode })) dispatch(completeAuthentication()) } return ( <> {loginProcessStarted && } Login ( )} name="userEmail" /> {errors.userEmail?.message && } {isWaitingForCode ? ( ( )} name="userCode" /> {errors.userCode?.message && } ) : null} dispatch(setRecaptcha({ recaptcha: value }))} /> {isWaitingForCode ? (