Skip to content

Filter hidden rooms from search router after leaving#87796

Open
MelvinBot wants to merge 6 commits intomainfrom
claude-excludeHiddenRoomsFromSearch
Open

Filter hidden rooms from search router after leaving#87796
MelvinBot wants to merge 6 commits intomainfrom
claude-excludeHiddenRoomsFromSearch

Conversation

@MelvinBot
Copy link
Copy Markdown
Contributor

@MelvinBot MelvinBot commented Apr 13, 2026

Explanation of Change

After a workspace member leaves a workspace room, the room was still appearing in the search router and search results. This happened because the excludeHiddenThreads filter in getValidOptions only excluded threads with HIDDEN notification preference — workspace rooms have isThread = false, so the !option.isThread guard short-circuited and the room always passed through.

This PR:

  1. Renames excludeHiddenThreadsexcludeHidden to reflect the broader scope
  2. For threads, keeps the original behavior (filter by resolved notificationPreference)
  3. For non-thread reports (workspace rooms, etc.), checks the current user's explicit participant entry — this correctly identifies rooms the user left (where their entry is set to HIDDEN) without falsely filtering reports where the user simply isn't listed as a participant
  4. Adds an isHiddenForCurrentUser guard in SearchRouter.tsx's contextual search fallback, which could reconstruct a hidden room option directly from Onyx

Fixed Issues

$ #87661
PROPOSAL: #87661 (comment)

Tests

  1. Log in as a workspace member
  2. Create a workspace room
  3. Click on the room header > Leave
  4. Click on the search router
  5. Search for the room you just left
  6. Verify the room is not shown in the search router or search results
  • Verify that no errors appear in the JS console

Offline tests

Same as tests

QA Steps

  1. Log in as a workspace member
  2. Create a workspace room
  3. Click on the room header > Leave
  4. Click on the search router
  5. Search for the room you just left
  6. Verify the room is not shown in the search router or search results
  • 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
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

MelvinBot and others added 2 commits April 13, 2026 20:28
Workspace rooms left by the user were still appearing in search because
the excludeHiddenThreads filter only excluded threads with HIDDEN
notification preference, not rooms. Rename to excludeHidden and remove
the isThread guard so all hidden reports are filtered. Also add an
isHiddenForCurrentUser check in the SearchRouter contextual fallback.

Co-authored-by: Shridhar Goel <ShridharGoel@users.noreply.github.com>
For non-thread reports, check the current user's participant entry
directly rather than using the resolved notificationPreference,
which defaults to HIDDEN when the user isn't a participant at all.
This avoids incorrectly filtering reports the user can see but
isn't listed as a participant of.

Co-authored-by: Shridhar Goel <ShridharGoel@users.noreply.github.com>
@ShridharGoel
Copy link
Copy Markdown
Contributor

@MelvinBot Mark this as ready for review

@MelvinBot
Copy link
Copy Markdown
Contributor Author

🤖 I attempted to mark this PR as ready for review but don't have permission to do so. Please mark it as ready manually by clicking Ready for review on the PR page.

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 13, 2026

Codecov Report

✅ Changes either increased or maintained existing code coverage, great job!

Files with missing lines Coverage Δ
...rc/components/Search/SearchRouter/SearchRouter.tsx 44.77% <0.00%> (+0.65%) ⬆️
src/libs/OptionsListUtils/index.ts 82.71% <87.50%> (+0.05%) ⬆️
... and 303 files with indirect coverage changes

@ShridharGoel
Copy link
Copy Markdown
Contributor

@MelvinBot This uses isHiddenForCurrentUser(report), which defaults missing participant data to hidden. If participant data is missing, this can suppress the contextual search suggestion for a valid room when it is not already in recentReports (for example because it fell outside the limited result set). What do you think about using the same current-user participant check used in OptionsListUtils instead?

Also, this removes hidden rooms only after optionsOrderAndGroupBy(..., maxElements, filteringFunction) has already limited the heap. Hidden rooms can still consume the maxResults slots, then get removed here without backfilling with valid matches, so search/autocomplete can return fewer or no visible rooms even when later valid rooms match. What do you think about folding the excludeHidden check into filteringFunction before the heap limit is applied?

…ap limit

1. SearchRouter.tsx: Replace isHiddenForCurrentUser (which defaults missing
   participant data to hidden) with explicit participant notificationPreference
   check, matching the logic in OptionsListUtils.

2. OptionsListUtils: Move excludeHidden check into filteringFunction so hidden
   rooms are filtered before the heap limit, preventing them from consuming
   maxResults slots.

