diff --git a/src/hooks/useAutoCreateTrackWorkspace.ts b/src/hooks/useAutoCreateTrackWorkspace.ts index 4af67c97476d..70cbe3db6428 100644 --- a/src/hooks/useAutoCreateTrackWorkspace.ts +++ b/src/hooks/useAutoCreateTrackWorkspace.ts @@ -95,6 +95,7 @@ function useAutoCreateTrackWorkspace() { isSelfTourViewed, hasActiveAdminPolicies, personalTrackGoal: onboardingPurposeSelected === CONST.ONBOARDING_CHOICES.TRACK_PERSONAL && !!personalTrackGoal ? personalTrackGoal : undefined, + shouldShowTrackAdminRoomInLHN: onboardingPurposeSelected === CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE, }) : {adminsChatReportID: onboardingAdminsChatReportID, policyID: onboardingPolicyID}; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 2c440fcec374..0328632a8089 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -9700,6 +9700,7 @@ function reasonForReportToBeInOptionList({ !isConciergeChatReport(report, conciergeReportID) && !isSystemChatReport && !isSelfDMWithVisiblePreference && + !(getReportMetadata(report.reportID)?.isTrackOnboardingAdminRoom && isAdminRoom(report) && !isReportArchived) && canHideReport ) { return null; diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 8f28be104bd6..628d645da005 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -327,6 +327,12 @@ function shouldDisplayReportInLHN({ const parentReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID}`]; const hasErrorsOtherThanFailedReceipt = hasReportErrorsOtherThanFailedReceipt(report, chatReport, doesReportHaveViolations, transactionViolations, transactions, reportAttributes); const isReportInAccessible = report?.errorFields?.notFound; + const isTrackOnboardingAdminRoom = getReportMetadata(report.reportID)?.isTrackOnboardingAdminRoom && isAdminRoom(report); + + if (isTrackOnboardingAdminRoom && isReportArchived) { + return {shouldDisplay: false}; + } + if (isOneTransactionThread(report, parentReport, parentReportAction, isOffline)) { return {shouldDisplay: false}; } @@ -346,6 +352,8 @@ function shouldDisplayReportInLHN({ isSystemChat || !!report.isPinned || // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + isTrackOnboardingAdminRoom || + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing requiresAttention || (report.isOwnPolicyExpenseChat && !isReportArchived); diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index d4a36d01ea08..cb79f0123852 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -244,6 +244,7 @@ type BuildPolicyDataOptions = { hasActiveAdminPolicies: boolean | undefined; betas?: OnyxEntry; personalTrackGoal?: string; + shouldShowTrackAdminRoomInLHN?: boolean; }; // TODO: Remove this type once we complete refactoring the buildPolicyData function to use isSelfTourViewed. Refactor issue: https://github.com/Expensify/App/issues/66424 @@ -2612,6 +2613,7 @@ function buildPolicyData(options: BuildPolicyDataOptions): OnyxData { mockFetch?.resume?.(); }); + it('creates Track onboarding admins rooms unpinned without changing the regular workspace default', async () => { + mockFetch.pause?.(); + await Onyx.set(ONYXKEYS.SESSION, {email: ESH_EMAIL, accountID: ESH_ACCOUNT_ID}); + await waitForBatchedUpdates(); + + const createWorkspaceOptions = { + policyOwnerEmail: ESH_EMAIL, + makeMeAdmin: true, + policyName: WORKSPACE_NAME, + engagementChoice: CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE, + introSelected: {choice: CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE}, + currentUserAccountIDParam: ESH_ACCOUNT_ID, + currentUserEmailParam: ESH_EMAIL, + currency: CONST.CURRENCY.USD, + isSelfTourViewed: false, + hasActiveAdminPolicies: false, + activePolicy: undefined, + }; + + const trackWorkspaceParams = Policy.createWorkspace({ + ...createWorkspaceOptions, + policyID: Policy.generatePolicyID(), + shouldShowTrackAdminRoomInLHN: true, + }); + const regularWorkspaceParams = Policy.createWorkspace({ + ...createWorkspaceOptions, + policyID: Policy.generatePolicyID(), + shouldShowTrackAdminRoomInLHN: false, + }); + await waitForBatchedUpdates(); + + const trackAdminReport = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT}${trackWorkspaceParams.adminsChatReportID}`); + const regularAdminReport = await getOnyxValue(`${ONYXKEYS.COLLECTION.REPORT}${regularWorkspaceParams.adminsChatReportID}`); + + expect(trackAdminReport?.isPinned).toBe(false); + expect(regularAdminReport?.isPinned).toBe(true); + }); + it('creates a new workspace', async () => { (fetch as MockFetch)?.pause?.(); await Onyx.set(ONYXKEYS.SESSION, {email: ESH_EMAIL, accountID: ESH_ACCOUNT_ID}); diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 7402d515eb1f..f123e436f94b 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -6689,6 +6689,52 @@ describe('ReportUtils', () => { ).toBeFalsy(); }); + it('should return true for an active empty Track onboarding admins room when empty chats are excluded', async () => { + const report: Report = { + ...createAdminRoom(1), + isPinned: false, + }; + await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${report.reportID}`, {isTrackOnboardingAdminRoom: true}); + await waitForBatchedUpdates(); + + expect( + shouldReportBeInOptionList({ + report, + chatReport: mockedChatReport, + currentReportId: '', + isInFocusMode: false, + betas: [CONST.BETAS.DEFAULT_ROOMS], + doesReportHaveViolations: false, + excludeEmptyChats: true, + draftComment: '', + isReportArchived: false, + }), + ).toBeTruthy(); + }); + + it('should retain archived Track onboarding admins rooms in report option lists used by search', async () => { + const report: Report = { + ...createAdminRoom(1), + isPinned: false, + }; + await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${report.reportID}`, {isTrackOnboardingAdminRoom: true}); + await waitForBatchedUpdates(); + + expect( + reasonForReportToBeInOptionList({ + report, + chatReport: mockedChatReport, + currentReportId: '', + isInFocusMode: false, + betas: [CONST.BETAS.DEFAULT_ROOMS], + doesReportHaveViolations: false, + excludeEmptyChats: false, + draftComment: '', + isReportArchived: true, + }), + ).toBe(CONST.REPORT_IN_LHN_REASONS.IS_ARCHIVED); + }); + it('should return DEFAULT for an empty concierge chat when excludeEmptyChats is true', async () => { const conciergeReportID = 'concierge-report-123'; const report: Report = { diff --git a/tests/unit/SidebarUtilsTest.ts b/tests/unit/SidebarUtilsTest.ts index f18474089139..f93e053241c1 100644 --- a/tests/unit/SidebarUtilsTest.ts +++ b/tests/unit/SidebarUtilsTest.ts @@ -29,7 +29,7 @@ import {actionR14932 as mockIOUAction} from '../../__mocks__/reportData/actions' import {chatReportR14932, iouReportR14932} from '../../__mocks__/reportData/reports'; import createRandomPolicy from '../utils/collections/policies'; import createRandomReportAction from '../utils/collections/reportActions'; -import {createRandomReport} from '../utils/collections/reports'; +import {createAdminRoom, createRandomReport} from '../utils/collections/reports'; import {createSidebarReportsCollection, createSidebarTestData} from '../utils/collections/sidebarReports'; import createRandomTransaction from '../utils/collections/transaction'; import * as LHNTestUtils from '../utils/LHNTestUtils'; @@ -836,6 +836,67 @@ describe('SidebarUtils', () => { }); describe('shouldDisplayReportInLHN', () => { + const getAdminRoomDisplayResult = async (reportOverrides: Partial, isReportArchived = false, currentReportId?: string, isTrackOnboardingAdminRoom = false) => { + const report: Report = { + ...createAdminRoom(92431), + participants: { + [CURRENT_USER_ACCOUNT_ID]: { + notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN, + }, + }, + isPinned: false, + lastMessageText: '', + ...reportOverrides, + }; + await act(async () => { + await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${report.reportID}`, {isTrackOnboardingAdminRoom}); + }); + + return SidebarUtils.shouldDisplayReportInLHN({ + report, + reports: {[`${ONYXKEYS.COLLECTION.REPORT}${report.reportID}`]: report}, + currentReportId, + isInFocusMode: false, + betas: [], + transactionViolations: {}, + draftComment: undefined, + transactions: {}, + isOffline: false, + isReportArchived, + currentUserLogin: CURRENT_USER_LOGIN, + currentUserAccountID: CURRENT_USER_ACCOUNT_ID, + }); + }; + + it('shows an active hidden and empty Track onboarding admins room without pinning it', async () => { + const result = await getAdminRoomDisplayResult({}, false, undefined, true); + + expect(result).toStrictEqual({shouldDisplay: true}); + }); + + it.each([ + ['unpinned and empty', {isPinned: false}], + ['pinned', {isPinned: true}], + ['non-empty', {lastMessageText: 'Message'}], + ])('hides an archived Track onboarding admins room when it is %s', async (_description, reportOverrides) => { + const result = await getAdminRoomDisplayResult(reportOverrides, true, undefined, true); + + expect(result).toStrictEqual({shouldDisplay: false}); + }); + + it('hides an archived Track onboarding admins room even when it is focused', async () => { + const report = createAdminRoom(92431); + const result = await getAdminRoomDisplayResult({reportID: report.reportID}, true, report.reportID, true); + + expect(result).toStrictEqual({shouldDisplay: false}); + }); + + it('does not change visibility for an unmarked hidden and empty admins room', async () => { + const result = await getAdminRoomDisplayResult({}); + + expect(result).toStrictEqual({shouldDisplay: false}); + }); + it('returns shouldDisplay as true if a one transaction thread expense report has receipt upload error', async () => { const MOCK_REPORT: Report = { reportID: '1',