import React, { useEffect } from 'react'; import { Keyboard, Text, View, Alert } from 'react-native'; import { useDispatch } from 'react-redux'; import { RouteProp, useNavigation, useRoute } from '@react-navigation/native'; import { StackNavigationProp } from '@react-navigation/stack'; import * as yup from 'yup'; import { yupResolver } from '@hookform/resolvers/yup'; import { useForm } from 'react-hook-form'; import { loginRequest } from '../../actions/login'; import Button from '../../containers/Button'; import { ControlledFormTextInput } from '../../containers/TextInput'; import I18n from '../../i18n'; import { OutsideParamList } from '../../stacks/types'; import { useTheme } from '../../theme'; import sharedStyles from '../Styles'; import UGCRules from '../../containers/UserGeneratedContentRules'; import { useAppSelector } from '../../lib/hooks'; import styles from './styles'; import { handleLoginErrors } from './handleLoginErrors'; interface ISubmit { user: string; password: string; } const schema = yup.object().shape({ user: yup.string().required(), password: yup.string().required() }); const UserForm = () => { const { colors } = useTheme(); const dispatch = useDispatch(); const navigation = useNavigation>(); const { params: { username } } = useRoute>(); const { control, handleSubmit, formState: { isValid }, getValues, setFocus } = useForm({ mode: 'onChange', resolver: yupResolver(schema), defaultValues: { user: username || '' } }); const { Accounts_EmailOrUsernamePlaceholder, Accounts_PasswordPlaceholder, Accounts_PasswordReset, Accounts_RegistrationForm_LinkReplacementText, isFetching, Accounts_RegistrationForm, Site_Name, inviteLinkToken, error, failure } = useAppSelector(state => ({ Accounts_RegistrationForm: state.settings.Accounts_RegistrationForm as string, Accounts_RegistrationForm_LinkReplacementText: state.settings.Accounts_RegistrationForm_LinkReplacementText as string, isFetching: state.login.isFetching, Accounts_EmailOrUsernamePlaceholder: state.settings.Accounts_EmailOrUsernamePlaceholder as string, Accounts_PasswordPlaceholder: state.settings.Accounts_PasswordPlaceholder as string, Accounts_PasswordReset: state.settings.Accounts_PasswordReset as boolean, Site_Name: state.settings.Site_Name as string, inviteLinkToken: state.inviteLinks.token, failure: state.login.failure, error: state.login.error && state.login.error.data })); useEffect(() => { if (failure) { if (error?.error === 'error-invalid-email') { const user = getValues('user'); navigation.navigate('SendEmailConfirmationView', { user }); } else { Alert.alert(I18n.t('Oops'), handleLoginErrors(error?.error)); } } }, [error?.error, failure, getValues, navigation]); const showRegistrationButton = Accounts_RegistrationForm === 'Public' || (Accounts_RegistrationForm === 'Secret URL' && inviteLinkToken?.length); const register = () => { navigation.navigate('RegisterView', { title: Site_Name }); }; const forgotPassword = () => { navigation.navigate('ForgotPasswordView', { title: Site_Name }); }; const submit = ({ password, user }: ISubmit) => { if (!isValid) { return; } Keyboard.dismiss(); dispatch(loginRequest({ user, password })); }; return ( <> {I18n.t('Login')} setFocus('password')} testID='login-view-email' textContentType='username' autoComplete='username' />