From 4a2bef173c9cb878b6172f605f57765e477894d2 Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Mon, 18 May 2026 11:27:04 +0200 Subject: [PATCH 1/4] Open room details RHP for admins, navigate to room for non-admins --- src/pages/workspace/rooms/WorkspaceRoomsPage.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx index 47fb2eb1a43..56f9e6024f0 100644 --- a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx +++ b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx @@ -18,6 +18,7 @@ import useWorkspaceDocumentTitle from '@hooks/useWorkspaceDocumentTitle'; import openWorkspaceRoomsPage from '@libs/actions/Policy/Room'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; +import {isPolicyAdmin} from '@libs/PolicyUtils'; import {getReportName} from '@libs/ReportNameUtils'; import {isChatRoom, isPolicyExpenseChat} from '@libs/ReportUtils'; import type {WorkspaceSplitNavigatorParamList} from '@navigation/types'; @@ -118,7 +119,10 @@ function WorkspaceRoomsPage({route}: WorkspaceRoomsPageProps) { renderItem={({item}) => ( Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(item.reportID))} + onPress={() => { + const targetRoute = isPolicyAdmin(policy) ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(item.reportID) : ROUTES.REPORT_WITH_ID.getRoute(item.reportID); + Navigation.navigate(targetRoute); + }} /> )} /> From 544e962313cba2938e275f96093b329704d1145d Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Wed, 20 May 2026 16:25:12 +0200 Subject: [PATCH 2/4] Lift isPolicyAdmin out of renderItem --- src/pages/workspace/rooms/WorkspaceRoomsPage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx index 56f9e6024f0..3c6576798ff 100644 --- a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx +++ b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx @@ -43,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 [rooms] = useOnyx(ONYXKEYS.COLLECTION.REPORT, { @@ -120,7 +121,7 @@ function WorkspaceRoomsPage({route}: WorkspaceRoomsPageProps) { { - const targetRoute = isPolicyAdmin(policy) ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(item.reportID) : ROUTES.REPORT_WITH_ID.getRoute(item.reportID); + const targetRoute = isAdmin ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(item.reportID) : ROUTES.REPORT_WITH_ID.getRoute(item.reportID); Navigation.navigate(targetRoute); }} /> From 2a3d1b91a79a3b3dec1a2b51ae8cc83462dacd37 Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Fri, 29 May 2026 15:56:24 +0200 Subject: [PATCH 3/4] work in progress --- src/CONST/index.ts | 1 + src/languages/de.ts | 1 + src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/languages/fr.ts | 1 + src/languages/it.ts | 1 + src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 1 + src/languages/pt-BR.ts | 1 + src/languages/zh-hans.ts | 1 + src/pages/ReportDetailsPage.tsx | 20 ++++++++++++++++++++ 12 files changed, 31 insertions(+) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index cd52881986c..495ef25dacd 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -4930,6 +4930,7 @@ const CONST = { INFO: 'info', }, REPORT_DETAILS_MENU_ITEM: { + GO_TO_ROOM: 'goToRoom', MEMBERS: 'member', INVITE: 'invite', SETTINGS: 'settings', diff --git a/src/languages/de.ts b/src/languages/de.ts index 8ed005124c4..f5f11267e73 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -2874,6 +2874,7 @@ ${amount} für ${merchant} – ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Zum Raum gehen', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'PDF erstellen', waitForPDF: 'Bitte warten, während wir das PDF erstellen.', diff --git a/src/languages/en.ts b/src/languages/en.ts index bea2eba5c66..fdb0cf3932e 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2942,6 +2942,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 a5383564b84..3efa6af5897 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2750,6 +2750,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/languages/fr.ts b/src/languages/fr.ts index 7e80a229b72..dd422e321a3 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -2882,6 +2882,7 @@ ${amount} pour ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Aller au salon', inWorkspace: (policyName: string) => `dans ${policyName}`, generatingPDF: 'Générer le PDF', waitForPDF: 'Veuillez patienter pendant que nous générons le PDF.', diff --git a/src/languages/it.ts b/src/languages/it.ts index a8249039d10..7d933de47a6 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -2870,6 +2870,7 @@ ${amount} per ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Vai alla stanza', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'Genera PDF', waitForPDF: 'Attendi mentre generiamo il PDF.', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 8b1bebeadae..b778ae76191 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -2843,6 +2843,7 @@ ${date} の ${merchant} への ${amount}`, }, }, reportDetailsPage: { + goToRoom: 'ルームに移動', inWorkspace: (policyName: string) => `${policyName} 内`, generatingPDF: 'PDFを生成', waitForPDF: 'PDF を作成しています。しばらくお待ちください。', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 1dba9df9a59..76e99cdb1d0 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -2867,6 +2867,7 @@ ${amount} voor ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Ga naar ruimte', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'PDF genereren', waitForPDF: 'Even geduld terwijl we de pdf genereren.', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 38186bd0778..1e816221158 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -2861,6 +2861,7 @@ ${amount} dla ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Przejdź do pokoju', inWorkspace: (policyName: string) => `w ${policyName}`, generatingPDF: 'Wygeneruj PDF', waitForPDF: 'Poczekaj, aż wygenerujemy plik PDF.', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index b52847067fe..243d146087d 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -2861,6 +2861,7 @@ ${amount} para ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Ir para a sala', inWorkspace: (policyName: string) => `em ${policyName}`, generatingPDF: 'Gerar PDF', waitForPDF: 'Aguarde enquanto geramos o PDF.', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index a2c19a1cfbe..51252190769 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -2786,6 +2786,7 @@ ${amount},商户:${merchant} - 日期:${date}`, }, }, reportDetailsPage: { + goToRoom: '前往聊天室', inWorkspace: (policyName: string) => `在 ${policyName} 中`, generatingPDF: '生成 PDF', waitForPDF: '正在生成 PDF,请稍候。', diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index f3ebb0f0f6c..789c6dab07b 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -178,6 +178,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading 'Camera', 'Trashcan', 'ArrowSplit', + 'ChatBubble', ]); const backTo = route.params.backTo; @@ -379,6 +380,10 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading 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); @@ -409,6 +414,19 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading return items; } + if (shouldShowGoToRoom) { + items.push({ + key: CONST.REPORT_DETAILS_MENU_ITEM.GO_TO_ROOM, + translationKey: 'reportDetailsPage.goToRoom', + icon: expensifyIcons.ChatBubble, + 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 @@ -628,6 +646,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading }, [ isSelfDM, isArchivedRoom, + shouldShowGoToRoom, isGroupChat, isDefaultRoom, isChatThread, @@ -658,6 +677,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading expensifyIcons.Building, expensifyIcons.Exit, expensifyIcons.Bug, + expensifyIcons.ChatBubble, styles.ph2, shouldOpenRoomMembersPage, backTo, From 026eae494c0cb29d3a9059b1f901a97a5ee32811 Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Fri, 29 May 2026 17:40:50 +0200 Subject: [PATCH 4/4] Use Hashtag icon for Go to room and keep only en/es translations Match the icon used by the workspace Rooms tab. Drop the auto-generatable language entries so only en and es are maintained by hand. --- src/languages/de.ts | 1 - src/languages/fr.ts | 1 - src/languages/it.ts | 1 - src/languages/ja.ts | 1 - src/languages/nl.ts | 1 - src/languages/pl.ts | 1 - src/languages/pt-BR.ts | 1 - src/languages/zh-hans.ts | 1 - src/pages/ReportDetailsPage.tsx | 6 +++--- 9 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index f5f11267e73..8ed005124c4 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -2874,7 +2874,6 @@ ${amount} für ${merchant} – ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Zum Raum gehen', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'PDF erstellen', waitForPDF: 'Bitte warten, während wir das PDF erstellen.', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index dd422e321a3..7e80a229b72 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -2882,7 +2882,6 @@ ${amount} pour ${merchant} - ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Aller au salon', inWorkspace: (policyName: string) => `dans ${policyName}`, generatingPDF: 'Générer le PDF', waitForPDF: 'Veuillez patienter pendant que nous générons le PDF.', diff --git a/src/languages/it.ts b/src/languages/it.ts index 7d933de47a6..a8249039d10 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -2870,7 +2870,6 @@ ${amount} per ${merchant} - ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Vai alla stanza', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'Genera PDF', waitForPDF: 'Attendi mentre generiamo il PDF.', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index b778ae76191..8b1bebeadae 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -2843,7 +2843,6 @@ ${date} の ${merchant} への ${amount}`, }, }, reportDetailsPage: { - goToRoom: 'ルームに移動', inWorkspace: (policyName: string) => `${policyName} 内`, generatingPDF: 'PDFを生成', waitForPDF: 'PDF を作成しています。しばらくお待ちください。', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 76e99cdb1d0..1dba9df9a59 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -2867,7 +2867,6 @@ ${amount} voor ${merchant} - ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Ga naar ruimte', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'PDF genereren', waitForPDF: 'Even geduld terwijl we de pdf genereren.', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 1e816221158..38186bd0778 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -2861,7 +2861,6 @@ ${amount} dla ${merchant} - ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Przejdź do pokoju', inWorkspace: (policyName: string) => `w ${policyName}`, generatingPDF: 'Wygeneruj PDF', waitForPDF: 'Poczekaj, aż wygenerujemy plik PDF.', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 243d146087d..b52847067fe 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -2861,7 +2861,6 @@ ${amount} para ${merchant} - ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Ir para a sala', inWorkspace: (policyName: string) => `em ${policyName}`, generatingPDF: 'Gerar PDF', waitForPDF: 'Aguarde enquanto geramos o PDF.', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 51252190769..a2c19a1cfbe 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -2786,7 +2786,6 @@ ${amount},商户:${merchant} - 日期:${date}`, }, }, reportDetailsPage: { - goToRoom: '前往聊天室', inWorkspace: (policyName: string) => `在 ${policyName} 中`, generatingPDF: '生成 PDF', waitForPDF: '正在生成 PDF,请稍候。', diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 789c6dab07b..e477e2dcb64 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -178,7 +178,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading 'Camera', 'Trashcan', 'ArrowSplit', - 'ChatBubble', + 'Hashtag', ]); const backTo = route.params.backTo; @@ -418,7 +418,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading items.push({ key: CONST.REPORT_DETAILS_MENU_ITEM.GO_TO_ROOM, translationKey: 'reportDetailsPage.goToRoom', - icon: expensifyIcons.ChatBubble, + icon: expensifyIcons.Hashtag, isAnonymousAction: false, shouldShowRightIcon: true, action: () => { @@ -677,7 +677,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading expensifyIcons.Building, expensifyIcons.Exit, expensifyIcons.Bug, - expensifyIcons.ChatBubble, + expensifyIcons.Hashtag, styles.ph2, shouldOpenRoomMembersPage, backTo,