Итак, я только что обновил проект ignite-bowser до их 5.0 шаблона , который включает в себя React Navigation 5, что требует изменения устаревшего рекомендуемого метода использования SwitchNavigator для переключения между StackNavigators 'Auth' и 'App', к новому декларативному подходу потока аутентификации , который делает избыточным SwitchNavigator.
FYI, проекты Ignite Bowser по сути, React Native шаблонные приложения, поддерживаемые
React Native
React Navigation
MobX State Tree
TypeScript
Reactotron
And more!
Так что все это кажется достаточно простым, но я не смог заставить переключаться настоящие навигаторы при использовании логического значения, хранящегося в одном из магазинов приложений, и установить true
в действии, вызванном в методе аутентификации.
В соответствии с журналами сервера и фидом Reactotron аутентификация работает нормально. После перезагрузки приложения визуализируется навигатор приложений, но на самом деле сеанс недопустим, поскольку память была очищена. Все последующие запросы не выполняются, но приложение не переключается на навигатор Auth.
Вот соответствующие фрагменты кода:
root -navigator.tsx
const RootStack = () => {
const { pbidStore } = useStores()
return (
<Stack.Navigator
screenOptions={{
headerShown: false,
gestureEnabled: true,
stackPresentation: "modal",
}}
>
{pbidStore.isAuthenticated ? (
<Stack.Screen
name="pbidStack"
component={PbidNavigator}
options={{
headerShown: false,
}}
/>
) : (
<Stack.Screen
name="authStack"
component={AuthNavigator}
options={{
headerShown: false,
}}
/>
)}
</Stack.Navigator>
/**
* PbidStore Model
*/
export const PbidStoreModel = types.model("PbidStore").props({
....
isAuthenticated: types.optional(types.boolean, false),
})
.actions(self => ({
setStatus(value?: "idle" | "pending" | "done" | "error") {
self.status = value
},
setAuthToken(token: string) {
self.environment.pbidApi.setAuthToken(token)
},
setAuthenticated(value: boolean) {
self.isAuthenticated = value
},
...
}))
.actions(self => ({
authenticate: flow(function*(email: string, password: string, remember: boolean) {
self.setStatus("pending")
try {
const result = yield self.environment.pbidApi.authenticate(email, password)
if (result.kind === "ok") {
self.setAuthToken(result.token)
self.setStatus("done")
self.setAuthenticated(true)
self.loadUser()
if(remember)
yield self.storeCredentials(email, password)
} else {
self.setStatus("error")
self.setAuthenticated(false)
}
} catch {
self.setStatus("error")
self.setAuthenticated(false)
}
}),
...