import React from 'react'; import { Alert, Keyboard, StyleSheet, Text, View } from 'react-native'; import { connect } from 'react-redux'; import { dequal } from 'dequal'; import { StackNavigationProp } from '@react-navigation/stack'; import { RouteProp } from '@react-navigation/core'; import Button from '../containers/Button'; import I18n from '../i18n'; import * as HeaderButton from '../containers/HeaderButton'; import { themes } from '../constants/colors'; import { withTheme } from '../theme'; import FormContainer, { FormContainerInner } from '../containers/FormContainer'; import TextInput from '../containers/TextInput'; import { loginRequest as loginRequestAction } from '../actions/login'; import LoginServices from '../containers/LoginServices'; import sharedStyles from './Styles'; const styles = StyleSheet.create({ registerDisabled: { ...sharedStyles.textRegular, ...sharedStyles.textAlignCenter, fontSize: 16 }, title: { ...sharedStyles.textBold, fontSize: 22 }, inputContainer: { marginVertical: 16 }, bottomContainer: { flexDirection: 'column', alignItems: 'center', marginBottom: 32 }, bottomContainerText: { ...sharedStyles.textRegular, fontSize: 13 }, bottomContainerTextBold: { ...sharedStyles.textSemibold, fontSize: 13 }, loginButton: { marginTop: 16 } }); interface IProps { navigation: StackNavigationProp; route: RouteProp; Site_Name: string; Accounts_RegistrationForm: string; Accounts_RegistrationForm_LinkReplacementText: string; Accounts_EmailOrUsernamePlaceholder: string; Accounts_PasswordPlaceholder: string; Accounts_PasswordReset: boolean; Accounts_ShowFormLogin: boolean; isFetching: boolean; error: { error: string; }; failure: boolean; theme: string; loginRequest: Function; inviteLinkToken: string; } class LoginView extends React.Component { private passwordInput: any; static navigationOptions = ({ route, navigation }: Partial) => ({ title: route?.params?.title ?? 'Rocket.Chat', headerRight: () => }); constructor(props: IProps) { super(props); this.state = { user: props.route.params?.username ?? '', password: '' }; } UNSAFE_componentWillReceiveProps(nextProps: IProps) { const { error } = this.props; if (nextProps.failure && !dequal(error, nextProps.error)) { if (nextProps.error?.error === 'error-invalid-email') { this.resendEmailConfirmation(); } else { Alert.alert(I18n.t('Oops'), I18n.t('Login_error')); } } } get showRegistrationButton() { const { Accounts_RegistrationForm, inviteLinkToken } = this.props; return Accounts_RegistrationForm === 'Public' || (Accounts_RegistrationForm === 'Secret URL' && inviteLinkToken?.length); } login = () => { const { navigation, Site_Name } = this.props; navigation.navigate('LoginView', { title: Site_Name }); }; register = () => { const { navigation, Site_Name } = this.props; navigation.navigate('RegisterView', { title: Site_Name }); }; forgotPassword = () => { const { navigation, Site_Name } = this.props; navigation.navigate('ForgotPasswordView', { title: Site_Name }); }; resendEmailConfirmation = () => { const { user } = this.state; const { navigation } = this.props; navigation.navigate('SendEmailConfirmationView', { user }); }; valid = () => { const { user, password } = this.state; return user.trim() && password.trim(); }; submit = () => { if (!this.valid()) { return; } const { user, password } = this.state; const { loginRequest } = this.props; Keyboard.dismiss(); loginRequest({ user, password }); }; renderUserForm = () => { const { user } = this.state; const { Accounts_EmailOrUsernamePlaceholder, Accounts_PasswordPlaceholder, Accounts_PasswordReset, Accounts_RegistrationForm_LinkReplacementText, isFetching, theme, Accounts_ShowFormLogin } = this.props; if (!Accounts_ShowFormLogin) { return null; } return ( <> {I18n.t('Login')} this.setState({ user: value })} onSubmitEditing={() => { this.passwordInput.focus(); }} testID='login-view-email' textContentType='username' autoCompleteType='username' theme={theme} value={user} /> { this.passwordInput = e; }} placeholder={Accounts_PasswordPlaceholder || I18n.t('Password')} returnKeyType='send' secureTextEntry onSubmitEditing={this.submit} onChangeText={(value: string) => this.setState({ password: value })} testID='login-view-password' textContentType='password' autoCompleteType='password' theme={theme} />