Skip to content

Fix workspace name not updating in real time in Recent Chats#86298

Merged
flodnv merged 13 commits into
Expensify:mainfrom
marufsharifi:fix/workspace-name-realtime-update-in-recent-chats
Apr 2, 2026
Merged

Fix workspace name not updating in real time in Recent Chats#86298
flodnv merged 13 commits into
Expensify:mainfrom
marufsharifi:fix/workspace-name-realtime-update-in-recent-chats

Conversation

@marufsharifi

@marufsharifi marufsharifi commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

Explanation of Change

Search > Recent Chats now updates those workspace room names as soon as the workspace name changes, so users see the new name immediately without needing to reload or wait for another update.

Fixed Issues

$ #79884
PROPOSAL: #79884 (comment)

Tests

  1. Create a new account and a new workspace
  2. Add members to the workspace
  3. Change the workspace name
  4. Go to the search icon and look for the #announce room name
  5. Go back to the workspace and change the workspace name (2nd time)
  6. Go to the Search Icon and check the #announce room name in recent chats
  7. Verify that the Announce room name changes in real-time when changed in recent chats
  • Verify that no errors appear in the JS console

Offline tests

Same as Tests.

QA Steps

Same as Tests.

// TODO: These must be filled out, or the issue title must include "[No QA]."

  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
      • If any non-english text was added/modified, I used JaimeGPT to get English > Spanish translation. I then posted it in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Screen.Recording.2026-03-25.at.9.47.04.AM.mov
Android: mWeb Chrome
Screen.Recording.2026-03-25.at.9.50.34.AM.mov
iOS: Native
Screen.Recording.2026-03-25.at.9.56.59.AM.mov
iOS: mWeb Safari
Screen.Recording.2026-03-25.at.9.53.50.AM.mov
MacOS: Chrome / Safari
MacOS.web.mp4

@marufsharifi marufsharifi marked this pull request as ready for review March 25, 2026 05:52
@marufsharifi marufsharifi requested review from a team as code owners March 25, 2026 05:52
@melvin-bot melvin-bot Bot requested a review from situchan March 25, 2026 05:52
@melvin-bot

melvin-bot Bot commented Mar 25, 2026

Copy link
Copy Markdown

@situchan 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]

@melvin-bot melvin-bot Bot requested review from JmillsExpensify and removed request for a team March 25, 2026 05:52
Comment thread src/components/OptionListContextProvider.tsx
@codecov

codecov Bot commented Mar 25, 2026

Copy link
Copy Markdown

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.

Files with missing lines Coverage Δ
src/libs/OptionsListUtils/index.ts 83.09% <60.00%> (-0.05%) ⬇️
src/components/OptionListContextProvider.tsx 88.70% <88.37%> (+0.58%) ⬆️
... and 28 files with indirect coverage changes

@marufsharifi

Copy link
Copy Markdown
Contributor Author

@situchan, I've addressed the AI feedback, pr is ready for your review. Please take a look when you get a chance. thanks.

@MelvinBot

Copy link
Copy Markdown
Contributor

Code Review

Overall: The approach is sound — subscribe to policy changes via sourceValue, detect name changes by comparing previous vs current, and reprocess affected report options. The refactoring into buildUpdatedReportsMap and getReprocessedReportOption reduces duplication. All CI checks pass.

Observations

1. getReprocessedReportOption missing from existing effect dependency arrays

The two pre-existing effects (report changes ~line 128 and report action changes ~line 157) now call getReprocessedReportOption but don't list it in their dependency arrays:

// Report changes effect deps:
[changedReportsEntries, personalDetails, currentUserAccountID, reports, allPolicies, reportAttributes?.reports, privateIsArchivedMap]

// Report actions effect deps:
[changedReportActions, personalDetails, currentUserAccountID, reports, allPolicies, reportAttributes?.reports, privateIsArchivedMap]

This isn't a correctness bug since the callback's underlying dependencies (allPolicies, personalDetails, etc.) are already listed individually. But react-hooks/exhaustive-deps should flag it. Either add getReprocessedReportOption to the deps arrays (and remove the now-redundant individual deps it covers), or suppress with a comment explaining why.

2. Policy effect fires on reports changes unnecessarily

The new policy effect's dependency array includes reports:

[changedPolicies, reports, allPolicies, prevPolicies, getReprocessedReportOption]

reports is needed inside the setOptions updater to look up report data. However, this means the effect re-runs on every report change even when no policies changed. The early return (changedPolicyIDs.size === 0) prevents unnecessary state updates, so it's not a bug — just worth being aware of. If report changes are frequent, consider whether reports could be accessed via a ref instead to avoid extra effect invocations.

3. useOptionsList initialization optimization — looks correct

Changing from lazy null-check initialization to upfront initialization (useRef(optionsList) and useState(areOptionsInitialized)) eliminates one unnecessary re-render on mount. The removed guard clause is cleanly replaced by the existing shallow comparison logic. The eslint-disable comments are well-justified.

