I am trying to switch navigators upon a condition of useToken exists or not. I am using asyncStorage To know if there's a token it's true and show app screens otherwise show authScreens.But I can't switch between Navigators whenever i hit login i am adding token to async storage if i hit logout i am removing token from asyncStorage.The Switching of containers not happening Instantly. It's happening on next reload or refresh . I am new to react native any resources related to this topic is appreciated. Thank you
App.js
const App = () => {
const[userToken,setUserToken]=useState(null)
useEffect(()=>{
const getT=async()=>{
const token=await getToken() //getting token from storage
console.warn("auth",token)
setUserLToken(token) //store token in local storage
}
getT()
},[]
)
return(
<NavigationContainer>
{userToken === undefined ? <AuthStack/> : <AppStack/>}
</NavigationContainer>
)
};
Appstack.js
const AppStack = () => {
return (
<Stack.Navigator screenOptions={{headerShown:false}}>
<Stack.Screen name="HomeScreen" component={TabNavigator}/>
<Stack.Screen name="Location" component={Location}/>
<Stack.Screen name="Calltoorder" component={Calltoorder}/>
<Stack.Screen name='Profile' component={Profile}/>
<Stack.Screen name="EditProfile" component={EditProfile}/>
<Stack.Screen name='ProductItem' component={ProductItem}/>
<Stack.Screen name='SubCategories' component={SubCategories}/>
<Stack.Screen name='Categories' component={Categories}/>
<Stack.Screen name='CartContainer' component={CartContainer} options={{ headerShown:true }}/>
<Stack.Screen name='MedicineCart' component={MedicineCart}/>
<Stack.Screen name='LabCart' component={LabCart}/>
<Stack.Screen name='OrderHistory' component={OrderHistory}/>
<Stack.Screen name='ProductDescription' component={ProductDescription}/>
<Stack.Screen name='Test' component={Test}/>
<Stack.Screen name='DoctorCard' component={DoctorCard}/>
<Stack.Screen name='DocBySpecialization' component={DocBySpecialization}/>
<Stack.Screen name='DoctorDetails' component={DoctorDetails}/>
<Stack.Screen name='AllTests' component={AllTests}/>
<Stack.Screen name='AllPackages' component={AllPackages}/>
<Stack.Screen name='TestsAndPackagesById' component={TestsAndPackagesById}/>
<Stack.Screen name='EmptyPage' component={EmptyPage} options={{ headerShown:true }}/>
<Stack.Screen name='DiagSearch' component={DiagSearch}/>
</Stack.Navigator>
)
}
authstack.js
const AuthStack = () => {
return (
<Stack.Navigator screenOptions={{headerShown:false}}>
<Stack.Screen name="Signin" component={Signin}/>
<Stack.Screen name="Signup" component={Signup}/>
<Stack.Screen name="ConfirmEmail" component={ConfirmEmail}/>
<Stack.Screen name="ForgotPass" component={ForgotPass}/>
<Stack.Screen name="NewPass" component={NewPass}/>
</Stack.Navigator>
)
}
CodePudding user response:
One way to achieve this is using a "toggle flag" to re-run useEffect
whenever some event occurs (in your case, it is token update).
In the below code, we give tokenFlag
as a dependency to the useEffect
. So whenever the tokenFlag
state changes, useEffect will re-run. This will update your userToken
and the Navigation containers will be changed.
const App = () => {
const[userToken,setUserToken] = useState(undefined)
const[tokenFlag, toggleTokenFlag] = useState(false)
useEffect(()=>{
const getT = async ()=>{
const token=await getToken() //getting token from storage
console.warn("auth",token)
setUserLToken(token) //store token in local storage
}
getT()
},[tokenFlag])
const login = () => {
// your login business logic...
toggleTokenFlag(!tokenFlag)
}
const logout = () => {
// your logout business logic...
toggleTokenFlag(!tokenFlag)
}
return(
<NavigationContainer>
{userToken === undefined ? <AuthStack/> : <AppStack/>}
</NavigationContainer>
)
};
If your login & logout functions are in different files, then you might have to use global state for triggering use effect.
CodePudding user response:
It works like this because of the empty array of dependencies in useEffect. An empty array means, the useEffect runs only once when the page is refreshed after the components are mounted. To run it after a change happens in token, Try adding your token variable to the dependency array