Skip to content

fix: focus modal is not displayed when account reaches 30 reports - #73988

Merged
jasperhuangg merged 3 commits into
Expensify:mainfrom
samranahm:73588/focus-modal-not-displaying
Nov 12, 2025
Merged

jasperhuangg merged 3 commits into
Expensify:mainfrom
samranahm:73588/focus-modal-not-displaying

Conversation

@samranahm

Copy link
Copy Markdown
Contributor

Explanation of Change

Fixed Issues

$ #72052
$ #73588
PROPOSAL:

Tests

  1. Complete onboarding choosing Manage team intent (Optional)
  2. Create reports with global create button to get 30 reports
  3. Verify Priority Mode updated to #focus
  4. Verify focus model appear
  5. Click settings url and verify model close and it navigate to priority mode page
  • Verify that no errors appear in the JS console

Offline tests

QA Steps

// 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
    • MacOS: Desktop
  • 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 verified there are no new alerts related to the canBeMissing param for useOnyx
  • 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.native.mp4
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
MacOS: Desktop

@samranahm
samranahm requested a review from a team as a code owner October 31, 2025 21:11
@melvin-bot
melvin-bot Bot requested review from brunovjk and removed request for a team October 31, 2025 21:11
@melvin-bot

melvin-bot Bot commented Oct 31, 2025

Copy link
Copy Markdown

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

@github-actions

Copy link
Copy Markdown
Contributor

LGTM :feelsgood:. Thank you for your hard work!

@codecov

codecov Bot commented Oct 31, 2025

Copy link
Copy Markdown

Codecov Report

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

Files with missing lines Coverage Δ
src/components/PriorityModeController.tsx 66.00% <0.00%> (ø)
... and 93 files with indirect coverage changes

}
const isNarrowLayout = getIsNarrowLayout();
const shouldHideModalOnNavigation = (isNarrowLayout && currentRouteName !== SCREENS.HOME) || (!isNarrowLayout && currentRouteName !== SCREENS.REPORT);
const isNavigatingToPriorityModePage = currentRouteName === SCREENS.SETTINGS.PREFERENCES.PRIORITY_MODE;

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.

Sorry @samranahm, but could you help me understand the proposed changes? I can't reproduce the issue on the web (Chrome), the modal is displayed normally:
Screenshot 2025-10-31 at 22 14 21

Why does this only happen on Android web? Thank you.

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.

@brunovjk Sorry for the delay, let me explain.

We recently added the useEffect to close the focus modal when user press settings and they navigate to another page (on mobile fromHOME screen and on large width devices fromREPORT screen)

Now when we create 30th report from global create button we switch to #focus mode, and shouldShowModal become true and because on mobile we navigate from HOME to REPORT screen when we create a report through global create button the navigation happen and focus modal was closing instantly, because shouldHideModalOnNavigation was true for narrow layout.

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.

Thank you for clarifying, I will continue the review now.

@brunovjk

brunovjk commented Nov 3, 2025

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
73988_android_native.mov
Android: mWeb Chrome
73988_android_web.mov
iOS: HybridApp
73988_ios_native.mov
iOS: mWeb Safari
73988_ios_web.mov
MacOS: Chrome / Safari
73988_web_chrome_small.mov
73988_web_chrome_large.mov
MacOS: Desktop
73988_web_desktop.mov

@brunovjk

brunovjk commented Nov 3, 2025

Copy link
Copy Markdown
Contributor

@samranahm as soon as I open the app, for the first time after build, on the web I get a warning:

Screen.Recording.2025-11-03.at.12.02.34.mov

Not reproducible in main, did you also have this error? Did you test it on all platforms? Thank you.

@brunovjk

brunovjk commented Nov 3, 2025

Copy link
Copy Markdown
Contributor

But the regression is no longer reproducible, I'll continue testing on the other platforms after lunch:

Screen.Recording.2025-11-03.at.12.08.44.mov

@samranahm

Copy link
Copy Markdown
Contributor Author

Looking into it

@samranahm

Copy link
Copy Markdown
Contributor Author

as soon as I open the app, for the first time after build, on the web I get a warning

I just merge main and it did not appear for me, please check again.

@samranahm

Copy link
Copy Markdown
Contributor Author

@brunovjk I can actually still reproduce this after some retakes on android native. I don't think this is regression since it's only about how we navigate to report page after creating the report through global_create. But we should indeed fix it.

focus.mode.notification.mov

@brunovjk

brunovjk commented Nov 3, 2025

Copy link
Copy Markdown
Contributor

