Reputation: 2547
What I'm trying to achieve is to navigate to another screen based on the API response from a state. I suspect, I'm doing something wrong. I'm learning react native & appreciate the help.
function Signin({navigation}) {
const [form, setForm] = useState({});
const [errors, setErrors] = useState({});
const {
authDispatch,
authState: {error, loading, data},
} = useContext(GlobalContext);
const onPressLogin = () => {
signin(form)(authDispatch);
};
function gotoVerifyTAC() {
navigation.navigate(VERIFY_OTP_SCREEN);
}
return (
<View>
{loading && <LoadingModal loading={loading} size={'large'} />}
<View>
{!loading && data?.accessToken && gotoVerifyTAC()}
<SigninComponent
onChange={onChange}
onPressLogin={onPressLogin}
onPressResetPassword={onPressResetPassword}
form={form}
errors={errors}
error={error}
loading={loading}
data={data}
navigation={navigation}
/>
</View>
</View>
);
}
export default Signin;
Upvotes: 0
Views: 605
Reputation: 84
The logic navigation and the checking for successful login should be put in a useEffect
, and removed from the function and the render output. Something like this should work
function Signin({navigation}) {
const [form, setForm] = useState({});
const [errors, setErrors] = useState({});
const {
authDispatch,
authState: {error, loading, data},
} = useContext(GlobalContext);
const onPressLogin = () => {
signin(form)(authDispatch);
};
useEffect(() => {
if (!loading && data?.accessToken) {
navigation.navigate(VERIFY_OTP_SCREEN);
}
}, [loading, data])
return (
<View>
{loading && <LoadingModal loading={loading} size={'large'} />}
<View>
<SigninComponent
onChange={onChange}
onPressLogin={onPressLogin}
onPressResetPassword={onPressResetPassword}
form={form}
errors={errors}
error={error}
loading={loading}
data={data}
navigation={navigation}
/>
</View>
</View>
);
}
export default Signin;
useEffect
's are used to handle side effects, i.e. when changes happen to state, like the example with your login and navigation logic.
Upvotes: 1