diff --git a/src/components/AddPaymentMethodMenu.tsx b/src/components/AddPaymentMethodMenu.tsx index c4b60bd1eaf55..f9479fff03b57 100644 --- a/src/components/AddPaymentMethodMenu.tsx +++ b/src/components/AddPaymentMethodMenu.tsx @@ -62,6 +62,7 @@ function AddPaymentMethodMenu({ const [restoreFocusType, setRestoreFocusType] = useState(); const [session] = useOnyx(ONYXKEYS.SESSION); const [introSelected, introSelectedStatus] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); + const [betas] = useOnyx(ONYXKEYS.BETAS); // Users can choose to pay with business bank account in case of Expense reports or in case of P2P IOU report // which then starts a bottom up flow and creates a Collect workspace where the payer is an admin and payee is an employee. @@ -78,9 +79,9 @@ function AddPaymentMethodMenu({ return; } - completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA, introSelected); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA, introSelected, betas); onItemSelected(CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT); - }, [introSelected, introSelectedStatus, introSelectedStatus.status, isPersonalOnlyOption, isVisible, onItemSelected]); + }, [betas, introSelected, introSelectedStatus, introSelectedStatus.status, isPersonalOnlyOption, isVisible, onItemSelected]); if (isPersonalOnlyOption) { return null; @@ -107,7 +108,7 @@ function AddPaymentMethodMenu({ text: translate('common.personalBankAccount'), icon: icons.Bank, onSelected: () => { - completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA, introSelected); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA, introSelected, betas); onItemSelected(CONST.PAYMENT_METHODS.PERSONAL_BANK_ACCOUNT); }, }, diff --git a/src/components/KYCWall/BaseKYCWall.tsx b/src/components/KYCWall/BaseKYCWall.tsx index c7440389198fc..690ebaaa3e6cc 100644 --- a/src/components/KYCWall/BaseKYCWall.tsx +++ b/src/components/KYCWall/BaseKYCWall.tsx @@ -62,6 +62,7 @@ function KYCWall({ const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`); const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); + const [betas] = useOnyx(ONYXKEYS.BETAS); const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT); const {formatPhoneNumber} = useLocalize(); @@ -167,7 +168,7 @@ function KYCWall({ if (policyID && iouReport?.policyID) { savePreferredPaymentMethod(iouReport.policyID, policyID, CONST.LAST_PAYMENT_METHOD.IOU, lastPaymentMethod?.[iouReport?.policyID]); } - completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, introSelected, adminsChatReportID, policyID); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, introSelected, betas, adminsChatReportID, policyID); if (workspaceChatReportID) { Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(workspaceChatReportID, reportPreviewReportActionID)); } @@ -212,6 +213,7 @@ function KYCWall({ introSelected, formatPhoneNumber, lastPaymentMethod, + betas, ], ); diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index b4dbce6adc138..3627e08436114 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -11424,6 +11424,7 @@ type PrepareOnboardingOnyxDataParams = { isInvitedAccountant?: boolean; onboardingPurposeSelected?: OnboardingPurpose; isSelfTourViewed?: boolean; + betas?: OnyxEntry; }; function prepareOnboardingOnyxData({ @@ -11439,6 +11440,7 @@ function prepareOnboardingOnyxData({ isInvitedAccountant, onboardingPurposeSelected, isSelfTourViewed, + betas, }: PrepareOnboardingOnyxDataParams) { if (engagementChoice === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND) { // eslint-disable-next-line no-param-reassign @@ -11453,7 +11455,7 @@ function prepareOnboardingOnyxData({ // Only the MANAGE_TEAM onboarding action uses the #admins room (with a guide); TRACK_WORKSPACE uses Concierge. Excludes emails that have a '+'. const shouldPostTasksInAdminsRoom = isPostingTasksInAdminsRoom(engagementChoice); // When posting to admins room and the user is in the suggestedFollowups beta, we skip tasks in favor of backend-generated followups. - const shouldUseFollowupsInsteadOfTasks = shouldPostTasksInAdminsRoom && Permissions.isBetaEnabled(CONST.BETAS.SUGGESTED_FOLLOWUPS, allBetas, betaConfiguration); + const shouldUseFollowupsInsteadOfTasks = shouldPostTasksInAdminsRoom && Permissions.isBetaEnabled(CONST.BETAS.SUGGESTED_FOLLOWUPS, betas ?? allBetas, betaConfiguration); const adminsChatReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${adminsChatReportID}`]; const targetChatReport = shouldPostTasksInAdminsRoom ? (adminsChatReport ?? {reportID: adminsChatReportID, policyID: onboardingPolicyID}) diff --git a/src/libs/actions/IOU/index.ts b/src/libs/actions/IOU/index.ts index a0bfbacf8126b..ec943b78793f0 100644 --- a/src/libs/actions/IOU/index.ts +++ b/src/libs/actions/IOU/index.ts @@ -6771,6 +6771,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation): {iouRep onboardingMessage: getOnboardingMessages().onboardingMessages[CONST.ONBOARDING_CHOICES.TEST_DRIVE_RECEIVER], companySize: undefined, isSelfTourViewed, + betas, })?.guidedSetupData : undefined; @@ -11932,6 +11933,7 @@ function cancelPayment( function completePaymentOnboarding( paymentSelected: ValueOf, introSelected: OnyxEntry, + betas: OnyxEntry, adminsChatReportID?: string, onboardingPolicyID?: string, ) { @@ -11966,6 +11968,7 @@ function completePaymentOnboarding( shouldSkipTestDriveModal: true, companySize: introSelected?.companySize as OnboardingCompanySize, introSelected, + betas, }); } @@ -11977,7 +11980,7 @@ function payMoneyRequest(params: PayMoneyRequestFunctionParams) { } const paymentSelected = paymentType === CONST.IOU.PAYMENT_TYPE.VBBA ? CONST.IOU.PAYMENT_SELECTED.BBA : CONST.IOU.PAYMENT_SELECTED.PBA; - completePaymentOnboarding(paymentSelected, introSelected); + completePaymentOnboarding(paymentSelected, introSelected, betas); const recipient = {accountID: iouReport?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID}; const {params: payMoneyRequestParams, onyxData} = getPayMoneyRequestParams({ @@ -12052,7 +12055,7 @@ function payInvoice({ }); const paymentSelected = paymentMethodType === CONST.IOU.PAYMENT_TYPE.VBBA ? CONST.IOU.PAYMENT_SELECTED.BBA : CONST.IOU.PAYMENT_SELECTED.PBA; - completePaymentOnboarding(paymentSelected, introSelected); + completePaymentOnboarding(paymentSelected, introSelected, betas); let params: PayInvoiceParams = { reportID: invoiceReport?.reportID, diff --git a/src/libs/actions/Report/index.ts b/src/libs/actions/Report/index.ts index b5828dac4da80..cce9924fafff8 100644 --- a/src/libs/actions/Report/index.ts +++ b/src/libs/actions/Report/index.ts @@ -4749,6 +4749,7 @@ type CompleteOnboardingProps = { onboardingPurposeSelected?: OnboardingPurpose; shouldWaitForRHPVariantInitialization?: boolean; introSelected: OnyxEntry; + betas: OnyxEntry; }; async function completeOnboarding({ @@ -4768,6 +4769,7 @@ async function completeOnboarding({ onboardingPurposeSelected, shouldWaitForRHPVariantInitialization = false, introSelected, + betas, }: CompleteOnboardingProps) { const onboardingData = prepareOnboardingOnyxData({ introSelected, @@ -4781,6 +4783,7 @@ async function completeOnboarding({ selectedInterestedFeatures, isInvitedAccountant, onboardingPurposeSelected, + betas, }); if (!onboardingData) { return; diff --git a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx index d107509240a85..eaa8f9904ebdf 100644 --- a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx +++ b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx @@ -52,6 +52,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin const [onboardingCompanySize] = useOnyx(ONYXKEYS.ONBOARDING_COMPANY_SIZE); const [userReportedIntegration] = useOnyx(ONYXKEYS.ONBOARDING_USER_REPORTED_INTEGRATION); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); + const [betas] = useOnyx(ONYXKEYS.BETAS); const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID); const [isSelfTourViewed] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {selector: hasSeenTourSelector}); @@ -224,6 +225,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin shouldSkipTestDriveModal: !!policyID && !adminsChatReportID, shouldWaitForRHPVariantInitialization: isSidePanelReportSupported, introSelected, + betas, }); // Avoid creating new WS because onboardingPolicyID is cleared before unmounting @@ -273,6 +275,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin introSelected, isSelfTourViewed, conciergeReportID, + betas, ]); // Create items for enabled features diff --git a/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx b/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx index 14e7878ac6410..b4eb3cd1917a2 100644 --- a/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx +++ b/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx @@ -40,6 +40,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat const [onboardingAdminsChatReportID] = useOnyx(ONYXKEYS.ONBOARDING_ADMINS_CHAT_REPORT_ID); const [account] = useOnyx(ONYXKEYS.ACCOUNT); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); + const [betas] = useOnyx(ONYXKEYS.BETAS); const archivedReportsIdSet = useArchivedReportsIdSet(); const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST); const [onboardingValues] = useOnyx(ONYXKEYS.NVP_ONBOARDING); @@ -82,6 +83,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat onboardingPolicyID, shouldSkipTestDriveModal: !!onboardingPolicyID && !mergedAccountConciergeReportID, introSelected, + betas, }); setOnboardingAdminsChatReportID(); @@ -108,6 +110,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat mergedAccountConciergeReportID, conciergeChatReportID, introSelected, + betas, ], ); diff --git a/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx b/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx index 21b2336bc48cc..051033f8ab738 100644 --- a/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx +++ b/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx @@ -67,6 +67,7 @@ function BaseOnboardingPurpose({shouldUseNativeStyles, shouldEnableMaxHeight, ro const [personalDetailsForm] = useOnyx(ONYXKEYS.FORMS.ONBOARDING_PERSONAL_DETAILS_FORM); const [onboardingCompanySize] = useOnyx(ONYXKEYS.ONBOARDING_COMPANY_SIZE); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); + const [betas] = useOnyx(ONYXKEYS.BETAS); const paddingHorizontal = onboardingIsMediumOrLargerScreenWidth ? styles.ph8 : styles.ph5; const [customChoices = getEmptyArray()] = useOnyx(ONYXKEYS.ONBOARDING_CUSTOM_CHOICES); @@ -108,6 +109,7 @@ function BaseOnboardingPurpose({shouldUseNativeStyles, shouldEnableMaxHeight, ro onboardingPolicyID, companySize: onboardingCompanySize, introSelected, + betas, }); return; diff --git a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx index 5fc490a4db68f..bc8dbd3578d21 100644 --- a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx +++ b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx @@ -45,6 +45,7 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo const [onboardingAdminsChatReportID] = useOnyx(ONYXKEYS.ONBOARDING_ADMINS_CHAT_REPORT_ID); const [onboardingPurposeSelected] = useOnyx(ONYXKEYS.ONBOARDING_PURPOSE_SELECTED); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); + const [betas] = useOnyx(ONYXKEYS.BETAS); const policy = usePolicy(onboardingPolicyID); const {onboardingMessages} = useOnboardingMessages(); // We need to use isSmallScreenWidth, see navigateAfterOnboarding function comment @@ -128,6 +129,7 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo isInvitedAccountant, onboardingPurposeSelected, introSelected, + betas, }); setOnboardingAdminsChatReportID(); diff --git a/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx b/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx index 642f13bc25f51..21427c9778fc6 100644 --- a/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx +++ b/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx @@ -43,6 +43,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding const archivedReportsIdSet = useArchivedReportsIdSet(); const {onboardingMessages} = useOnboardingMessages(); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); + const [betas] = useOnyx(ONYXKEYS.BETAS); const {isRestrictedPolicyCreation} = usePreferredPolicy(); // When we merge public email with work email, we now want to navigate to the // concierge chat report of the new work email and not the last accessed report. @@ -90,6 +91,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding onboardingPolicyID, shouldSkipTestDriveModal: (!!onboardingPolicyID && !onboardingAdminsChatReportID) || onboardingPurposeSelected === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND, introSelected, + betas, }); setOnboardingAdminsChatReportID(); @@ -117,6 +119,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding mergedAccountConciergeReportID, introSelected, conciergeChatReportID, + betas, ]); return ( diff --git a/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx b/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx index f8cd2432a750e..968ec8fc4c99b 100644 --- a/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx +++ b/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx @@ -51,6 +51,7 @@ function BaseOnboardingWorkspaces({route, shouldUseNativeStyles}: BaseOnboarding const [loginList] = useOnyx(ONYXKEYS.LOGIN_LIST); const [session] = useOnyx(ONYXKEYS.SESSION); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); + const [betas] = useOnyx(ONYXKEYS.BETAS); const archivedReportsIdSet = useArchivedReportsIdSet(); const isValidated = isCurrentUserValidated(loginList, session?.email); @@ -76,6 +77,7 @@ function BaseOnboardingWorkspaces({route, shouldUseNativeStyles}: BaseOnboarding shouldSkipTestDriveModal: !!(policy.automaticJoiningEnabled ? policy.policyID : undefined), companySize: onboardingCompanySize, introSelected, + betas, }); setOnboardingAdminsChatReportID(); setOnboardingPolicyID(policy.policyID); diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index 454c419b3dfcf..cad9fd5102f0c 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -14716,30 +14716,42 @@ describe('actions/IOU', () => { }); it('should not call completeOnboarding when introSelected is undefined', () => { - completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, undefined); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, undefined, [CONST.BETAS.ALL]); expect(completeOnboardingSpy).not.toHaveBeenCalled(); }); it('should not call completeOnboarding when isInviteOnboardingComplete is true', () => { - completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, { - choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, - inviteType: CONST.ONBOARDING_INVITE_TYPES.IOU, - isInviteOnboardingComplete: true, - }); + completePaymentOnboarding( + CONST.PAYMENT_SELECTED.BBA, + { + choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, + inviteType: CONST.ONBOARDING_INVITE_TYPES.IOU, + isInviteOnboardingComplete: true, + }, + [CONST.BETAS.ALL], + ); expect(completeOnboardingSpy).not.toHaveBeenCalled(); }); it('should not call completeOnboarding when choice is missing', () => { - completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, { - inviteType: CONST.ONBOARDING_INVITE_TYPES.IOU, - }); + completePaymentOnboarding( + CONST.PAYMENT_SELECTED.BBA, + { + inviteType: CONST.ONBOARDING_INVITE_TYPES.IOU, + }, + [CONST.BETAS.ALL], + ); expect(completeOnboardingSpy).not.toHaveBeenCalled(); }); it('should not call completeOnboarding when inviteType is missing', () => { - completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, { - choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, - }); + completePaymentOnboarding( + CONST.PAYMENT_SELECTED.BBA, + { + choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, + }, + [CONST.BETAS.ALL], + ); expect(completeOnboardingSpy).not.toHaveBeenCalled(); }); @@ -14749,7 +14761,7 @@ describe('actions/IOU', () => { inviteType: CONST.ONBOARDING_INVITE_TYPES.IOU, companySize: CONST.ONBOARDING_COMPANY_SIZE.MICRO, }; - completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, introSelected); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, introSelected, [CONST.BETAS.ALL]); expect(completeOnboardingSpy).toHaveBeenCalledWith( expect.objectContaining({ @@ -14769,7 +14781,7 @@ describe('actions/IOU', () => { inviteType: CONST.ONBOARDING_INVITE_TYPES.INVOICE, companySize: CONST.ONBOARDING_COMPANY_SIZE.SMALL, }; - completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA, introSelected); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA, introSelected, [CONST.BETAS.ALL]); expect(completeOnboardingSpy).toHaveBeenCalledWith( expect.objectContaining({ @@ -14788,7 +14800,7 @@ describe('actions/IOU', () => { choice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, inviteType: CONST.ONBOARDING_INVITE_TYPES.INVOICE, }; - completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, introSelected); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.BBA, introSelected, [CONST.BETAS.ALL]); expect(completeOnboardingSpy).toHaveBeenCalledWith( expect.objectContaining({ @@ -14803,7 +14815,7 @@ describe('actions/IOU', () => { choice: CONST.ONBOARDING_CHOICES.SUBMIT, inviteType: CONST.ONBOARDING_INVITE_TYPES.IOU, }; - completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA, introSelected); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA, introSelected, [CONST.BETAS.ALL]); expect(completeOnboardingSpy).toHaveBeenCalledWith( expect.objectContaining({ @@ -14819,7 +14831,7 @@ describe('actions/IOU', () => { inviteType: CONST.ONBOARDING_INVITE_TYPES.CHAT, companySize: CONST.ONBOARDING_COMPANY_SIZE.MEDIUM, }; - completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA, introSelected, 'adminsChatReport123', 'policyID456'); + completePaymentOnboarding(CONST.PAYMENT_SELECTED.PBA, introSelected, [CONST.BETAS.ALL], 'adminsChatReport123', 'policyID456'); expect(completeOnboardingSpy).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/tests/actions/ReportTest.ts b/tests/actions/ReportTest.ts index 3a6edbf75ecde..67e701f6a799c 100644 --- a/tests/actions/ReportTest.ts +++ b/tests/actions/ReportTest.ts @@ -2341,6 +2341,7 @@ describe('actions/Report', () => { companySize: CONST.ONBOARDING_COMPANY_SIZE.MICRO, userReportedIntegration: null, introSelected: {choice: engagementChoice}, + betas: [CONST.BETAS.ALL], }); await waitForBatchedUpdates(); @@ -3521,6 +3522,7 @@ describe('actions/Report', () => { companySize: CONST.ONBOARDING_COMPANY_SIZE.MICRO, userReportedIntegration: null, introSelected: {choice: engagementChoice}, + betas: [CONST.BETAS.ALL], }); await waitForBatchedUpdates();