简体   繁体   English

如何防止登录用户看到登录页面

[英]How to prevent logged in user to see login page

So I have a React Native app that I'm working on, and this is my authentication flow:所以我有一个我正在开发的 React Native 应用程序,这是我的身份验证流程:

const Stack = createStackNavigator();

const MainContainer = () => {
  const { currentUser } = useAuth();

  if (currentUser) {
    return <HamburgerStack />;
  } else {
    return (
      <Stack.Navigator screenOptions={{ headerShown: false }}>
        <Stack.Screen name="Login" component={LoginScreen} />
        <Stack.Screen name="Register" component={RegisterScreen} />
        <Stack.Screen name="ForgotPassword" component={ForgotPasswordScreen} />
      </Stack.Navigator>
    );
  }
};

export default MainContainer;

I'm using firebase for authentication and currentUser is a Context hook.我正在使用 firebase 进行身份验证,而currentUser是一个上下文挂钩。

When I get into the app and I'm already logged in there is one moment that the authentication pages are shown, probably because firebase is looking for the user's info on the device.当我进入应用程序并且我已经登录时,会显示身份验证页面,可能是因为 firebase 正在设备上查找用户的信息。

I cannot think of how to prevent the user to see them.我想不出如何阻止用户看到它们。 Any tips?有小费吗?

Thank :)感谢 :)

What I did is created a separate stack for the dashboard, authentication, admin, and a splash screen (dummy) and wrapped all of them in a single stack.我所做的是为仪表板、身份验证、管理和启动屏幕(虚拟)创建了一个单独的堆栈,并将它们全部包装在一个堆栈中。

MainStack.js MainStack.js

import React, { useEffect } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import { StatusBar, View } from 'react-native';
import { SafeAreaProvider } from 'react-native-safe-area-context';

import AuthStack from './AuthStack';
import UserStack from './UserStack';
import AdminStack from './AdminStack';

import colors from '../constants/colors';
import Splash from '../screens/Splash';



export default function MainStack() {

    const Stack = createStackNavigator();

    return (
        <SafeAreaProvider>
            <NavigationContainer>

                <View>
                    <StatusBar backgroundColor={colors.DarkGrey} />
                </View>

                <Stack.Navigator initialRouteName='Splash' screenOptions={{ animationEnabled: false }}>
                    
                    <Stack.Screen name="Splash" component={Splash} options={{ headerShown: false }} />
                    <Stack.Screen name="AuthStack" component={AuthStack} options={{ headerShown: false }} />
                    <Stack.Screen name="UserStack" component={UserStack} options={{ headerShown: false }} />
                    <Stack.Screen name="AdminStack" component={AdminStack} options={{ headerShown: false }} />

                </Stack.Navigator>

            </NavigationContainer>
        </SafeAreaProvider>

    );
};

AuthStack.js AuthStack.js

import React from 'react';
import { createStackNavigator } from '@react-navigation/stack';
import Login from '../screens/AuthScreens/Login';
import Signup from '../screens/AuthScreens/Signup';

export default function AuthStack() {

    const Stack = createStackNavigator();

    return (

        <Stack.Navigator initialRouteName='Login' screenOptions={{ animationEnabled: false }}>
            <Stack.Screen name="Login" component={Login} options={{ headerShown: false }} />
            <Stack.Screen name="Signup" component={Signup} options={{ headerShown: false }} />
        </Stack.Navigator>

    );
};

UserStack.js (Dashboard) UserStack.js(仪表板)

import React from 'react';
import { createStackNavigator } from '@react-navigation/stack';
import TabNavigator from './TabNavigator/Index';
import EditProfile from '../screens/UserScreens/EditProfile';
import CarDetails from '../screens/UserScreens/CarDetails';
import Checkout from '../screens/UserScreens/Checkout';
import SelectCar from '../screens/UserScreens/SelectCar';
import BookingDetails from '../screens/UserScreens/BookingDetails';

export default function UserStack() {

    const Stack = createStackNavigator();

    return (

        <Stack.Navigator initialRouteName='TabNavigator' screenOptions={{ animationEnabled: false }}>

            <Stack.Screen name="TabNavigator" component={TabNavigator} options={{ headerShown: false }} />
            <Stack.Screen name="EditProfile" component={EditProfile} options={{ headerShown: false }} />
            <Stack.Screen name="SelectCar" component={SelectCar} options={{ headerShown: false }} />
            <Stack.Screen name="CarDetails" component={CarDetails} options={{ headerShown: false }} />
            <Stack.Screen name="Checkout" component={Checkout} options={{ headerShown: false }} />
            <Stack.Screen name="BookingDetails" component={BookingDetails} options={{ headerShown: false }} />
        </Stack.Navigator>

    );
};

Splash.js (It's a screen with no UI) Splash.js(这是一个没有 UI 的屏幕)

in this, I had to get data from the database so it's like that you can directly check for user and navigate在此,我必须从数据库中获取数据,因此您可以直接检查用户并导航

import React, { useEffect } from "react";
import { firebase } from "@react-native-firebase/auth"
import database from '@react-native-firebase/database';
import SplashScreen from 'react-native-splash-screen'

export default function Splash({ navigation }) {

    useEffect(() => {
        let user = firebase.auth().currentUser;
        // console.log('currentUser: ',user);
        if (user) {
            database()
                .ref('/Users/' + user.uid)
                .once('value')
                .then(snapshot => {
                    let Data = snapshot.val();
                    // console.log(Data);
                    if (Data.Role == 'ADMIN') {

                        navigation.replace('AdminStack');
                        SplashScreen.hide();

                        console.log("Success:", "Admin Logged In successfully");
                    } else {
                        navigation.replace('UserStack');
                        SplashScreen.hide();

                        console.log("Success:", "User Logged In successfully");
                    }
                })
        } else {
            navigation.replace('AuthStack')
            SplashScreen.hide();

        }
    }, [])
    return null;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM