diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index bf425cbe1dd1..84b090551176 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -11196,18 +11196,33 @@ function canReportBeMentionedWithinPolicy(report: OnyxEntry, policyID: s return isChatRoom(report) && !isInvoiceRoom(report) && !isThread(report); } -function prepareOnboardingOnyxData( - introSelected: OnyxEntry, - engagementChoice: OnboardingPurpose, - onboardingMessage: OnboardingMessage, - adminsChatReportID?: string, - onboardingPolicyID?: string, - userReportedIntegration?: OnboardingAccounting, - wasInvited?: boolean, - companySize?: OnboardingCompanySize, - selectedInterestedFeatures: string[] = [], - isInvitedAccountant?: boolean, -) { +type PrepareOnboardingOnyxDataParams = { + introSelected: OnyxEntry; + engagementChoice: OnboardingPurpose; + onboardingMessage: OnboardingMessage; + adminsChatReportID?: string; + onboardingPolicyID?: string; + userReportedIntegration?: OnboardingAccounting; + wasInvited?: boolean; + companySize?: OnboardingCompanySize; + selectedInterestedFeatures?: string[]; + isInvitedAccountant?: boolean; + onboardingPurposeSelected?: OnboardingPurpose; +}; + +function prepareOnboardingOnyxData({ + introSelected, + engagementChoice, + onboardingMessage, + adminsChatReportID, + onboardingPolicyID, + userReportedIntegration, + wasInvited, + companySize, + selectedInterestedFeatures = [], + isInvitedAccountant, + onboardingPurposeSelected, +}: PrepareOnboardingOnyxDataParams) { if (engagementChoice === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND) { // eslint-disable-next-line no-param-reassign onboardingMessage = getOnboardingMessages().onboardingMessages[CONST.ONBOARDING_CHOICES.PERSONAL_SPEND]; @@ -11697,7 +11712,10 @@ function prepareOnboardingOnyxData( guidedSetupData.push({type: 'message', ...textMessage}); let selfDMParameters: SelfDMParameters = {}; - if (engagementChoice === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND || engagementChoice === CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE) { + if ( + engagementChoice === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND || + (engagementChoice === CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE && (!onboardingPurposeSelected || onboardingPurposeSelected === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND)) + ) { const selfDMReportID = findSelfDMReportID(); let selfDMReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${selfDMReportID}`]; let createdAction: ReportAction; @@ -13085,5 +13103,6 @@ export type { ParsingDetails, MissingPaymentMethod, OptimisticNewReport, + PrepareOnboardingOnyxDataParams, SelfDMParameters, }; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index b9defa497c54..e9ca1a07b90c 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -6149,11 +6149,11 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation): {iouRep default: { // This is only required when inviting admins to test drive the app const guidedSetupData: GuidedSetupData | undefined = isTestDrive - ? prepareOnboardingOnyxData( - {choice: CONST.ONBOARDING_CHOICES.TEST_DRIVE_RECEIVER}, - CONST.ONBOARDING_CHOICES.TEST_DRIVE_RECEIVER, - getOnboardingMessages().onboardingMessages[CONST.ONBOARDING_CHOICES.TEST_DRIVE_RECEIVER], - )?.guidedSetupData + ? prepareOnboardingOnyxData({ + introSelected: {choice: CONST.ONBOARDING_CHOICES.TEST_DRIVE_RECEIVER}, + engagementChoice: CONST.ONBOARDING_CHOICES.TEST_DRIVE_RECEIVER, + onboardingMessage: getOnboardingMessages().onboardingMessages[CONST.ONBOARDING_CHOICES.TEST_DRIVE_RECEIVER], + })?.guidedSetupData : undefined; const parameters: RequestMoneyParams = { diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 60c7e8e0dcd8..d21b6750792b 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -181,6 +181,7 @@ type BuildPolicyDataOptions = { lastUsedPaymentMethod?: LastPaymentMethodType; adminParticipant?: Participant; hasOutstandingChildRequest?: boolean; + onboardingPurposeSelected?: OnboardingPurpose; shouldAddGuideWelcomeMessage?: boolean; }; @@ -2044,6 +2045,7 @@ function buildPolicyData(options: BuildPolicyDataOptions = {}) { adminParticipant, hasOutstandingChildRequest = true, shouldAddGuideWelcomeMessage = true, + onboardingPurposeSelected, } = options; const workspaceName = policyName || generateDefaultWorkspaceName(policyOwnerEmail); @@ -2428,7 +2430,14 @@ function buildPolicyData(options: BuildPolicyDataOptions = {}) { shouldAddOnboardingTasks ) { const {onboardingMessages} = getOnboardingMessages(); - const onboardingData = ReportUtils.prepareOnboardingOnyxData(deprecatedIntroSelected, engagementChoice, onboardingMessages[engagementChoice], adminsChatReportID, policyID); + const onboardingData = ReportUtils.prepareOnboardingOnyxData({ + introSelected: deprecatedIntroSelected, + engagementChoice, + onboardingMessage: onboardingMessages[engagementChoice], + adminsChatReportID, + onboardingPolicyID: policyID, + onboardingPurposeSelected, + }); if (!onboardingData) { return {successData, optimisticData, failureData, params}; } diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 0400befc3cf0..042e0e48d0d6 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -1145,7 +1145,11 @@ function openReport( onboardingMessage.tasks = updatedTasks; } - const onboardingData = prepareOnboardingOnyxData(introSelected, choice, onboardingMessage); + const onboardingData = prepareOnboardingOnyxData({ + introSelected, + engagementChoice: choice, + onboardingMessage, + }); if (onboardingData) { optimisticData.push(...onboardingData.optimisticData, { @@ -4272,6 +4276,7 @@ function completeOnboarding({ selectedInterestedFeatures = [], shouldSkipTestDriveModal, isInvitedAccountant, + onboardingPurposeSelected, }: { engagementChoice: OnboardingPurpose; onboardingMessage: OnboardingMessage; @@ -4286,8 +4291,9 @@ function completeOnboarding({ selectedInterestedFeatures?: string[]; shouldSkipTestDriveModal?: boolean; isInvitedAccountant?: boolean; + onboardingPurposeSelected?: OnboardingPurpose; }) { - const onboardingData = prepareOnboardingOnyxData( + const onboardingData = prepareOnboardingOnyxData({ introSelected, engagementChoice, onboardingMessage, @@ -4298,7 +4304,8 @@ function completeOnboarding({ companySize, selectedInterestedFeatures, isInvitedAccountant, - ); + onboardingPurposeSelected, + }); if (!onboardingData) { return; } diff --git a/src/pages/OnboardingWorkspaceConfirmation/BaseOnboardingWorkspaceConfirmation.tsx b/src/pages/OnboardingWorkspaceConfirmation/BaseOnboardingWorkspaceConfirmation.tsx index 00dfcba4dc60..3659f80047b6 100644 --- a/src/pages/OnboardingWorkspaceConfirmation/BaseOnboardingWorkspaceConfirmation.tsx +++ b/src/pages/OnboardingWorkspaceConfirmation/BaseOnboardingWorkspaceConfirmation.tsx @@ -73,6 +73,7 @@ function BaseOnboardingWorkspaceConfirmation({shouldUseNativeStyles}: BaseOnboar file: undefined, shouldAddOnboardingTasks: false, shouldAddGuideWelcomeMessage: false, + onboardingPurposeSelected, }) : {adminsChatReportID: onboardingAdminsChatReportID, policyID: onboardingPolicyID}; diff --git a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx index c801d9e70301..83380870a218 100644 --- a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx +++ b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx @@ -43,6 +43,7 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo const {translate, formatPhoneNumber} = useLocalize(); const [onboardingPolicyID] = useOnyx(ONYXKEYS.ONBOARDING_POLICY_ID, {canBeMissing: true}); const [onboardingAdminsChatReportID] = useOnyx(ONYXKEYS.ONBOARDING_ADMINS_CHAT_REPORT_ID, {canBeMissing: true}); + const [onboardingPurposeSelected] = useOnyx(ONYXKEYS.ONBOARDING_PURPOSE_SELECTED, {canBeMissing: true}); const policy = usePolicy(onboardingPolicyID); const {onboardingMessages} = useOnboardingMessages(); // We need to use isSmallScreenWidth, see navigateAfterOnboarding function comment @@ -137,6 +138,7 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo onboardingPolicyID, shouldSkipTestDriveModal: !!onboardingPolicyID && !onboardingAdminsChatReportID, isInvitedAccountant, + onboardingPurposeSelected, }); setOnboardingAdminsChatReportID(); @@ -158,6 +160,7 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo currentUserPersonalDetails.lastName, onboardingAdminsChatReportID, onboardingPolicyID, + onboardingPurposeSelected, isSmallScreenWidth, isBetaEnabled, session?.email, diff --git a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx index 0e40247046f8..701f0a976d3c 100644 --- a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx +++ b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx @@ -42,6 +42,7 @@ function IOURequestStepUpgrade({ const personalDetails = usePersonalDetails(); const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {canBeMissing: true}); + const [onboardingPurposeSelected] = useOnyx(ONYXKEYS.ONBOARDING_PURPOSE_SELECTED, {canBeMissing: true}); const [isUpgraded, setIsUpgraded] = useState(false); const [showConfirmationForm, setShowConfirmationForm] = useState(false); @@ -142,10 +143,11 @@ function IOURequestStepUpgrade({ ], adminParticipant, hasOutstandingChildRequest: false, + onboardingPurposeSelected, }); setIsUpgraded(true); policyDataRef.current = policyData; - }, [isCategorizing, isReporting, currentUserPersonalDetails?.localCurrencyCode, isDistanceRateUpgrade, adminParticipant]); + }, [isCategorizing, isReporting, currentUserPersonalDetails?.localCurrencyCode, isDistanceRateUpgrade, adminParticipant, onboardingPurposeSelected]); const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false}); @@ -158,6 +160,7 @@ function IOURequestStepUpgrade({ currency: params.currency, file: params.avatarFile as File, engagementChoice: CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE, + onboardingPurposeSelected, }); policyDataRef.current = policyData; setCreatedPolicyName(params.name); diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 242c25887434..058659f2a653 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -408,10 +408,10 @@ describe('ReportUtils', () => { it('provides test drive url to task title', () => { const title = jest.fn(); - prepareOnboardingOnyxData( - undefined, - CONST.ONBOARDING_CHOICES.MANAGE_TEAM, - { + prepareOnboardingOnyxData({ + introSelected: undefined, + engagementChoice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, + onboardingMessage: { message: 'This is a test', tasks: [ { @@ -423,8 +423,8 @@ describe('ReportUtils', () => { }, ], }, - '1', - ); + adminsChatReportID: '1', + }); expect(title).toHaveBeenCalledWith( expect.objectContaining({ @@ -437,10 +437,10 @@ describe('ReportUtils', () => { it('provides test drive url to task description', () => { const description = jest.fn(); - prepareOnboardingOnyxData( - undefined, - CONST.ONBOARDING_CHOICES.MANAGE_TEAM, - { + prepareOnboardingOnyxData({ + introSelected: undefined, + engagementChoice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, + onboardingMessage: { message: 'This is a test', tasks: [ { @@ -452,8 +452,8 @@ describe('ReportUtils', () => { }, ], }, - '1', - ); + adminsChatReportID: '1', + }); expect(description).toHaveBeenCalledWith( expect.objectContaining({ @@ -464,20 +464,16 @@ describe('ReportUtils', () => { }); it('should not create tasks if the task feature is not in the selected interested features', () => { - const result = prepareOnboardingOnyxData( - undefined, - CONST.ONBOARDING_CHOICES.MANAGE_TEAM, - { + const result = prepareOnboardingOnyxData({ + introSelected: undefined, + engagementChoice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, + onboardingMessage: { message: 'This is a test', tasks: [{type: CONST.ONBOARDING_TASK_TYPE.CONNECT_CORPORATE_CARD, title: () => '', description: () => '', autoCompleted: false, mediaAttributes: {}}], }, - '1', - undefined, - undefined, - undefined, - undefined, - ['categories', 'accounting', 'tags'], - ); + adminsChatReportID: '1', + selectedInterestedFeatures: ['categories', 'accounting', 'tags'], + }); expect(result?.guidedSetupData.filter((data) => data.type === 'task')).toHaveLength(0); }); @@ -485,15 +481,15 @@ describe('ReportUtils', () => { it('includes avatar in optimistic Setup Specialist personal detail', () => { const mergeSpy = jest.spyOn(Onyx, 'merge'); - prepareOnboardingOnyxData( - undefined, - CONST.ONBOARDING_CHOICES.MANAGE_TEAM, - { + prepareOnboardingOnyxData({ + introSelected: undefined, + engagementChoice: CONST.ONBOARDING_CHOICES.MANAGE_TEAM, + onboardingMessage: { message: 'This is a test', tasks: [], }, - '1', - ); + adminsChatReportID: '1', + }); const personalDetailsCall = mergeSpy.mock.calls.find((call) => call[0] === ONYXKEYS.PERSONAL_DETAILS_LIST); const personalDetailsData = personalDetailsCall?.[1] as Record;