From 1131ab88364909fcf7e6cac51c1979997e6ff750 Mon Sep 17 00:00:00 2001 From: Pedro Guerreiro Date: Thu, 24 Jul 2025 23:51:39 +0100 Subject: [PATCH 1/3] fix(66152): task not auto completed after completing test drive through reports tab --- src/libs/ReportUtils.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index f299c252947b..755a61620971 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -10178,7 +10178,14 @@ function prepareOnboardingOnyxData( const taskReportAction = buildOptimisticTaskCommentReportAction(currentTask.reportID, taskTitle, 0, `task for ${taskTitle}`, targetChatReportID, actorAccountID, index + 3); currentTask.parentReportActionID = taskReportAction.reportAction.reportActionID; - const completedTaskReportAction = task.autoCompleted + let isTaskAutoCompleted: boolean = task.autoCompleted; + + if (task.type === 'viewTour' && onboarding?.selfTourViewed) { + // If the user has already viewed the self tour, we mark the task as auto completed + isTaskAutoCompleted = true; + } + + const completedTaskReportAction = isTaskAutoCompleted ? buildOptimisticTaskReportAction(currentTask.reportID, CONST.REPORT.ACTIONS.TYPE.TASK_COMPLETED, 'marked as complete', actorAccountID, 2) : null; if (task.type === 'createWorkspace') { From e7486a18f0d3c6910de2c3f4419fefd6b8d0265c Mon Sep 17 00:00:00 2001 From: Pedro Guerreiro Date: Tue, 29 Jul 2025 23:33:05 +0100 Subject: [PATCH 2/3] refactor(66152): define enum for onboarding task type --- src/CONST/index.ts | 18 ++++++++++ src/libs/ReportUtils.ts | 16 +++++---- src/libs/actions/Welcome/OnboardingFlow.ts | 38 +++++++++++----------- 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 32d51dce078f..184c753b5736 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -6924,6 +6924,24 @@ const CONST = { }, SIGNIN_ROUTE: '/signin', + + ONBOARDING_TASK_TYPE: { + CREATE_REPORT: 'createReport', + CREATE_WORKSPACE: 'createWorkspace', + VIEW_TOUR: 'viewTour', + SETUP_CATEGORIES: 'setupCategories', + SUBMIT_EXPENSE: 'submitExpense', + TRACK_EXPENSE: 'trackExpense', + ADD_ACCOUNTING_INTEGRATION: 'addAccountingIntegration', + CONNECT_CORPORATE_CARD: 'connectCorporateCard', + INVITE_TEAM: 'inviteTeam', + SETUP_CATEGORIES_AND_TAGS: 'setupCategoriesAndTags', + SETUP_TAGS: 'setupTags', + START_CHAT: 'startChat', + SPLIT_EXPENSE: 'splitExpense', + REVIEW_WORKSPACE_SETTINGS: 'reviewWorkspaceSettings', + INVITE_ACCOUNTANT: 'inviteAccountant', + }, } as const; type Country = keyof typeof CONST.ALL_COUNTRIES; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 9b99dfb6e73e..7cf3c18e92e8 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -10165,16 +10165,16 @@ function prepareOnboardingOnyxData( let createWorkspaceTaskReportID; const tasksData = onboardingMessage.tasks .filter((task) => { - if (['setupCategories', 'setupTags'].includes(task.type) && userReportedIntegration) { + if (([CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES, CONST.ONBOARDING_TASK_TYPE.SETUP_TAGS] as string[]).includes(task.type) && userReportedIntegration) { return false; } - if (['addAccountingIntegration', 'setupCategoriesAndTags'].includes(task.type) && !userReportedIntegration) { + if (([CONST.ONBOARDING_TASK_TYPE.ADD_ACCOUNTING_INTEGRATION, CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES_AND_TAGS] as string[]).includes(task.type) && !userReportedIntegration) { return false; } type SkipViewTourOnboardingChoices = 'newDotSubmit' | 'newDotSplitChat' | 'newDotPersonalSpend' | 'newDotEmployer'; if ( - task.type === 'viewTour' && + task.type === CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR && [ CONST.ONBOARDING_CHOICES.EMPLOYER, CONST.ONBOARDING_CHOICES.PERSONAL_SPEND, @@ -10189,7 +10189,11 @@ function prepareOnboardingOnyxData( // Exclude createWorkspace and viewTour tasks from #admin room, for test drive receivers, // since these users already have them in concierge - if (introSelected?.choice === CONST.ONBOARDING_CHOICES.TEST_DRIVE_RECEIVER && ['createWorkspace', 'viewTour'].includes(task.type) && shouldPostTasksInAdminsRoom) { + if ( + introSelected?.choice === CONST.ONBOARDING_CHOICES.TEST_DRIVE_RECEIVER && + ([CONST.ONBOARDING_TASK_TYPE.CREATE_WORKSPACE, CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR] as string[]).includes(task.type) && + shouldPostTasksInAdminsRoom + ) { return false; } @@ -10216,7 +10220,7 @@ function prepareOnboardingOnyxData( let isTaskAutoCompleted: boolean = task.autoCompleted; - if (task.type === 'viewTour' && onboarding?.selfTourViewed) { + if (task.type === CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR && onboarding?.selfTourViewed) { // If the user has already viewed the self tour, we mark the task as auto completed isTaskAutoCompleted = true; } @@ -10224,7 +10228,7 @@ function prepareOnboardingOnyxData( const completedTaskReportAction = isTaskAutoCompleted ? buildOptimisticTaskReportAction(currentTask.reportID, CONST.REPORT.ACTIONS.TYPE.TASK_COMPLETED, 'marked as complete', actorAccountID, 2) : null; - if (task.type === 'createWorkspace') { + if (task.type === CONST.ONBOARDING_TASK_TYPE.CREATE_WORKSPACE) { createWorkspaceTaskReportID = currentTask.reportID; } diff --git a/src/libs/actions/Welcome/OnboardingFlow.ts b/src/libs/actions/Welcome/OnboardingFlow.ts index 08b028072f01..4276bd678411 100644 --- a/src/libs/actions/Welcome/OnboardingFlow.ts +++ b/src/libs/actions/Welcome/OnboardingFlow.ts @@ -53,7 +53,7 @@ type OnboardingTaskLinks = Partial<{ }>; type OnboardingTask = { - type: string; + type: ValueOf; autoCompleted: boolean; mediaAttributes: Record; title: string | ((params: OnboardingTaskLinks) => string); @@ -167,28 +167,28 @@ const getOnboardingMessages = (locale?: Locale) => { }, }; const createReportTask: OnboardingTask = { - type: 'createReport', + type: CONST.ONBOARDING_TASK_TYPE.CREATE_REPORT, autoCompleted: false, mediaAttributes: {}, title: translate(resolvedLocale, 'onboarding.tasks.createReportTask.title'), description: translate(resolvedLocale, 'onboarding.tasks.createReportTask.description'), }; const testDriveAdminTask: OnboardingTask = { - type: 'viewTour', + type: CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR, autoCompleted: false, mediaAttributes: {}, title: ({testDriveURL}) => translate(resolvedLocale, 'onboarding.tasks.testDriveAdminTask.title', {testDriveURL}), description: ({testDriveURL}) => translate(resolvedLocale, 'onboarding.tasks.testDriveAdminTask.description', {testDriveURL}), }; const testDriveEmployeeTask: OnboardingTask = { - type: 'viewTour', + type: CONST.ONBOARDING_TASK_TYPE.VIEW_TOUR, autoCompleted: false, mediaAttributes: {}, title: ({testDriveURL}) => translate(resolvedLocale, 'onboarding.tasks.testDriveEmployeeTask.title', {testDriveURL}), description: ({testDriveURL}) => translate(resolvedLocale, 'onboarding.tasks.testDriveEmployeeTask.description', {testDriveURL}), }; const createTestDriveAdminWorkspaceTask: OnboardingTask = { - type: 'createWorkspace', + type: CONST.ONBOARDING_TASK_TYPE.CREATE_WORKSPACE, autoCompleted: false, mediaAttributes: {}, title: ({workspaceConfirmationLink}) => translate(resolvedLocale, 'onboarding.tasks.createTestDriveAdminWorkspaceTask.title', {workspaceConfirmationLink}), @@ -196,7 +196,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const createWorkspaceTask: OnboardingTask = { - type: 'createWorkspace', + type: CONST.ONBOARDING_TASK_TYPE.CREATE_WORKSPACE, autoCompleted: true, mediaAttributes: {}, title: ({workspaceSettingsLink}) => translate(resolvedLocale, 'onboarding.tasks.createWorkspaceTask.title', {workspaceSettingsLink}), @@ -204,7 +204,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const setupCategoriesTask: OnboardingTask = { - type: 'setupCategories', + type: CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES, autoCompleted: false, mediaAttributes: { [`${CONST.CLOUDFRONT_URL}/videos/walkthrough-categories-v2.mp4`]: `data-expensify-thumbnail-url="${CONST.CLOUDFRONT_URL}/images/walkthrough-categories.png" data-expensify-width="1920" data-expensify-height="1080"`, @@ -214,7 +214,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const combinedTrackSubmitExpenseTask: OnboardingTask = { - type: 'submitExpense', + type: CONST.ONBOARDING_TASK_TYPE.SUBMIT_EXPENSE, autoCompleted: false, mediaAttributes: {}, title: translate(resolvedLocale, 'onboarding.tasks.combinedTrackSubmitExpenseTask.title'), @@ -222,7 +222,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const adminSubmitExpenseTask: OnboardingTask = { - type: 'submitExpense', + type: CONST.ONBOARDING_TASK_TYPE.SUBMIT_EXPENSE, autoCompleted: false, mediaAttributes: {}, title: translate(resolvedLocale, 'onboarding.tasks.adminSubmitExpenseTask.title'), @@ -230,7 +230,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const trackExpenseTask: OnboardingTask = { - type: 'trackExpense', + type: CONST.ONBOARDING_TASK_TYPE.TRACK_EXPENSE, autoCompleted: false, mediaAttributes: {}, title: translate(resolvedLocale, 'onboarding.tasks.trackExpenseTask.title'), @@ -238,7 +238,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const addAccountingIntegrationTask: OnboardingTask = { - type: 'addAccountingIntegration', + type: CONST.ONBOARDING_TASK_TYPE.ADD_ACCOUNTING_INTEGRATION, autoCompleted: false, mediaAttributes: { [`${CONST.CLOUDFRONT_URL}/${CONST.connectionsVideoPaths[CONST.ONBOARDING_ACCOUNTING_MAPPING.netsuite]}`]: `data-expensify-thumbnail-url="${CONST.CLOUDFRONT_URL}/images/walkthrough-connect_to_netsuite.png" data-expensify-width="1920" data-expensify-height="1080"`, @@ -251,7 +251,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const connectCorporateCardTask: OnboardingTask = { - type: 'connectCorporateCard', + type: CONST.ONBOARDING_TASK_TYPE.CONNECT_CORPORATE_CARD, title: ({corporateCardLink}) => translate(resolvedLocale, 'onboarding.tasks.connectCorporateCardTask.title', {corporateCardLink}), description: ({corporateCardLink}) => translate(resolvedLocale, 'onboarding.tasks.connectCorporateCardTask.description', {corporateCardLink}), autoCompleted: false, @@ -259,7 +259,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const inviteTeamTask: OnboardingTask = { - type: 'inviteTeam', + type: CONST.ONBOARDING_TASK_TYPE.INVITE_TEAM, autoCompleted: false, mediaAttributes: { [`${CONST.CLOUDFRONT_URL}/videos/walkthrough-invite_members-v2.mp4`]: `data-expensify-thumbnail-url="${CONST.CLOUDFRONT_URL}/images/walkthrough-invite_members.png" data-expensify-width="1920" data-expensify-height="1080"`, @@ -269,7 +269,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const setupCategoriesAndTags: OnboardingTask = { - type: 'setupCategoriesAndTags', + type: CONST.ONBOARDING_TASK_TYPE.SETUP_CATEGORIES_AND_TAGS, autoCompleted: false, mediaAttributes: {}, title: ({workspaceCategoriesLink, workspaceMoreFeaturesLink}) => @@ -278,7 +278,7 @@ const getOnboardingMessages = (locale?: Locale) => { translate(resolvedLocale, 'onboarding.tasks.setupCategoriesAndTags.description', {workspaceCategoriesLink, workspaceAccountingLink}), }; const setupTagsTask: OnboardingTask = { - type: 'setupTags', + type: CONST.ONBOARDING_TASK_TYPE.SETUP_TAGS, autoCompleted: false, title: ({workspaceMoreFeaturesLink}) => translate(resolvedLocale, 'onboarding.tasks.setupTagsTask.title', {workspaceMoreFeaturesLink}), description: ({workspaceMoreFeaturesLink}) => translate(resolvedLocale, 'onboarding.tasks.setupTagsTask.description', {workspaceMoreFeaturesLink}), @@ -288,7 +288,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const startChatTask: OnboardingTask = { - type: 'startChat', + type: CONST.ONBOARDING_TASK_TYPE.START_CHAT, autoCompleted: false, mediaAttributes: {}, title: translate(resolvedLocale, 'onboarding.tasks.startChatTask.title'), @@ -296,7 +296,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const splitExpenseTask: OnboardingTask = { - type: 'splitExpense', + type: CONST.ONBOARDING_TASK_TYPE.SPLIT_EXPENSE, autoCompleted: false, mediaAttributes: {}, title: translate(resolvedLocale, 'onboarding.tasks.splitExpenseTask.title'), @@ -304,7 +304,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const reviewWorkspaceSettingsTask: OnboardingTask = { - type: 'reviewWorkspaceSettings', + type: CONST.ONBOARDING_TASK_TYPE.REVIEW_WORKSPACE_SETTINGS, autoCompleted: false, mediaAttributes: {}, title: ({workspaceSettingsLink}) => translate(resolvedLocale, 'onboarding.tasks.reviewWorkspaceSettingsTask.title', {workspaceSettingsLink}), @@ -312,7 +312,7 @@ const getOnboardingMessages = (locale?: Locale) => { }; const inviteAccountantTask: OnboardingTask = { - type: 'inviteAccountant', + type: CONST.ONBOARDING_TASK_TYPE.INVITE_ACCOUNTANT, autoCompleted: false, mediaAttributes: {}, title: ({workspaceMembersLink}) => translate(resolvedLocale, 'onboarding.tasks.inviteAccountantTask.title', {workspaceMembersLink}), From 44512738e1fa5f39036dd94d8a540f58d0b0000b Mon Sep 17 00:00:00 2001 From: Pedro Guerreiro Date: Wed, 30 Jul 2025 00:06:06 +0100 Subject: [PATCH 3/3] chore(66152): resolve eslint issues --- tests/unit/ReportUtilsTest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 4f1ac94ef81e..b73980148df4 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -385,7 +385,7 @@ describe('ReportUtils', () => { message: 'This is a test', tasks: [ { - type: 'test', + type: CONST.ONBOARDING_TASK_TYPE.CREATE_REPORT, title, description: () => '', autoCompleted: false, @@ -414,7 +414,7 @@ describe('ReportUtils', () => { message: 'This is a test', tasks: [ { - type: 'test', + type: CONST.ONBOARDING_TASK_TYPE.CREATE_REPORT, title: () => '', description, autoCompleted: false,