in packages/fxa-settings/src/pages/Signin/utils.ts [158:228]
export async function handleNavigation(navigationOptions: NavigationOptions) {
const { integration } = navigationOptions;
const isOAuth = isOAuthIntegration(integration);
const isWebChannelIntegration =
integration.isSync() || integration.isDesktopRelay();
if (!navigationOptions.signinData.verified) {
const { to, locationState } =
getUnverifiedNavigationTarget(navigationOptions);
if (
isWebChannelIntegration &&
navigationOptions.handleFxaLogin === true &&
// If the _next page_ is `signin_totp_code`, we don't want to send this
// because we end up sending it twice with the first message containing
// `verified: false`, causing a Sync sign-in issue (see FXA-9837).
!to?.includes('signin_totp_code')
) {
sendFxaLogin(navigationOptions);
}
performNavigation({ to, locationState });
return { error: undefined };
}
if (
navigationOptions.signinData.verificationReason ===
VerificationReasons.CHANGE_PASSWORD
) {
// TODO in FXA-6653: remove hardNavigate when this route is converted to React
hardNavigate('/post_verify/password/force_password_change', {}, true);
return { error: undefined };
}
if (isWebChannelIntegration && navigationOptions.handleFxaLogin === true) {
// This _must_ be sent before fxaOAuthLogin for Desktop OAuth flow.
// Mobile doesn't care about this message (see FXA-10388)
sendFxaLogin(navigationOptions);
}
if (!isOAuth) {
const { to, locationState, shouldHardNavigate } =
await getNonOAuthNavigationTarget(navigationOptions);
performNavigation({ to, locationState, shouldHardNavigate });
return { error: undefined };
}
// Note that OAuth redirect can only be obtained when the session is verified,
// otherwise oauth/authorization endpoint throws an "unconfirmed session" error
if (isOAuth) {
const { to, locationState, oauthData, shouldHardNavigate, error } =
await getOAuthNavigationTarget(navigationOptions);
if (error) {
return { error };
}
if (
isOAuthNativeIntegration(integration) &&
navigationOptions.handleFxaOAuthLogin === true &&
oauthData
) {
firefox.fxaOAuthLogin({
action: 'signin',
code: oauthData.code,
redirect: oauthData.redirect,
state: oauthData.state,
});
}
performNavigation({ to, locationState, shouldHardNavigate });
}
return { error: undefined };
}