import * as React from "react"; import { Image, ImageStyle, SafeAreaView, StatusBar, StyleProp, Text, TextStyle, TouchableOpacity, View, ViewStyle, LayoutAnimation, } from "react-native"; import TextInput, { IInteractiveTextInputProps, } from "react-native-text-input-interactive"; /** * ? Local Imports */ import styles from "./LoginScreen.style"; import SocialButton from "./components/social-button/SocialButton"; import useStateWithCallback from "./helpers/useStateWithCallback"; import emailValidator from "./helpers/emailValidator"; import passwordValidator from "./helpers/passwordValidator"; import Tooltip from "./components/tooltip/Tooltip"; const dummyFunction = () => {}; export interface ILoginScreenProps { signupText?: string; disableDivider?: boolean; logoImageSource: any; disableSocialButtons?: boolean; emailPlaceholder?: string; passwordPlaceholder?: string; disableSignup?: boolean; disablePasswordInput?: boolean; loginButtonText?: string; disableEmailValidation?: boolean; enablePasswordValidation?: boolean; disableEmailTooltip?: boolean; disablePasswordTooltip?: boolean; style?: StyleProp; dividerStyle?: StyleProp; logoImageStyle?: StyleProp; textInputContainerStyle?: StyleProp; loginButtonStyle?: StyleProp; loginTextStyle?: StyleProp; signupStyle?: StyleProp; signupTextStyle?: StyleProp; emailTextInputProps?: IInteractiveTextInputProps; passwordTextInputProps?: IInteractiveTextInputProps; children?: any; TouchableComponent?: any; passwordContentTooltip?: React.ReactNode; emailContentTooltip?: React.ReactNode; customSocialLoginButtons?: React.ReactNode; customLoginButton?: React.ReactNode; customSignupButton?: React.ReactNode; customTextInputs?: React.ReactNode; textInputChildren?: React.ReactNode; customLogo?: React.ReactNode; customDivider?: React.ReactNode; onLoginPress: () => void; onSignupPress: () => void; onEmailChange: (email: string) => void; onPasswordChange: (password: string) => void; onFacebookPress?: () => void; onTwitterPress?: () => void; onApplePress?: () => void; onDiscordPress?: () => void; onEyePress?: () => void; } const LoginScreen: React.FC = ({ style, dividerStyle, logoImageStyle, loginTextStyle, loginButtonStyle, signupTextStyle, signupStyle, textInputContainerStyle, signupText = "Create an account", disableDivider, logoImageSource, onLoginPress, disableSocialButtons, disablePasswordInput = false, loginButtonText = "Login", onSignupPress, onEmailChange, onPasswordChange, onFacebookPress = dummyFunction, onTwitterPress = dummyFunction, onApplePress = dummyFunction, onDiscordPress = dummyFunction, emailPlaceholder = "Email", passwordPlaceholder = "Password", disableSignup = false, customSocialLoginButtons, customLogo, customTextInputs, textInputChildren, customLoginButton, customSignupButton, customDivider, emailTextInputProps, passwordTextInputProps, disableEmailValidation = false, enablePasswordValidation = false, disableEmailTooltip = false, disablePasswordTooltip = false, emailContentTooltip, passwordContentTooltip, TouchableComponent = TouchableOpacity, onEyePress, children, }) => { const [isPasswordVisible, setPasswordVisible] = React.useState(false); const [email, setEmail] = React.useState(""); const [password, setPassword] = React.useState(""); const [isEmailTooltipVisible, setEmailTooltipVisible] = useStateWithCallback(false); const [isPasswordTooltipVisible, setPasswordTooltipVisible] = useStateWithCallback(false); const handleEmailChange = (text: string) => { isEmailTooltipVisible && setEmailTooltipVisible(false); setEmail(text); onEmailChange?.(text); }; const handlePasswordChange = (text: string) => { isPasswordTooltipVisible && setPasswordTooltipVisible(false); setPassword(text); onPasswordChange?.(text); }; const handleEyePress = () => { setPasswordVisible((oldValue) => !oldValue); onEyePress?.(); }; const handleEmailValidation = () => { if (disableEmailValidation) { handlePasswordValidation(); onEmailChange(email); return; } if (emailValidator(email)) { !disableEmailTooltip && setEmailTooltipVisible(false); handlePasswordValidation(); onEmailChange(email); return; } else { LayoutAnimation.spring(); !disableEmailTooltip && setEmailTooltipVisible(true); onEmailChange(email); } }; const handlePasswordValidation = () => { if (isEmailTooltipVisible) { return; } if (!enablePasswordValidation) { onPasswordChange(password); return; } if (enablePasswordValidation && passwordValidator(password)) { !disablePasswordTooltip && setPasswordTooltipVisible(false); onPasswordChange(password); return; } else { LayoutAnimation.spring(); !disableEmailTooltip && setEmailTooltipVisible(false); !disablePasswordTooltip && setPasswordTooltipVisible(true); onPasswordChange(password); } }; const renderLogo = () => customLogo || ( ); const renderEmailInput = () => { const tooltipContent = () => emailContentTooltip || ( That{" "} email address{" "} doesn't look right ); return ( <> {!disableEmailTooltip && isEmailTooltipVisible && ( {tooltipContent()} )} setEmailTooltipVisible(false)} {...emailTextInputProps} /> ); }; const renderPasswordInput = () => { const eyeIcon = isPasswordVisible ? require("./local-assets/eye.png") : require("./local-assets/eye-off.png"); const renderTooltipContent = () => passwordContentTooltip || ( Incorrect{" "} password ); return ( !disablePasswordInput && ( {!disablePasswordTooltip && isPasswordTooltipVisible && ( {renderTooltipContent()} )} { setPasswordTooltipVisible(false); }} onIconPress={handleEyePress} {...passwordTextInputProps} /> ) ); }; const renderTextInputContainer = () => { return ( customTextInputs || ( {renderEmailInput()} {renderPasswordInput()} {textInputChildren} ) ); }; const renderLoginButton = () => customLoginButton || ( { handleEmailValidation(); onLoginPress?.(); }} > {loginButtonText} ); const renderSignUp = () => customSignupButton || (!disableSignup && ( {signupText} )); const renderDivider = () => customDivider || (!disableDivider && ); const renderDefaultSocialLoginButtons = () => !disableSocialButtons ? ( <> ) : null; return ( {renderLogo()} {renderTextInputContainer()} {renderLoginButton()} {renderSignUp()} {renderDivider()} {customSocialLoginButtons || renderDefaultSocialLoginButtons()} {children} ); }; export default LoginScreen;