Co-authored-by: Shridhar Goel <ShridharGoel@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Both points are valid — fixed in b302207:

  1. isHiddenForCurrentUser → explicit participant check: Replaced isHiddenForCurrentUser(report) in SearchRouter.tsx with report.participants?.[currentUserAccountID]?.notificationPreference === HIDDEN. This matches OptionsListUtils and avoids suppressing rooms where participant data is simply missing (since isHiddenForCurrentUser defaults missing data to hidden via getReportNotificationPreference's || fallback).

  2. Filter before heap limit: Moved the excludeHidden check into filteringFunction (which runs inside optionsOrderAndGroupBy before heap insertion) and removed the post-hoc filter. Hidden rooms no longer consume maxResults slots.

@ShridharGoel
Copy link
Copy Markdown
Contributor

@codex review

@ShridharGoel
Copy link
Copy Markdown
Contributor

@MelvinBot Now it is not working for cross-platform updates. For example, if I create and then leave a room on Android, it still shows in the search results on web (though it doesn't show on Android).

@chatgpt-codex-connector
Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

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

…entUser

Use isHiddenForCurrentUser which correctly defaults to HIDDEN for missing
or null participant entries, handling the case where the server removes
the participant rather than explicitly setting notificationPreference.

Co-authored-by: Shridhar Goel <ShridharGoel@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Pushed a fix in 249e98b. Two changes:

  1. SearchRouter.tsx — replaced the direct participant check with isHiddenForCurrentUser(report), which defaults to HIDDEN when the participant entry is missing entirely (covers the case where the server removes the participant rather than setting notificationPreference = HIDDEN)
  2. OptionsListUtils — replaced strict === HIDDEN with isHiddenForCurrentUser(participant.notificationPreference), which also treats null/empty/falsy preferences as hidden

Important caveat: These changes improve robustness when the participant entry is removed or nullified by the server push. However, if the server doesn't push any participant update at all to the web client after LeaveRoom, the web's Onyx store retains the stale data and no client-side check can detect the leave. In that case, a page refresh (triggering ReconnectApp) should sync the data. If the room persists even after a hard refresh on web, the issue is server-side (the Pusher payload for LeaveRoom may not include the participant update for other clients).

Could you verify whether the room disappears on web after a hard refresh? That would help narrow down whether it's a real-time sync gap or a deeper data issue.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

The only failing check is PR Author Checklist, which is expected — it fails until the checklist items in the PR description are manually completed.

All other checks from the previous run passed (TypeScript, Jest Unit Tests, ESLint, Prettier, perf tests, etc.), and the current run is still in progress. No code fix is needed.

@ShridharGoel
Copy link
Copy Markdown
Contributor

@codex review

@ShridharGoel
Copy link
Copy Markdown
Contributor

@MelvinBot Mark this as ready for review

@ShridharGoel
Copy link
Copy Markdown
Contributor

@MelvinBot Mark as ready for review

@MelvinBot MelvinBot marked this pull request as ready for review April 13, 2026 22:11
@MelvinBot MelvinBot requested a review from a team as a code owner April 13, 2026 22:11
@MelvinBot
Copy link
Copy Markdown
Contributor Author

🤖 Done! This PR has been marked as ready for review.

@melvin-bot melvin-bot Bot requested review from JmillsExpensify and ShridharGoel and removed request for a team and JmillsExpensify April 13, 2026 22:11
@melvin-bot
Copy link
Copy Markdown

melvin-bot Bot commented Apr 13, 2026

@ShridharGoel 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 removed the request for review from a team April 13, 2026 22:11
@ShridharGoel
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
  • 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 Screenshot 2026-04-14 at 2 09 02 AM
Android: mWeb Chrome Screenshot 2026-04-14 at 2 09 46 AM
iOS: HybridApp
Screen.Recording.2026-04-14.at.1.58.08.AM.mov
iOS: mWeb Safari Screenshot 2026-04-14 at 1 59 39 AM
MacOS: Chrome / Safari
Screen.Recording.2026-04-14.at.1.55.40.AM.mov

@melvin-bot
Copy link
Copy Markdown

melvin-bot Bot commented Apr 13, 2026

We did not find an internal engineer to review this PR, trying to assign a random engineer to #87661 as well as to this PR... Please reach out for help on Slack if no one gets assigned!

@melvin-bot melvin-bot Bot requested a review from cead22 April 13, 2026 22:12
Copy link
Copy Markdown

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

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: 249e98ba01

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

if (!reportForContextualSearch) {
const report = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${contextualReportID}`];
if (!report) {
if (!report || isHiddenForCurrentUser(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 Skip hidden check when participant data is absent

isHiddenForCurrentUser(report) treats reports with no current-user participant as hidden because getReportNotificationPreference() defaults to HIDDEN when participant data is missing. Room reports can legitimately arrive without participants (see the chat-room comment in ReportUtils), so this guard can hide the contextual “Search in …” suggestion for rooms the user can still access whenever the fallback path reads such a report from Onyx.

Useful? React with 👍 / 👎.

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.

@MelvinBot What do you think about the above comment?

Copy link
Copy Markdown
Contributor Author

@MelvinBot MelvinBot Apr 14, 2026

Choose a reason for hiding this comment

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

The concern is technically valid but practically low-risk in this specific code path.

isHiddenForCurrentUser does default to hidden when participant data is missing (ReportUtils.ts:1905 — the comment even says "This should ALWAYS default to hidden. Do not change this!"). So in theory, a room report in Onyx without participant data would be treated as hidden.

However, contextualReportID is the report the user is currently viewing. If they're actively looking at a room, participant data should already be loaded. A false positive here would require a race condition where the report exists in Onyx but its participants haven't synced yet — which is unlikely for the focused report.

That said, if you want to be defensive, you could add a simple guard:

if (!report || (report.participants?.[currentUserAccountID] && isHiddenForCurrentUser(report))) {

This would only filter when we have an explicit participant entry confirming HIDDEN, avoiding false positives from missing data. Up to you whether the edge case warrants the extra guard.

@cead22
Copy link
Copy Markdown
Contributor

cead22 commented Apr 14, 2026

@ShridharGoel please add tests and remove all the AI noise, and let me know when this is ready for review

@ShridharGoel
Copy link
Copy Markdown
Contributor

@MelvinBot Edit the description to follow this template properly: https://github.com/Expensify/App/blob/main/.github/PULL_REQUEST_TEMPLATE.md

@MelvinBot
Copy link
Copy Markdown
Contributor Author

Updated the PR description to follow the template. Merged the separate "AI Tests" and "Human Tests" sections into a single "### Tests" section as the template requires.

@ShridharGoel
Copy link
Copy Markdown
Contributor

@MelvinBot Copy the QA tests into the "Tests" section and don't include anything else in that section. Also, check all the boxes in the author checklist.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

Done — copied the QA steps into the Tests section (removed the AI/Human test sub-sections) and checked all boxes in the author checklist.

@ShridharGoel
Copy link
Copy Markdown
Contributor

@cead22 can you check now?

Copy link
Copy Markdown
Contributor

@cead22 cead22 left a comment

Choose a reason for hiding this comment

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

@ShridharGoel what do you think about this small simplification?

Comment on lines +2534 to +2545
if (excludeHidden) {
if (report.isThread) {
if (report.notificationPreference === CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN) {
return false;
}
} else {
const participant = report.item?.participants?.[currentUserAccountID];
if (participant && isHiddenForCurrentUser(participant.notificationPreference)) {
return false;
}
}
}
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.

Suggested change
if (excludeHidden) {
if (report.isThread) {
if (report.notificationPreference === CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN) {
return false;
}
} else {
const participant = report.item?.participants?.[currentUserAccountID];
if (participant && isHiddenForCurrentUser(participant.notificationPreference)) {
return false;
}
}
}
if (excludeHidden) {
if (report.isThread && report.notificationPreference === CONST.REPORT.NOTIFICATION_PREFERENCE.HIDDEN) {
return false;
}
if (!report.isThread) {
const participant = report.item?.participants?.[currentUserAccountID];
if (participant && isHiddenForCurrentUser(participant.notificationPreference)) {
return false;
}
}
}

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.

@MelvinBot Implement the above simplification

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done in d80f684 — flattened the nested if/else into two separate guard clauses per cead22's suggestion.

@cead22
Copy link
Copy Markdown
Contributor

cead22 commented Apr 16, 2026

@ShridharGoel conflicts

@ShridharGoel
Copy link
Copy Markdown
Contributor

@MelvinBot fix the conflicts

Resolved conflict in SearchRouter.tsx: kept main's contextualReport
useOnyx hook while preserving PR's isHiddenForCurrentUser check.

Co-authored-by: Shridhar Goel <ShridharGoel@users.noreply.github.com>
@MelvinBot MelvinBot requested a review from a team as a code owner April 16, 2026 23:50
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Resolved merge conflicts with main. The conflict was in SearchRouter.tsx — main refactored the contextual report lookup to use individual useOnyx hooks instead of full collection hooks. I kept main's contextualReport hook while preserving this PR's isHiddenForCurrentUser check.

@melvin-bot melvin-bot Bot requested review from ShridharGoel and removed request for a team April 16, 2026 23:50
@melvin-bot
Copy link
Copy Markdown

melvin-bot Bot commented Apr 16, 2026

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

@MelvinBot
Copy link
Copy Markdown
Contributor Author

⏱️ Ran out of time before I could finish. This usually means the task was too complex or I got stuck exploring. Please try again with a more specific request or post in #melvinbot-ai.

Run details

@cead22
Copy link
Copy Markdown
Contributor

cead22 commented Apr 20, 2026

@ShridharGoel is this ready? Any thoughts on this?

@ShridharGoel
Copy link
Copy Markdown
Contributor

Yes, that looks good. Thanks for pointing it out.

Flatten the nested if/else into two separate guard clauses as
suggested in code review.

Co-authored-by: Shridhar Goel <ShridharGoel@users.noreply.github.com>
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.

3 participants