import React, { useEffect } from "react"; import { View, Text, TouchableOpacity, StyleSheet } from "react-native"; import MaterialIcons from "@expo/vector-icons/MaterialIcons"; import Ionicons from "@expo/vector-icons/Ionicons"; import LoginSVG from "@assets/images/login.svg"; import GoogleSVG from "@assets/images/google.svg"; import FacebookSVG from "@assets/images/facebook.svg"; import TwitterSVG from "@assets/images/twitter.svg"; import CustomButton from "@components/Buttons/CustomButton"; import InputField from "@components/InputField"; import { globalStyles } from "@styles/global"; import Loader from "@components/Loader"; import { Formik } from "formik"; import { loginSchema } from "@schemas/loginSchema"; import { useDispatch, useSelector } from "react-redux"; import { selectLoginError } from "@store/selectors/loginSelectors"; import { clearLoginErrors, fetchUser } from "@store/actions/login/loginActions"; import { selectIsLoadingByActionType } from "@store/selectors/loadingSelectors"; import { LOGIN_USER_SCOPE } from "@store/actions/login/loginActionConstants"; import { fetchAuthProvider } from "@store/actions/authProvider/authProviderActions"; import useAuthHook from "../hooks/useAuthHook"; import { storeData } from "@service/asyncStorage"; import { ACCESS_TOKEN } from "@constants/localStorage"; import Layout from "@components/Layout/Layout"; import { useTheme } from "@styles"; import { useTranslation } from "react-i18next"; const LoginScreen = ({ navigation }) => { const { colors } = useTheme(); const { t } = useTranslation(); const { response, promptAsync } = useAuthHook(); const dispatch = useDispatch(); const error = useSelector(selectLoginError); const isLoading = useSelector(selectIsLoadingByActionType(LOGIN_USER_SCOPE)); const storeToken = async (token) => { await storeData(ACCESS_TOKEN, token); }; useEffect(() => { if (response?.type === "success") { const accessToken = response.authentication.accessToken; if (accessToken) { storeToken(accessToken); dispatch(fetchAuthProvider({ accessToken })); } } }, [response]); const handleGoogleAuth = () => { promptAsync({ useProxy: true, showInRecents: true }); }; const handleLogin = (values) => { const { email, password } = values; dispatch(clearLoginErrors()); dispatch( fetchUser({ identifier: email, password, }) ); }; return ( {({ handleChange, handleBlur, handleSubmit, values, isValid, errors, }) => ( <> {t('login.signIn')} } /> {errors.email && ( {errors.email} )} {}} inputType="password" handleBlur={handleBlur("password")} text={values.password} onChangeText={handleChange("password")} icon={ } /> {errors.password && ( {errors.password} )} {error && {error}} )} {t('login.orLoginWith')} {}} style={globalStyles.iconButton}> {}} style={globalStyles.iconButton}> {t('login.needAccount')}{" "} navigation.navigate("Register")}> {t('login.signUp')} ); }; const styles = StyleSheet.create({ providerText: { textAlign: "center", color: "#666", marginBottom: 30, fontFamily: "poppins-regular", }, providersContainer: { flexDirection: "row", justifyContent: "space-between", marginBottom: 30, }, registerContainer: { flexDirection: "row", justifyContent: "center", marginBottom: 30, }, registerButtonText: { color: "#AD40AF", fontWeight: "700", fontFamily: "poppins-semibold", }, errorMessage: { marginBottom: 30, color: "red", }, }); export default LoginScreen;