Sorry, I got a little confused @samranahm, are you working on a solution? Thank you.

@samranahm

Copy link
Copy Markdown
Contributor Author

Ahh, sorry if anything make you confused, I actually replied to this comment

But the regression is no longer reproducible

that I am still able to reproduce this on main (not in this current branch) so we should fix it. Let's escalate this PR since the fix is ready.

@brunovjk

brunovjk commented Nov 3, 2025

Copy link
Copy Markdown
Contributor

@samranahm, on most platforms work fine, Screenshots. However, on native iOS the app freezes when the modal should appear, It's not very clear in the video, but I'm trying to press any button in the app, and nothing happens:

73988_ios_native_bug.mov

Can you reproduce it? Thank you.

@samranahm

Copy link
Copy Markdown
Contributor Author

@brunovjk This issue coming from main because it persist even if we revert our PR. Let me fix this too.

@samranahm

Copy link
Copy Markdown
Contributor Author

Testing solution on all platforms.

@samranahm
samranahm requested a review from a team as a code owner November 4, 2025 13:56
@melvin-bot
melvin-bot Bot requested review from heyjennahay and removed request for a team November 4, 2025 13:56
@samranahm

Copy link
Copy Markdown
Contributor Author

@brunovjk Please take a look.

@brunovjk

brunovjk commented Nov 4, 2025

Copy link
Copy Markdown
Contributor

Sure

@brunovjk

brunovjk commented Nov 4, 2025

Copy link
Copy Markdown
Contributor

The same bug is occurring on iOS @samranahm:

Screen.Recording.2025-11-04.at.11.57.11.mov

@samranahm

Copy link
Copy Markdown
Contributor Author

@brunovjk It's working absolutely fine for me.

IOS.native.mov

Can you please confirm if you include the latest commit, and restarted the metro bundler.

@brunovjk

brunovjk commented Nov 4, 2025

Copy link
Copy Markdown
Contributor

I did, but I will try it again, thank you.

@brunovjk brunovjk 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 :D Thank you @samranahm

@melvin-bot
melvin-bot Bot requested a review from jasperhuangg November 4, 2025 19:44

@heyjennahay heyjennahay 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

@samranahm

Copy link
Copy Markdown
Contributor Author

@jasperhuangg Friendly bump.

@samranahm

Copy link
Copy Markdown
Contributor Author

@jasperhuangg Friendly bump ^

@jasperhuangg
jasperhuangg merged commit 2518d11 into Expensify:main Nov 12, 2025
27 checks passed
@OSBotify

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

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/jasperhuangg in version: 9.2.58-0 🚀

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

@mitarachim

Copy link
Copy Markdown

Hello @samranahm, the Priority Mode changed to #focus mode after creating 20 reports, not 30 reports as stated in step 2. Is this expected? or consider an issue ?

@samranahm

Copy link
Copy Markdown
Contributor Author

@mitarachim can you share how you create 30 reports, please note that after completing the onboarding process if you choose manage team ~10 reports automatically created as task reports, admin room, and expense chat.

@mitarachim

Copy link
Copy Markdown

@samranahm sorry i forgot to attach video in previous question. QA team try to create 20 empty report in workspace chat .

bandicam.2025-11-13.20-59-46-020.mp4

@samranahm

samranahm commented Nov 14, 2025

Copy link
Copy Markdown
Contributor Author

@mitarachim Looking at the display name in attachment tester more likely select manage team that create 10 reports, and then they created 20 more reports that change Priority mode. This is Expected behaviour not a bug.

@mitarachim

Copy link
Copy Markdown

@samranahm I just want to confirm: since I selected Track and budget expense during onboarding, then creating 20 more reports automatically switched it to priority mode. So this is expected, right?

Screen.Recording.2025-11-14.at.4.53.32.PM.mov

@samranahm

samranahm commented Nov 14, 2025

Copy link
Copy Markdown
Contributor Author

@mitarachim Here's the breakdown of Track and Budget expense

After sign-up

  • Self DM
  • Concierge chat
  • 2 task reports in Concierge chat
    Total = 4

Create workspace

  • Admins room
  • Expense chat
  • 6 task reports in Admins room
    Total = 8

Grand total = 12 without creating a single report manually, so Priority Mode should trigger after creating 18 reports manually. Expected behaviour.

@mitarachim

Copy link
Copy Markdown

Thank you so much for the explanation @samranahm

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/cristipaval in version: 9.2.58-3 🚀

platform result
🖥 desktop 🖥 success ✅
🕸 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