diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 92081c0f567e..5230e6e5f65a 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -4999,6 +4999,7 @@ const CONST = { INFO: 'info', }, REPORT_DETAILS_MENU_ITEM: { + GO_TO_ROOM: 'goToRoom', MEMBERS: 'member', INVITE: 'invite', SETTINGS: 'settings', diff --git a/src/languages/en.ts b/src/languages/en.ts index 0f9f0cc305b5..ccd4e8c477b9 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2961,6 +2961,7 @@ const translations = { }, }, reportDetailsPage: { + goToRoom: 'Go to room', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'Generate PDF', waitForPDF: 'Please wait while we generate the PDF.', diff --git a/src/languages/es.ts b/src/languages/es.ts index 6468d28c48dd..0726ffe611c5 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2766,6 +2766,7 @@ ${amount} para ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Ir a la sala', inWorkspace: (policyName) => `en ${policyName}`, generatingPDF: 'Generar PDF', waitForPDF: 'Por favor, espera mientras creamos el PDF.', diff --git a/src/pages/DynamicReportDetailsPage.tsx b/src/pages/DynamicReportDetailsPage.tsx index 794758a1b07c..ddbfffd8094a 100644 --- a/src/pages/DynamicReportDetailsPage.tsx +++ b/src/pages/DynamicReportDetailsPage.tsx @@ -179,6 +179,7 @@ function DynamicReportDetailsPage({policy, report, route, reportMetadata, report 'Camera', 'Trashcan', 'ArrowSplit', + 'Hashtag', ]); const navigateBackFromReportDetailsPath = useDynamicBackPath(DYNAMIC_ROUTES.REPORT_DETAILS.path); @@ -380,6 +381,10 @@ function DynamicReportDetailsPage({policy, report, route, reportMetadata, report const shouldShowLeaveButton = canLeaveChat(report, policy, currentUserPersonalDetails?.accountID, !!reportNameValuePairs?.private_isArchived); const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, currentUserPersonalDetails?.email) && !policy?.isJoinRequestPending; + // Only show the "Go to room" row when the Details page was opened from a screen other than the room report itself + // (e.g. the Workspace rooms list), i.e. the room report is not the report currently open in the central pane. + const shouldShowGoToRoom = isChatRoom && Navigation.getTopmostReportId() !== report?.reportID; + const reportForHeader = useMemo(() => getReportForHeader(report), [report]); const shouldParseFullTitle = parentReportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT && !isGroupChat; const rawReportName = getReportNameFromReportNameUtils(reportForHeader, reportAttributes); @@ -410,6 +415,19 @@ function DynamicReportDetailsPage({policy, report, route, reportMetadata, report return items; } + if (shouldShowGoToRoom) { + items.push({ + key: CONST.REPORT_DETAILS_MENU_ITEM.GO_TO_ROOM, + translationKey: 'reportDetailsPage.goToRoom', + icon: expensifyIcons.Hashtag, + isAnonymousAction: false, + shouldShowRightIcon: true, + action: () => { + Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(report?.reportID)); + }, + }); + } + // The Members page is only shown when: // - The report is a thread in a chat report // - The report is not a user created room with participants to show i.e. DM, Group Chat, etc @@ -629,6 +647,7 @@ function DynamicReportDetailsPage({policy, report, route, reportMetadata, report }, [ isSelfDM, isArchivedRoom, + shouldShowGoToRoom, isGroupChat, isDefaultRoom, isChatThread, @@ -659,6 +678,7 @@ function DynamicReportDetailsPage({policy, report, route, reportMetadata, report expensifyIcons.Building, expensifyIcons.Exit, expensifyIcons.Bug, + expensifyIcons.Hashtag, styles.ph2, shouldOpenRoomMembersPage, navigateBackFromReportDetailsPath, diff --git a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx index 45e451170ce6..61f557d203cb 100644 --- a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx +++ b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx @@ -22,6 +22,7 @@ import {openPolicyRoomsPage} from '@libs/actions/Policy/Room'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils'; +import {isPolicyAdmin} from '@libs/PolicyUtils'; import {getReportName} from '@libs/ReportNameUtils'; import {getParticipantsAccountIDsForDisplay} from '@libs/ReportUtils'; import type {WorkspaceSplitNavigatorParamList} from '@navigation/types'; @@ -42,6 +43,7 @@ function WorkspaceRoomsPage({route}: WorkspaceRoomsPageProps) { const illustrations = useMemoizedLazyIllustrations(['Hashtag']); const policyID = route.params.policyID; const policy = usePolicy(policyID); + const isAdmin = isPolicyAdmin(policy); useWorkspaceDocumentTitle(policy?.name, 'workspace.common.rooms'); const reportAttributes = useReportAttributes(); @@ -65,7 +67,10 @@ function WorkspaceRoomsPage({route}: WorkspaceRoomsPageProps) { ownerAvatar: ownerDetails?.avatar, ownerDisplayName: ownerDetails ? getDisplayNameOrDefault(ownerDetails) : '', memberCount: getParticipantsAccountIDsForDisplay(report, true, false, false, undefined, personalDetails).length, - action: () => Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(report.reportID)), + action: () => { + const targetRoute = isAdmin ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID) : ROUTES.REPORT_WITH_ID.getRoute(report.reportID); + Navigation.navigate(targetRoute); + }, }; });