11import { isSingleNewDotEntrySelector } from '@selectors/HybridApp' ;
22import { hasCompletedGuidedSetupFlowSelector , tryNewDotOnyxSelector } from '@selectors/Onboarding' ;
33import { emailSelector } from '@selectors/Session' ;
4- import { useEffect , useMemo , useRef } from 'react' ;
4+ import { useEffect , useMemo } from 'react' ;
55import { InteractionManager } from 'react-native' ;
66import { startOnboardingFlow } from '@libs/actions/Welcome/OnboardingFlow' ;
77import Log from '@libs/Log' ;
@@ -29,20 +29,16 @@ function useOnboardingFlowRouter() {
2929 const [ onboardingValues , isOnboardingCompletedMetadata ] = useOnyx ( ONYXKEYS . NVP_ONBOARDING , {
3030 canBeMissing : true ,
3131 } ) ;
32- const [ currentOnboardingPurposeSelected ] = useOnyx ( ONYXKEYS . ONBOARDING_PURPOSE_SELECTED , { canBeMissing : true } ) ;
33- const [ currentOnboardingCompanySize ] = useOnyx ( ONYXKEYS . ONBOARDING_COMPANY_SIZE , { canBeMissing : true } ) ;
34- const [ onboardingInitialPath , onboardingInitialPathMetadata ] = useOnyx ( ONYXKEYS . ONBOARDING_LAST_VISITED_PATH , { canBeMissing : true } ) ;
35- const [ account , accountMetadata ] = useOnyx ( ONYXKEYS . ACCOUNT , { canBeMissing : true } ) ;
36- const isOnboardingLoading = isLoadingOnyxValue ( onboardingInitialPathMetadata , accountMetadata ) ;
32+ const [ account ] = useOnyx ( ONYXKEYS . ACCOUNT , { canBeMissing : true } ) ;
3733
3834 const [ sessionEmail ] = useOnyx ( ONYXKEYS . SESSION , { canBeMissing : true , selector : emailSelector } ) ;
3935 const isLoggingInAsNewSessionUser = isLoggingInAsNewUser ( currentUrl , sessionEmail ) ;
40- const startedOnboardingFlowRef = useRef ( false ) ;
4136 const [ tryNewDot , tryNewDotMetadata ] = useOnyx ( ONYXKEYS . NVP_TRY_NEW_DOT , {
4237 selector : tryNewDotOnyxSelector ,
4338 canBeMissing : true ,
4439 } ) ;
4540 const { isHybridAppOnboardingCompleted, hasBeenAddedToNudgeMigration} = tryNewDot ?? { } ;
41+ const isOnboardingLoading = isLoadingOnyxValue ( isOnboardingCompletedMetadata , tryNewDotMetadata ) ;
4642
4743 const [ dismissedProductTraining , dismissedProductTrainingMetadata ] = useOnyx ( ONYXKEYS . NVP_DISMISSED_PRODUCT_TRAINING , { canBeMissing : true } ) ;
4844
@@ -56,7 +52,7 @@ function useOnboardingFlowRouter() {
5652 // This should delay opening the onboarding modal so it does not interfere with the ongoing ReportScreen params changes
5753 // eslint-disable-next-line @typescript-eslint/no-deprecated
5854 const handle = InteractionManager . runAfterInteractions ( ( ) => {
59- // Prevent starting the onboarding flow if we are logging in as a new user with short lived token
55+ // Prevent showing onboarding if we are logging in as a new user with short lived token
6056 if ( currentUrl ?. includes ( ROUTES . TRANSITION_BETWEEN_APPS ) && isLoggingInAsNewSessionUser ) {
6157 return ;
6258 }
@@ -78,6 +74,22 @@ function useOnboardingFlowRouter() {
7874 return ;
7975 }
8076
77+ // Temporary solution to navigate to onboarding when trying to access the app
78+ // Should be removed once Test Drive modal route has its own navigation guard
79+ // Details: https://github.com/Expensify/App/pull/79898
80+ if ( hasCompletedGuidedSetupFlowSelector ( onboardingValues ) && onboardingValues ?. testDriveModalDismissed === false ) {
81+ Navigation . setNavigationActionToMicrotaskQueue ( ( ) => {
82+ Log . info ( '[Onboarding] User has not completed the guided setup flow, starting onboarding flow from test drive modal' ) ;
83+ startOnboardingFlow ( {
84+ onboardingInitialPath : ROUTES . TEST_DRIVE_MODAL_ROOT . route ,
85+ isUserFromPublicDomain : false ,
86+ hasAccessiblePolicies : false ,
87+ currentOnboardingCompanySize : undefined ,
88+ currentOnboardingPurposeSelected : undefined ,
89+ onboardingValues,
90+ } ) ;
91+ } ) ;
92+ }
8193 if ( hasBeenAddedToNudgeMigration && ! isProductTrainingElementDismissed ( 'migratedUserWelcomeModal' , dismissedProductTraining ) ) {
8294 const navigationState = navigationRef . getRootState ( ) ;
8395 const lastRoute = navigationState . routes . at ( - 1 ) ;
@@ -89,12 +101,6 @@ function useOnboardingFlowRouter() {
89101 return ;
90102 }
91103
92- if ( hasBeenAddedToNudgeMigration ) {
93- return ;
94- }
95-
96- const isOnboardingCompleted = hasCompletedGuidedSetupFlowSelector ( onboardingValues ) && onboardingValues ?. testDriveModalDismissed !== false ;
97-
98104 if ( CONFIG . IS_HYBRID_APP ) {
99105 // For single entries, such as using the Travel feature from OldDot, we don't want to show onboarding
100106 if ( isSingleNewDotEntry ) {
@@ -105,37 +111,6 @@ function useOnboardingFlowRouter() {
105111 if ( isHybridAppOnboardingCompleted === false ) {
106112 Navigation . navigate ( ROUTES . EXPLANATION_MODAL_ROOT ) ;
107113 }
108-
109- // But if the hybrid app onboarding is completed, but NewDot onboarding is not completed, we start NewDot onboarding flow
110- // This is a special case when user created an account from NewDot without finishing the onboarding flow and then logged in from OldDot
111- if ( isHybridAppOnboardingCompleted === true && isOnboardingCompleted === false && ! startedOnboardingFlowRef . current ) {
112- startedOnboardingFlowRef . current = true ;
113- Log . info ( '[Onboarding] Hybrid app onboarding is completed, but NewDot onboarding is not completed, starting NewDot onboarding flow' ) ;
114- startOnboardingFlow ( {
115- onboardingValuesParam : onboardingValues ,
116- isUserFromPublicDomain : ! ! account ?. isFromPublicDomain ,
117- hasAccessiblePolicies : ! ! account ?. hasAccessibleDomainPolicies ,
118- currentOnboardingCompanySize,
119- currentOnboardingPurposeSelected,
120- onboardingInitialPath,
121- onboardingValues,
122- } ) ;
123- }
124- }
125-
126- // If the user is not transitioning from OldDot to NewDot, we should start NewDot onboarding flow if it's not completed yet
127- if ( ! CONFIG . IS_HYBRID_APP && isOnboardingCompleted === false && ! startedOnboardingFlowRef . current ) {
128- startedOnboardingFlowRef . current = true ;
129- Log . info ( '[Onboarding] Not a hybrid app, NewDot onboarding is not completed, starting NewDot onboarding flow' ) ;
130- startOnboardingFlow ( {
131- onboardingValuesParam : onboardingValues ,
132- isUserFromPublicDomain : ! ! account ?. isFromPublicDomain ,
133- hasAccessiblePolicies : ! ! account ?. hasAccessibleDomainPolicies ,
134- currentOnboardingCompanySize,
135- currentOnboardingPurposeSelected,
136- onboardingInitialPath,
137- onboardingValues,
138- } ) ;
139114 }
140115 } ) ;
141116
@@ -152,16 +127,11 @@ function useOnboardingFlowRouter() {
152127 hasBeenAddedToNudgeMigration ,
153128 dismissedProductTrainingMetadata ,
154129 dismissedProductTraining ?. migratedUserWelcomeModal ,
155- onboardingValues ,
156130 dismissedProductTraining ,
157- account ?. isFromPublicDomain ,
158- account ?. hasAccessibleDomainPolicies ,
159131 currentUrl ,
160132 isLoggingInAsNewSessionUser ,
161- currentOnboardingCompanySize ,
162- currentOnboardingPurposeSelected ,
163- onboardingInitialPath ,
164133 isOnboardingLoading ,
134+ onboardingValues ,
165135 ] ) ;
166136
167137 return {
0 commit comments