4. Only tracking policy name changes is intentionally scoped

The effect at line ~206 only filters for name changes. This is correct for the stated issue (workspace room names in Recent Chats), but if other policy properties (e.g., avatar, type) ever need to trigger report option refreshes, this would need to be expanded. This is fine as-is — no need to over-engineer for hypothetical cases.

Minor nit

The buildUpdatedReportsMap helper is clean. Consider whether it would be worth making it a useMemo/cached value inside setOptions updaters since it's called on each state update. Currently the cost is low (just building a Map from an array), so this is a very minor point.

Summary

The PR correctly solves the issue of workspace names not updating in real-time in Recent Chats. The code is well-structured with appropriate guard clauses and early returns. Points 1 and 2 above are the only items I'd suggest addressing — point 1 for lint compliance, point 2 as an optional performance consideration.

Comment on lines -326 to -331
if (!prevOptions.current) {
prevOptions.current = optionsList;
setInternalOptions(optionsList);
setAreInternalOptionsInitialized(areOptionsInitialized);
return;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this safe removal?

@situchan

situchan commented Mar 27, 2026

Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
    • MacOS: Desktop
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified there are no new alerts related to the canBeMissing param for useOnyx
  • I verified proper code patterns were followed (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: HybridApp
Android: mWeb Chrome
iOS: HybridApp
iOS: mWeb Safari
MacOS: Chrome / Safari
test1.mov
test2.mov

@situchan

Copy link
Copy Markdown
Contributor

The github checks haven't caught this but I got this warning locally:

Screenshot 2026-03-28 at 1 06 20 AM

@situchan

Copy link
Copy Markdown
Contributor

Bug: alternative message in workspace room is not updated real time.

Screenshot 2026-03-28 at 1 12 10 AM
Screen.Recording.2026-03-28.at.1.10.55.AM.mov

@marufsharifi

Copy link
Copy Markdown
Contributor Author

@situchan I addressed the remaining review comments and the stale workspace-room alternate text issue in Search.

Could you please take another review pass when you have time?

I also recorded a demo of the fix here:

alternate-text-real-time-updates.mp4

@MelvinBot

Copy link
Copy Markdown
Contributor

Code Review (Round 2 — updated commits)

Three new commits since the last review: dependency array fix, stale alternate text fix, and test updates. All CI checks pass.

What was addressed from Round 1

  1. getReprocessedReportOption now in dependency arrays — both existing effects correctly include it. This addresses the lint concern from my first review.
  2. useOptionsList — kept the lazy null-check pattern (rather than the upfront init from the earlier revision) and added eslint-disable comments for react-hooks/set-state-in-effect. The comments are well-written and explain the intent.

New: getUpdatedWorkspaceRoomFallback in SearchAutocompleteList

This is the fix for the stale alternate text bug situchan found. The approach makes sense as a render-time "last-mile" correction: when the cached option has a stale workspace name, the component looks up the current policy name and patches subtitle/alternateText before rendering.

One observation: The guard option.alternateText !== option.subtitle means the fix only applies when alternateText equals the subtitle (i.e., the workspace name is the displayed alternate text). If a room has a last message as its alternateText, the subtitle would remain stale even though the workspace name changed. This seems intentionally scoped — the subtitle is secondary text that won't be visually prominent when a message is showing. Worth confirming this is the desired behavior.

Performance note: Adding policies and privateIsArchivedMap to the sections useMemo dependency array means the sections recompute when any policy or archive status changes. Since policy name changes are infrequent, this is acceptable. Just noting it for awareness.

New test

The test in SearchAutocompleteListTest.tsx creates an option list with an old workspace name, sets the new policy in Onyx, and asserts the rendered output shows the updated name. Good coverage for the exact scenario being fixed. The SearchRouterWrapper refactor to accept custom options is a clean approach.

Overall

The updates address the reviewer feedback well. The code looks ready from my perspective — the dependency array issue is resolved, the stale alternate text bug is fixed with a targeted approach, and there's test coverage for the new behavior.

const keyForList = option.keyForList ?? option.reportID ?? (option.accountID ? String(option.accountID) : undefined);
const isReportArchived = !!privateIsArchivedMap[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${option.reportID}`];
const policyName = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.name;
const updatedWorkspaceRoomFallback = getUpdatedWorkspaceRoomFallback(option, report, policyName, isReportArchived);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like this approach of updating subtitle and alternateText manually.
What was the root cause?
Whenever policy name is changed, options are recalculated. Then why does this bug happen?

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8772439e3b

ℹ️ 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".

}

function getUpdatedWorkspaceRoomFallback(option: AutocompleteListItem, report: OnyxEntry<Report>, policyName: string | undefined, isReportArchived: boolean) {
if (!report || !option.subtitle || option.alternateText !== option.subtitle || (!isDefaultRoom(report) && !isUserCreatedPolicyRoom(report))) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Distinguish message previews from fallback subtitles

The new fallback path treats option.alternateText === option.subtitle as proof that the row is using a workspace-name fallback, but in chat finder alternateText can also be a real last-message preview. If the latest message text happens to equal the subtitle (for example, someone sends a message matching the workspace name), this condition is true and a policy rename will overwrite that valid preview with the workspace name, so Recent Chats shows incorrect secondary text until a new message arrives.

Useful? React with 👍 / 👎.

@JmillsExpensify JmillsExpensify left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@marufsharifi

Copy link
Copy Markdown
Contributor Author

working on it

@marufsharifi

Copy link
Copy Markdown
Contributor Author

@situchan Thanks for the review. I updated the fix based on your feedback, removed the previous approach, and addressed the remaining comments.

Could you please take another look when you have time?

@marufsharifi

Copy link
Copy Markdown
Contributor Author

Conflict solved

@MelvinBot

Copy link
Copy Markdown
Contributor

🤖 Code Review

Overall this is a well-structured change. The approach of watching changedPolicies to reprocess affected report options is sound, and the refactoring (buildUpdatedReportsMap, getReprocessedReportOption) reduces duplication nicely. A few items to consider:


1. shallowOptionsListCompare — potentially incomplete field coverage

The PR adds alternateText, subtitle, and lastMessageText to the report comparison, which correctly covers the workspace rename scenario. However, other mutable fields like private_isArchived are not compared. If archiving/unarchiving a report while viewing Recent Chats should also trigger a UI update, this could be a gap. Worth confirming whether that's handled by a separate path or if it should be added here.

2. Policy effect dependency on reports

The new changedPolicies effect at OptionListContextProvider.tsx:195 includes reports in its dependency array:

}, [changedPolicies, reports, allPolicies, prevPolicies, getReprocessedReportOption]);

This means the effect re-runs whenever any report changes (e.g., new message received), not just when policies change. The guard clause if (!changedPolicies || ...) prevents actual work in those cases, so it's functionally correct — but it's worth noting for performance awareness. If report changes are very frequent, this effect will fire often (though it will bail out early).

3. Test coverage could be broader

The new test covers the core happy path (single report, single policy rename). Consider adding cases for:

  • No-op path: policy changes but name stays the same → verify no state update occurs
  • Multiple reports tied to the same policy → verify all are reprocessed
  • Report with missing policyID → verify it's safely skipped

4. Minor: delete branch in the policy effect

if (reportOption) {
    updatedReportsMap.set(reportID, reportOption);
} else {
    updatedReportsMap.delete(reportID);
}

The else branch deletes a report from the map if processReport returns no option after a policy rename. Is this intentional? In the other two effects (report changes and report actions), there's no corresponding delete — they only set. If processReport can legitimately return undefined after a policy rename (e.g., policy deleted), this is correct. If not, the asymmetry could cause a report to silently disappear from Recent Chats. Worth double-checking whether this branch is reachable and desired.


Everything else looks good — the useCallback extraction is clean with correct dependencies, buildUpdatedReportsMap is a nice DRY improvement, and the test wrapper parameterization in SearchAutocompleteListTest.tsx is a sensible change.

Comment on lines +3377 to +3382
if (
aReport?.reportID !== bReport?.reportID ||
aReport?.text !== bReport?.text ||
aReport?.alternateText !== bReport?.alternateText ||
aReport?.subtitle !== bReport?.subtitle ||
aReport?.lastMessageText !== bReport?.lastMessageText

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok so this is extension of #84391

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Another round soon, please!

ℹ️ 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".

@melvin-bot melvin-bot Bot requested a review from flodnv April 2, 2026 20:25
@flodnv flodnv merged commit 6644ae5 into Expensify:main Apr 2, 2026
33 checks passed
@github-actions

github-actions Bot commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

🚧 @flodnv has triggered a test Expensify/App build. You can view the workflow run here.

@OSBotify

OSBotify commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

@OSBotify

OSBotify commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/flodnv in version: 9.3.53-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 failure ❌
🍎 iOS 🍎 failure ❌

Bundle Size Analysis (Sentry):

@MelvinBot

Copy link
Copy Markdown
Contributor

No help site changes are required for this PR.

This is a purely internal bug fix — it makes workspace name changes reflect immediately in Search > Recent Chats. No new UI, features, settings, or terminology were introduced.

I reviewed all relevant docs under docs/articles/ and confirmed:

  • No article claims users need to refresh or reload after renaming a workspace
  • Existing documentation (e.g., Customize-and-Enforce-Report-Titles.md) already states {report:workspaceName} updates when the workspace name changes — the fix aligns with this
  • Search and workspace articles document operators and navigation but don't describe workspace name display behavior in recent chats

The fix simply makes the app behave as the documentation already describes. No doc updates needed.

@OSBotify

OSBotify commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/flodnv in version: 9.3.53-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 failure ❌
🍎 iOS 🍎 failure ❌

Bundle Size Analysis (Sentry):

@OSBotify

OSBotify commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/roryabraham in version: 9.3.53-7 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants