Skip to content

Commit 337139e

Browse files
authored
Merge pull request Expensify#92646 from KJ21-ENG/KJ21-ENG/92417-onboarding-null-path
Fix onboarding null initial path crash
2 parents 0c73e2a + 1b185a0 commit 337139e

2 files changed

Lines changed: 27 additions & 9 deletions

File tree

src/libs/actions/Welcome/OnboardingFlow.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type GetOnboardingInitialPathParamsType = {
2727
onboardingValuesParam?: Onboarding;
2828
currentOnboardingPurposeSelected: OnyxEntry<OnboardingPurpose>;
2929
currentOnboardingCompanySize: OnyxEntry<OnboardingCompanySize>;
30-
onboardingInitialPath: OnyxEntry<string>;
30+
onboardingInitialPath: OnyxEntry<string> | null;
3131
onboardingValues: OnyxEntry<Onboarding>;
3232
isAccountValidated?: boolean;
3333
};
@@ -106,11 +106,12 @@ function getOnboardingInitialPath(getOnboardingInitialPathParams: GetOnboardingI
106106
onboardingValuesParam,
107107
currentOnboardingPurposeSelected,
108108
currentOnboardingCompanySize,
109-
onboardingInitialPath = '',
109+
onboardingInitialPath,
110110
onboardingValues,
111111
isAccountValidated,
112112
} = getOnboardingInitialPathParams;
113-
const state = getStateFromPath(onboardingInitialPath, linkingConfig.config);
113+
const initialPath = onboardingInitialPath ?? '';
114+
const state = getStateFromPath(initialPath, linkingConfig.config);
114115
const currentOnboardingValues = onboardingValuesParam ?? onboardingValues;
115116
const isVsb = currentOnboardingValues?.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB;
116117
const isSmb = currentOnboardingValues?.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.SMB;
@@ -134,7 +135,7 @@ function getOnboardingInitialPath(getOnboardingInitialPathParams: GetOnboardingI
134135

135136
// PRIVATE_DOMAIN ("People you may know are already here") only makes sense for users on a private domain. Only redirect
136137
// validated accounts; unvalidated users mid-AddWorkEmail can legitimately land here while isFromPublicDomain is stale.
137-
if (isUserFromPublicDomain && isAccountValidated && onboardingInitialPath.includes(ROUTES.ONBOARDING_PRIVATE_DOMAIN.route)) {
138+
if (isUserFromPublicDomain && isAccountValidated && initialPath.includes(ROUTES.ONBOARDING_PRIVATE_DOMAIN.route)) {
138139
if (isVsb) {
139140
return `/${ROUTES.ONBOARDING_ACCOUNTING.route}`;
140141
}
@@ -145,8 +146,8 @@ function getOnboardingInitialPath(getOnboardingInitialPathParams: GetOnboardingI
145146
}
146147

147148
if (!isUserFromPublicDomain && hasAccessiblePolicies) {
148-
if (onboardingInitialPath) {
149-
return onboardingInitialPath;
149+
if (initialPath) {
150+
return initialPath;
150151
}
151152
return `/${ROUTES.ONBOARDING_PERSONAL_DETAILS.route}`;
152153
}
@@ -162,18 +163,18 @@ function getOnboardingInitialPath(getOnboardingInitialPathParams: GetOnboardingI
162163
return `/${ROUTES.ONBOARDING_ROOT.route}`;
163164
}
164165

165-
if (onboardingInitialPath.includes(ROUTES.ONBOARDING_EMPLOYEES.route) && currentOnboardingPurposeSelected !== null && !isCurrentOnboardingPurposeManageTeam) {
166+
if (initialPath.includes(ROUTES.ONBOARDING_EMPLOYEES.route) && currentOnboardingPurposeSelected !== null && !isCurrentOnboardingPurposeManageTeam) {
166167
return `/${ROUTES.ONBOARDING_PURPOSE.route}`;
167168
}
168169

169170
if (
170-
onboardingInitialPath.includes(ROUTES.ONBOARDING_ACCOUNTING.route) &&
171+
initialPath.includes(ROUTES.ONBOARDING_ACCOUNTING.route) &&
171172
((currentOnboardingPurposeSelected !== null && !isCurrentOnboardingPurposeManageTeam) || (currentOnboardingCompanySize === null && currentOnboardingPurposeSelected !== null))
172173
) {
173174
return `/${ROUTES.ONBOARDING_PURPOSE.route}`;
174175
}
175176

176-
return onboardingInitialPath;
177+
return initialPath;
177178
}
178179

179180
const getOnboardingMessages = (locale?: Locale) => {

tests/unit/OnboardingFlowTest.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,23 @@ import CONST from '@src/CONST';
44

55
describe('OnboardingFlow', () => {
66
describe('getOnboardingInitialPath', () => {
7+
it('should return the onboarding fallback path when the last visited path is null', () => {
8+
const params: GetOnboardingInitialPathParamsType = {
9+
isUserFromPublicDomain: false,
10+
hasAccessiblePolicies: false,
11+
currentOnboardingPurposeSelected: CONST.ONBOARDING_CHOICES.PERSONAL_SPEND,
12+
currentOnboardingCompanySize: CONST.ONBOARDING_COMPANY_SIZE.SMALL,
13+
onboardingInitialPath: null,
14+
onboardingValues: undefined,
15+
};
16+
17+
let path = '';
18+
expect(() => {
19+
path = getOnboardingInitialPath(params);
20+
}).not.toThrow();
21+
expect(path).toBe('/onboarding');
22+
});
23+
724
it('should return the correct path for personal spend', () => {
825
const params: GetOnboardingInitialPathParamsType = {
926
isUserFromPublicDomain: false,

0 commit comments

Comments
 (0)