Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ignore hasOutstandingIOU from child iouReport #24448

Merged
merged 8 commits into from
Aug 15, 2023

Conversation

aldo-expensify
Copy link
Contributor

@aldo-expensify aldo-expensify commented Aug 11, 2023

Test with: https://github.com/Expensify/Web-Expensify/pull/38473

Details

We were looking into the linked iou/expense report to check for the property hasOutstandingIOU. This means that if you request money, both reports (the parent chat report and the money request report) get the green dot like there is an action pending.

We are changing this to now only show the green dot in the expense/iou report and not the parent report.

The original behaviour made sense when we were not loading iou/expense reports into the LHN, but we are now, so we don't need this logic anymore

Fixed Issues

$ https://github.com/Expensify/Expensify/issues/307581
PROPOSAL:

Tests

  1. Create two accounts
  2. Create a chat between the accounts
  3. Account1 creates a money request from Account2
  4. Verify that Account2 only sees the green dot in the IOU report and not in the chat
  5. Log out and log in with Account2
  6. Verify again that Account2 only sees the green dot in the IOU report and not in the chat
  • Verify that no errors appear in the JS console

Offline tests

N/A

QA Steps

  1. Create two accounts
  2. Create a chat between the accounts
  3. Account1 creates a money request from Account2
  4. Verify that Account2 only sees the green dot in the IOU report and not in the chat
  5. Log out and log in with Account2
  6. Verify again that Account2 only sees the green dot in the IOU report and not in the chat
  • 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 / Chrome
    • iOS / native
    • iOS / 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 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 the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
    • 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 verified the translation was requested/reviewed 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 approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
    • 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.js 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 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
    • If we are not using the full Onyx data that we loaded, I've added the proper selector in order to ensure the component only re-renders when the data it is using changes
    • 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(themeColors.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 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.
  • 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 author checklist, including those that don't apply to this PR.

Screenshots/Videos

Web

Before
Screenshot 2023-08-11 at 11 22 33 AM

After
Screenshot 2023-08-11 at 11 22 54 AM

Mobile Web - Chrome
Mobile Web - Safari
Desktop
iOS
Android

@aldo-expensify aldo-expensify self-assigned this Aug 11, 2023
@aldo-expensify aldo-expensify marked this pull request as ready for review August 11, 2023 19:35
@aldo-expensify aldo-expensify requested a review from a team as a code owner August 11, 2023 19:35
@melvin-bot melvin-bot bot requested review from situchan and removed request for a team August 11, 2023 19:35
@melvin-bot
Copy link

melvin-bot bot commented Aug 11, 2023

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

@aldo-expensify aldo-expensify removed the request for review from situchan August 11, 2023 19:36
@situchan
Copy link
Contributor

Test with: https://github.com/Expensify/Web-Expensify/pull/38473

What's the status of this PR? local / merged only / staging?

@aldo-expensify
Copy link
Contributor Author

What's the status of this PR? local / merged only / staging?

I don't think it is necessary to wait for that, both parts (frontend and backend) needs the same update, and it will be inconsistent as long as one of them has not been deployed

@aldo-expensify aldo-expensify changed the title Ignore hasOutstandingIOU from child iouReport [HOLD https://github.com/Expensify/Web-Expensify/pull/38473] Ignore hasOutstandingIOU from child iouReport Aug 11, 2023
@aldo-expensify
Copy link
Contributor Author

@situchan thinking again about it, I guess it makes sense to wait for https://github.com/Expensify/Web-Expensify/pull/38473 to be deployed, otherwise it will be hard to test that the front end changes are doing something.

@aldo-expensify
Copy link
Contributor Author

Fixed tests, the Web-E PR is in staging, so this can be tested now

@aldo-expensify aldo-expensify changed the title [HOLD https://github.com/Expensify/Web-Expensify/pull/38473] Ignore hasOutstandingIOU from child iouReport Ignore hasOutstandingIOU from child iouReport Aug 14, 2023
@JmillsExpensify
Copy link

@situchan Heads up that this is one of the most important PRs we can merge right now. Please start on this one before any others in your list.

@mountiny
Copy link
Contributor

Asked in Slack for prioritization https://expensify.slack.com/archives/C02NK2DQWUX/p1692108871664589

@situchan
Copy link
Contributor

Is backend update deployed to production?
I don't see any difference pointing to staging and to production. Works well on both apis.

Before fix:

before-fix

After fix (pointing to staging api):

after-fix-staging

After fix (pointing to production api):

after-fix-prod

@situchan
Copy link
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 tests pass on all platforms & I tested again on:
    • Android / native
    • Android / Chrome
    • iOS / native
    • iOS / 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 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 the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
    • 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 approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
    • 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.js 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(themeColors.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 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.
  • 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

Web
  • IOU request
web.mov
  • Expense request
web2.mov
Mobile Web - Chrome
Mobile Web - Safari
Desktop
iOS
Android

@situchan
Copy link
Contributor

While testing expense request, I noticed that green dot briefly appears and then disappears in workspace chat

bug.mov

@situchan
Copy link
Contributor

@aldo-expensify can you please check #24448 (comment)? Constantly reproducible to me

@mountiny
Copy link
Contributor

Hmm should be on staging only, waiting for @aldo-expensify to check this out

@aldo-expensify
Copy link
Contributor Author

@situchan maybe I'm wrong about expecting a difference between staging/production, maybe this doesn't depend on the backend update to work fine. Testing...

@situchan
Copy link
Contributor

@situchan maybe I'm wrong about expecting a difference between staging/production, maybe this doesn't depend on the backend update to work fine. Testing...

I also thought so. Though not sure what backend update is.

@aldo-expensify
Copy link
Contributor Author

I can see that if I connect to production, the fix is not there because hasOutstandingIOU is true for the policyExpenseChat

image

Having said that, this apparently is not enough to show the green dot in the workspace chat I assume because of other conditions here:

if (report.hasOutstandingIOU && report.ownerAccountID && (report.ownerAccountID !== currentUserAccountID || currentUserAccountID === report.managerID)) {

I'm trying to make my app hit staging using .env but it still goes to production 😕

@aldo-expensify
Copy link
Contributor Author

@situchan maybe I'm wrong about expecting a difference between staging/production, maybe this doesn't depend on the backend update to work fine. Testing...

I also thought so. Though not sure what backend update is.

The backend should make the policyExpenseChat have hasOutstandingIOU: false since it doesn't copy that state anymore from the linked iou/expense report, but as we saw, seems like that change is not really important for this to work.

@aldo-expensify
Copy link
Contributor Author

Would be good to know why is that you see the green dot appearing briefly in the workspace chat and I don't.

@situchan
Copy link
Contributor

I'm trying to make my app hit staging using .env but it still goes to production 😕

I am always using this toggle on Preferences page for staging/production switch

Screenshot 2023-08-16 at 2 04 39 AM

@aldo-expensify
Copy link
Contributor Author

I'm trying to make my app hit staging using .env but it still goes to production 😕

I am always using this toggle on Preferences page for staging/production switch

Screenshot 2023-08-16 at 2 04 39 AM

I see... I'm not sure if that works for my case because I think you can activate that after you logged in, and the server was sending the wrong thing in the OpenApp request

Anyway, I got it to connect to staging in my env by adding ENVIRONMENT=staging, now the policyExpenseChat has hasOutstandingIOU: false:

image

Not sure if it helps with anything you are testing. Are you able to reproduce the issue with the green dot in the workspace chat? if you can reproduce, can you give me a list of steps?

@situchan
Copy link
Contributor

Trying to find the root cause.

This video shows clear reproduction step.

Screen.Recording.2023-08-16.at.2.27.19.AM.mov

@aldo-expensify
Copy link
Contributor Author

This video shows clear reproduction step.

Not clear enough :P . Does this happen if you do the same with a fresh account?
Is the account requesting money the same as the workspace admin/owner? or is it a member that you invited?

@situchan
Copy link
Contributor

situchan commented Aug 15, 2023

I think I found the root cause.
Pusher is still sending hasOutstandingIOU: true. As seen in video, when switch to another chat and come back, green dot disappears, which means hasOutstandingIOU is set back to false in OpenReport api

@situchan
Copy link
Contributor

Is it possible that pusher points to production while api points to staging?

I think we can go ahead and merge this as this is related to backend.
And after deploy to staging, re-test

@aldo-expensify
Copy link
Contributor Author

Is it possible that pusher points to production while api points to staging?

hmm, the pusher event are per account, and they are sent when the command is executed in the backend. If the command reached staging, then the generated pusher events should have been generated with staging code.

Do you think it is a pusher event generated from the RequestMoney request? can you give me the requestID of the request RequestMoney when you are testing with staging? You can get it from here:

image

@aldo-expensify
Copy link
Contributor Author

@situchan I just reproduced the bug you are pointing too, but I had to create a workspace with 2 users and request money from the member that is not the admin. I can see the pusher event that incorrectly sets hasOutstandingIOU: true for the policyExpenseChat and the green dot appearing:

image

I'll work on fixing that in the backend, thanks for the catch!

@aldo-expensify
Copy link
Contributor Author

Working on PR here: https://github.com/Expensify/Web-Expensify/pull/38514 , I'll add tests and make it ready for review.

@mountiny
Copy link
Contributor

mountiny commented Aug 15, 2023

Nice, great job identifying it, I dont think we have to hold on that one though so I think we can go ahead with this PR, do you agree @aldo-expensify?

Copy link
Contributor

@situchan situchan left a comment

Choose a reason for hiding this comment

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

Checklist: #24448 (comment)

@melvin-bot melvin-bot bot requested a review from arosiclair August 15, 2023 23:16
@melvin-bot
Copy link

melvin-bot bot commented Aug 15, 2023

@arosiclair 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
Copy link

melvin-bot bot commented Aug 15, 2023

🎯 @situchan, thanks for reviewing and testing this PR! 🎉

An E/App issue has been created to issue payment here: #24611.

@aldo-expensify
Copy link
Contributor Author

I dont think we have to hold on that one though so I think we can go ahead with this PR, do you agree @aldo-expensify?

Agree, this is a pretty safe change

Copy link
Contributor

@mountiny mountiny left a comment

Choose a reason for hiding this comment

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

Changes look good to me and @situchan tested thoroughly based on the comments. Feel free to merge if you want, I think we are good to go @aldo-expensify

@aldo-expensify aldo-expensify merged commit 7f13cdd into main Aug 15, 2023
12 checks passed
@aldo-expensify aldo-expensify deleted the aldo_ignore-has-outstanding-iou-child-report branch August 15, 2023 23:51
@OSBotify
Copy link
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
Contributor

🚀 Deployed to staging by https://github.com/aldo-expensify in version: 1.3.55-0 🚀

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

@OSBotify
Copy link
Contributor

🚀 Deployed to staging by https://github.com/aldo-expensify in version: 1.3.56-0 🚀

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

@OSBotify
Copy link
Contributor

🚀 Deployed to production by https://github.com/roryabraham in version: 1.3.56-24 🚀

platform result
🤖 android 🤖 success ✅
🖥 desktop 🖥 success ✅
🍎 iOS 🍎 failure ❌
🕸 web 🕸 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.

5 participants