Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6427,7 +6427,6 @@ const CONST = {
ONBOARDING_RHP_VARIANT: {
RHP_CONCIERGE_DM: 'rhpConciergeDm',
RHP_ADMINS_ROOM: 'rhpAdminsRoom',
RHP_HOME_PAGE: 'rhpHomePage',
CONTROL: 'control',
},
ACTIONABLE_TRACK_EXPENSE_WHISPER_MESSAGE: 'What would you like to do with this expense?',
Expand Down
6 changes: 2 additions & 4 deletions src/components/SidePanel/RHPVariantTest/index.native.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@ import type {HandleRHPVariantNavigation, ShouldOpenRHPVariant} from './types';
/**
* Side Panel is not supported on native platforms, so we always return false.
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const shouldOpenRHPVariant: ShouldOpenRHPVariant = (_variantOverride) => false;
const shouldOpenRHPVariant: ShouldOpenRHPVariant = () => false;

/**
* No-op on native platforms since Side Panel is not supported.
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const handleRHPVariantNavigation: HandleRHPVariantNavigation = (_onboardingPolicyID, _variantOverride) => {};
const handleRHPVariantNavigation: HandleRHPVariantNavigation = () => {};

export {shouldOpenRHPVariant, handleRHPVariantNavigation};
26 changes: 5 additions & 21 deletions src/components/SidePanel/RHPVariantTest/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,38 +29,22 @@ Onyx.connectWithoutView({
/**
* Determines if the user should be navigated to the RHP variant side panel after onboarding.
* The RHP variant is only shown to micro companies that are part of the RHP experiment.
*
* Accepts an optional variantOverride to bypass the module-level Onyx variable, avoiding a race
* condition where the Onyx callback hasn't fired yet when this is called immediately after the
* CompleteGuidedSetup API response.
*/
const shouldOpenRHPVariant: ShouldOpenRHPVariant = (variantOverride) => {
const variant = variantOverride ?? onboardingRHPVariant;
const shouldOpenRHPVariant: ShouldOpenRHPVariant = () => {
const isMicroCompany = onboardingCompanySize === CONST.ONBOARDING_COMPANY_SIZE.MICRO;
const isRHPConciergeDM = variant === CONST.ONBOARDING_RHP_VARIANT.RHP_CONCIERGE_DM;
const isRHPAdminsRoom = variant === CONST.ONBOARDING_RHP_VARIANT.RHP_ADMINS_ROOM;
const isRHPHomePage = variant === CONST.ONBOARDING_RHP_VARIANT.RHP_HOME_PAGE;
const isRHPConciergeDM = onboardingRHPVariant === CONST.ONBOARDING_RHP_VARIANT.RHP_CONCIERGE_DM;
const isRHPAdminsRoom = onboardingRHPVariant === CONST.ONBOARDING_RHP_VARIANT.RHP_ADMINS_ROOM;

return isMicroCompany && (isRHPConciergeDM || isRHPAdminsRoom || isRHPHomePage);
return isMicroCompany && (isRHPConciergeDM || isRHPAdminsRoom);
};

/**
* Handles navigation for RHP experiment:
* - Control: navigate to the last accessed report on small screens, do not open side panel
* - RHP Concierge DM: navigate to the workspace overview and open the side panel with the Concierge DM
* - RHP Admins Room: navigate to the workspace overview and open the side panel with the Admins Room
* - RHP Home Page: navigate to the Home page and open the side panel with the Concierge DM
*
* Accepts an optional variantOverride for the same race-condition reason as shouldOpenRHPVariant.
*/
const handleRHPVariantNavigation: HandleRHPVariantNavigation = (onboardingPolicyID, variantOverride) => {
const variant = variantOverride ?? onboardingRHPVariant;
if (variant === CONST.ONBOARDING_RHP_VARIANT.RHP_HOME_PAGE) {
Navigation.navigate(ROUTES.HOME);
SidePanelActions.openSidePanel(true);
return;
}

const handleRHPVariantNavigation: HandleRHPVariantNavigation = (onboardingPolicyID) => {
Navigation.navigate(ROUTES.WORKSPACE_OVERVIEW.getRoute(onboardingPolicyID));
SidePanelActions.openSidePanel(true);
};
Expand Down
6 changes: 2 additions & 4 deletions src/components/SidePanel/RHPVariantTest/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import type {OnboardingRHPVariant} from '@src/types/onyx';

type ShouldOpenRHPVariant = (variantOverride?: OnboardingRHPVariant | null) => boolean;
type HandleRHPVariantNavigation = (onboardingPolicyID?: string, variantOverride?: OnboardingRHPVariant | null) => void;
type ShouldOpenRHPVariant = () => boolean;
type HandleRHPVariantNavigation = (onboardingPolicyID?: string) => void;

export type {ShouldOpenRHPVariant, HandleRHPVariantNavigation};
8 changes: 2 additions & 6 deletions src/libs/navigateAfterOnboarding.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {handleRHPVariantNavigation, shouldOpenRHPVariant} from '@components/SidePanel/RHPVariantTest';
import ROUTES from '@src/ROUTES';
import type {OnboardingRHPVariant} from '@src/types/onyx';
import {setDisableDismissOnEscape} from './actions/Modal';
import shouldOpenOnAdminRoom from './Navigation/helpers/shouldOpenOnAdminRoom';
import Navigation from './Navigation/Navigation';
Expand Down Expand Up @@ -51,12 +50,11 @@ function navigateAfterOnboarding(
onboardingPolicyID?: string,
onboardingAdminsChatReportID?: string,
shouldPreventOpenAdminRoom = false,
onboardingRHPVariant?: OnboardingRHPVariant | null,
) {
setDisableDismissOnEscape(false);

if (shouldOpenRHPVariant(onboardingRHPVariant)) {
handleRHPVariantNavigation(onboardingPolicyID, onboardingRHPVariant);
if (shouldOpenRHPVariant()) {
handleRHPVariantNavigation(onboardingPolicyID);
Comment on lines +56 to +57

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep passing the RHP variant into post-onboarding navigation

On web, completeOnboarding() still switches to API.makeRequestWithSideEffects specifically so the caller can read nvp_onboardingRHPVariant from the response (src/libs/actions/Report/index.ts:5028-5034), but this revert removes that variant from the navigateAfterOnboarding*() call chain and makes shouldOpenRHPVariant() rely only on the module-level Onyx.connectWithoutView cache. When a micro-company user is assigned rhpConciergeDm or rhpAdminsRoom, that callback can still be stale immediately after await completeOnboarding(), so they intermittently fall through to the control path instead of opening the workspace overview with the side panel.

Useful? React with 👍 / 👎.

return;
}

Expand Down Expand Up @@ -85,7 +83,6 @@ function navigateAfterOnboardingWithMicrotaskQueue(
onboardingPolicyID?: string,
onboardingAdminsChatReportID?: string,
shouldPreventOpenAdminRoom = false,
onboardingRHPVariant?: OnboardingRHPVariant | null,
) {
Navigation.dismissModal();
Navigation.setNavigationActionToMicrotaskQueue(() => {
Expand All @@ -97,7 +94,6 @@ function navigateAfterOnboardingWithMicrotaskQueue(
onboardingPolicyID,
onboardingAdminsChatReportID,
shouldPreventOpenAdminRoom,
onboardingRHPVariant,
);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import type {TranslationPaths} from '@src/languages/types';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import SCREENS from '@src/SCREENS';
import type {OnboardingRHPVariant} from '@src/types/onyx';
import type {BaseOnboardingInterestedFeaturesProps, Feature, SectionObject} from './types';

function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardingInterestedFeaturesProps) {
Expand Down Expand Up @@ -220,7 +219,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin
setOnboardingPolicyID(policyID);
}

const response = await completeOnboarding({
await completeOnboarding({
engagementChoice: onboardingPurposeSelected,
onboardingMessage: onboardingMessages[onboardingPurposeSelected],
adminsChatReportID,
Expand All @@ -236,11 +235,6 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin
betas,
});

// Extract the RHP variant directly from the API response to avoid a race condition
// where the Onyx callback hasn't fired yet when navigateAfterOnboarding is called.
const rhpVariantUpdate = (response?.onyxData as Array<{key: string; value: unknown}> | undefined)?.find((update) => update.key === ONYXKEYS.NVP_ONBOARDING_RHP_VARIANT);
const rhpVariant = rhpVariantUpdate?.value as OnboardingRHPVariant | undefined;

// Avoid creating new WS because onboardingPolicyID is cleared before unmounting
// eslint-disable-next-line @typescript-eslint/no-deprecated
InteractionManager.runAfterInteractions(() => {
Expand All @@ -259,7 +253,6 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin
// Onboarding tasks would show in Concierge instead of admins room for testing accounts, we should open where onboarding tasks are located
// See https://github.com/Expensify/App/issues/57167 for more details
(session?.email ?? '').includes('+'),
rhpVariant,
);
} catch (error) {
Log.warn('[BaseOnboardingInterestedFeatures] Error completing onboarding', {error});
Expand Down
5 changes: 2 additions & 3 deletions src/types/onyx/OnboardingRHPVariant.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
/**
* The variant of the onboarding RHP for A/B/C/D testing
* The variant of the onboarding RHP for A/B/C testing
* @description 'control' - The variant with the Concierge DM
* @description 'rhpConciergeDm' - Admin of workspace with Concierge DM
* @description 'rhpAdminsRoom' - Admin of workspace with the admins room
* @description 'rhpHomePage' - Navigate to Home page with Concierge Anywhere accessible in #admins room
*/
type OnboardingRHPVariant = 'rhpConciergeDm' | 'rhpAdminsRoom' | 'rhpHomePage' | 'control';
type OnboardingRHPVariant = 'rhpConciergeDm' | 'rhpAdminsRoom' | 'control';

export default OnboardingRHPVariant;
Loading