Conversation
…-nowakowski/feature/workspace-rooms-row-click # Conflicts: # src/pages/workspace/rooms/WorkspaceRoomsPage.tsx
Match the icon used by the workspace Rooms tab. Drop the auto-generatable language entries so only en and es are maintained by hand.
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
a1b14b8 to
942cdef
Compare
Codecov Report❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.
|
f6f764f to
568502a
Compare
|
@grgia , can we run automatic translations here? |
|
@dukenv0307 Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
reviewing... |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 568502a8dd
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| memberCount: getParticipantsAccountIDsForDisplay(report, true, false, false, undefined, personalDetails).length, | ||
| action: () => Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(report.reportID)), | ||
| action: () => { | ||
| const targetRoute = isAdmin ? createDynamicRoute(DYNAMIC_ROUTES.REPORT_DETAILS.getRoute(report.reportID)) : ROUTES.REPORT_WITH_ID.getRoute(report.reportID); |
There was a problem hiding this comment.
Avoid deriving the details route from the active RHP
When an admin has one room details panel open on the workspace Rooms page and selects another visible room row without closing it, createDynamicRoute() defaults to Navigation.getActiveRoute(), which is already the dynamic details URL containing ?reportID=<old>. The new suffix from DYNAMIC_ROUTES.REPORT_DETAILS.getRoute(report.reportID) also contains reportID, so the dynamic-route helper throws on the duplicate query key instead of opening the second room. Build this from the stable rooms base route (or close/replace the current RHP) rather than the current active route.
Useful? React with 👍 / 👎.
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppScreen.Recording.2026-06-01.at.16.45.41.movAndroid: mWeb ChromeScreen.Recording.2026-06-01.at.16.40.08.moviOS: HybridAppScreen.Recording.2026-06-01.at.16.42.36.moviOS: mWeb SafariScreen.Recording.2026-06-01.at.16.39.18.movMacOS: Chrome / SafariScreen.Recording.2026-06-01.at.16.35.03.mov |
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index 8bda4e40269..37eba434f04 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -2892,6 +2892,7 @@ ${amount} für ${merchant} – ${date}`,
waitForPDF: 'Bitte warten, während wir das PDF erstellen.',
errorPDF: 'Beim Versuch, Ihre PDF zu erstellen, ist ein Fehler aufgetreten',
successPDF: 'Dein PDF wurde erstellt! Falls es nicht automatisch heruntergeladen wurde, verwende die Schaltfläche unten.',
+ goToRoom: 'Zum Raum gehen',
},
reportDescriptionPage: {
roomDescription: 'Zimmerbeschreibung',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index df8a728dc2a..55a81f91908 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -2900,6 +2900,7 @@ ${amount} pour ${merchant} - ${date}`,
waitForPDF: 'Veuillez patienter pendant que nous générons le PDF.',
errorPDF: 'Une erreur s’est produite lors de la tentative de génération de votre PDF',
successPDF: 'Votre PDF a été généré ! S’il ne s’est pas téléchargé automatiquement, utilisez le bouton ci-dessous.',
+ goToRoom: 'Aller à la salle',
},
reportDescriptionPage: {
roomDescription: 'Description de la salle',
@@ -2976,7 +2977,7 @@ ${amount} pour ${merchant} - ${date}`,
phoneOrEmail: 'Téléphone ou e-mail',
error: {
agentSignInBlocked:
- 'Les comptes d\u2019agent ne permettent pas de se connecter directement. Pour utiliser un agent, connectez-vous avec votre propre compte et accédez-y via Copilot.',
+ 'Les comptes d’agent ne permettent pas de se connecter directement. Pour utiliser un agent, connectez-vous avec votre propre compte et accédez-y via Copilot.',
invalidFormatEmailLogin: 'L’adresse e-mail saisie est invalide. Veuillez corriger le format et réessayer.',
},
cannotGetAccountDetails: 'Impossible de récupérer les détails du compte. Veuillez essayer de vous reconnecter.',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 873bd2941bc..cb0fbf816ea 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -2888,6 +2888,7 @@ ${amount} per ${merchant} - ${date}`,
waitForPDF: 'Attendi mentre generiamo il PDF.',
errorPDF: 'Si è verificato un errore durante il tentativo di generare il tuo PDF',
successPDF: 'Il tuo PDF è stato generato! Se non è stato scaricato automaticamente, usa il pulsante qui sotto.',
+ goToRoom: 'Vai alla stanza',
},
reportDescriptionPage: {
roomDescription: 'Descrizione stanza',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index f3200b39434..9369948e517 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -2864,6 +2864,7 @@ ${date} の ${merchant} への ${amount}`,
waitForPDF: 'PDF を作成しています。しばらくお待ちください。',
errorPDF: 'PDF の生成中にエラーが発生しました',
successPDF: 'PDFが作成されました!自動的にダウンロードされない場合は、下のボタンを使用してください。',
+ goToRoom: 'ルームに移動',
},
reportDescriptionPage: {
roomDescription: '部屋の説明',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 92edd92d3d6..80a4aa5336c 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -2885,6 +2885,7 @@ ${amount} voor ${merchant} - ${date}`,
waitForPDF: 'Even geduld terwijl we de pdf genereren.',
errorPDF: 'Er is een fout opgetreden bij het genereren van je PDF',
successPDF: 'Je PDF is gegenereerd! Als het niet automatisch is gedownload, gebruik dan de knop hieronder.',
+ goToRoom: 'Ga naar kamer',
},
reportDescriptionPage: {
roomDescription: 'Kamerbeschrijving',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 42b105e62d4..ff8291fc149 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -2879,6 +2879,7 @@ ${amount} dla ${merchant} - ${date}`,
waitForPDF: 'Poczekaj, aż wygenerujemy plik PDF.',
errorPDF: 'Wystąpił błąd podczas próby wygenerowania Twojego pliku PDF',
successPDF: 'Twój plik PDF został wygenerowany! Jeśli nie pobrał się automatycznie, użyj przycisku poniżej.',
+ goToRoom: 'Przejdź do pokoju',
},
reportDescriptionPage: {
roomDescription: 'Opis pokoju',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index ab3f8e49e2d..fb07eb58818 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -2879,6 +2879,7 @@ ${amount} para ${merchant} - ${date}`,
waitForPDF: 'Aguarde enquanto geramos o PDF.',
errorPDF: 'Ocorreu um erro ao tentar gerar seu PDF',
successPDF: 'Seu PDF foi gerado! Se ele não foi baixado automaticamente, use o botão abaixo.',
+ goToRoom: 'Ir para a sala',
},
reportDescriptionPage: {
roomDescription: 'Descrição do quarto',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index b28aeef66f6..1f0599d5386 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -2807,6 +2807,7 @@ ${amount},商户:${merchant} - 日期:${date}`,
waitForPDF: '正在生成 PDF,请稍候。',
errorPDF: '尝试生成您的 PDF 时出错',
successPDF: '您的 PDF 已生成!如果没有自动下载,请使用下面的按钮。',
+ goToRoom: '进入房间',
},
reportDescriptionPage: {
roomDescription: '房间描述',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
@sumo-slonik would you push translations/merge main |
|
Thanks @sumo-slonik I'm afk for the next hour or so but will retest once im at the airport! |
thanks! |
|
🚧 @grgia has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
|
@sumo-slonik conflicts 🙇 |
…click # Conflicts: # src/components/Tables/WorkspaceRoomsTable/index.tsx
|
@grgia it seems to me we’re ready to merge. I resolved the conflicts |
|
🚧 @grgia has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/grgia in version: 9.4.5-0 🚀
Bundle Size Analysis (Sentry): |
|
🤖 Help site review: no changes required. What this PR does: On the Workspace Rooms page (gated behind the Why no docs update is needed:
If/when this feature graduates out of beta, the Workspace Rooms list page may be worth documenting at that point. @sumo-slonik, no help site PR was created since no documentation changes are required for this beta-gated change. If you believe the Workspace Rooms page should be documented now, let me know and I'll draft a PR. |
|
Deploy Blocker #93248 was identified to be related to this PR. |
|
Deploy Blocker #93257 was identified to be related to this PR. |
Resolved. |
|
🚀 Deployed to production by https://github.com/Julesssss in version: 9.4.5-6 🚀
|
| // 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). | ||
| const isRoomCurrentlyOpen = isReportTopmostSplitNavigator() && Navigation.getTopmostReportId() === report?.reportID; | ||
| const shouldShowGoToRoom = (isChatRoom || isPolicyExpenseChat) && !isRoomCurrentlyOpen; | ||
| const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, currentUserPersonalDetails?.email) && !policy?.isJoinRequestPending && !shouldShowGoToRoom; |
There was a problem hiding this comment.
Coming from #93257
isRoomCurrentlyOpen reads live navigation state during render. When "Go to room" is tapped, getTopmostReportId() updates before the RHP closes, so the row flips to "Go to workspace" briefly.
Fixed in #93296 by snapshotting this on focus instead of reading it reactively during the transition.
Explanation of Change
On the
WorkspaceRoomsPage, tapping a room row now branches by the user's workspace role:Still gated by the
workspaceRoomsPagebeta.Fixed Issues
$ #89721
$ #89902
PROPOSAL:
Tests
workspaceRoomsPagebeta.Offline tests
Unnecessary
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
MacOS: Chrome / Safari
Screen.Recording.2026-06-01.at.10.46.32.mov