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

Add ResendResetPassword action to break up ResetPassword #10798

Merged
merged 8 commits into from
Sep 19, 2022

Conversation

bondydaa
Copy link
Contributor

@bondydaa bondydaa commented Sep 2, 2022

Details

We were re-using an api action in two different places when we wanted different behavior so this splits them so that we can do different things when Forgot? is clicked vs Resend Link is clicked.

Fixed Issues

$ #10785

Tests

Non SAML account test

  1. Enter an email for an existing, non-saml account and click continue
  2. Click the Forgot? button when prompted for you password.
  3. Ensure that the new page that appears doesn't have a loader spinner appear and that no Brick Road messages appear. image
  4. Click the Resend link button and ensure the success Brick Road message shows image

SAML account test

  1. Enter an email that is on a SAML required domain (if you don't have this you can test with expensifail.com but ensure you make QA aware you're doing this on staging/production) and click continue
  2. Click the Forgot? button when prompted for you password ensure the next page doesn't show a loader or any Brick Road messages
  3. Ensure you get the proper error Brick Road message like so Screen Shot 2022-09-15 at 11 04 38 AM

PR Review Checklist

Contributor (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 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 included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • iOS / native
    • Android / native
    • iOS / Safari
    • Android / Chrome
    • MacOS / Chrome
    • 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 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 was added in all src/languages/* files
    • I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team 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
  • 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 */
    • Any functional components have the displayName property
    • 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 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 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.
  • I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

PR Reviewer Checklist

The Contributor+ will copy/paste it into a new comment and complete it after the author checklist is completed

  • 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 verified tests pass on all platforms & I tested again on:
    • iOS / native
    • Android / native
    • iOS / Safari
    • Android / Chrome
    • MacOS / Chrome
    • 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 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 was added in all src/languages/* files
    • I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team 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 */
    • Any functional components have the displayName property
    • 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 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 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.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

QA Steps

  • Verify that no errors appear in the JS console

Non SAML account test

  1. Enter an email for an existing, non-saml account and click continue
  2. Click the Forgot? button when prompted for you password.
  3. Ensure that the new page that appears doesn't have a loader spinner appear and that no Brick Road messages appear. image
  4. Click the Resend link button and ensure the success Brick Road message shows image

SAML account test

  1. Enter an email that is on a SAML required domain (if you don't have this you can test with expensifail.com but ensure you make QA aware you're doing this on staging/production) and click continue
  2. Click the Forgot? button when prompted for you password ensure the next page doesn't show a loader or any Brick Road messages
  3. Ensure you get the proper error Brick Road message like so Screen Shot 2022-09-15 at 11 04 38 AM

Screenshots

Web

Mobile Web

Desktop

No message or loader shows when you first click Forgot?
image

Message appears properly when you click resend
image

Error message is properly shown for SAML users
Screen Shot 2022-09-15 at 11 04 38 AM

iOS

Android

@bondydaa bondydaa self-assigned this Sep 2, 2022
@luacmartins luacmartins self-requested a review September 8, 2022 08:48
key: ONYXKEYS.ACCOUNT,
value: {
isLoading: false,
message: null,
Copy link
Contributor

Choose a reason for hiding this comment

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

NAB I'm wondering if we actually need to set message: null here. We already clear message in optimisticData so it should already be empty. This applies for failureData and for resendResetPassword too.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah my only thought was if something else would have set this message key previously?

Though I just tested this and don't think it's possible, here's what I did

  1. sign up with a new account, click resend to resend a 2nd validation link and get the success message which also uses account.message.
  2. validate the account outside of going through new dot (I simulated this with cli tools to validate for me)
  3. go back to "start" page and enter email again and then click forgot?. Here is where I was expecting the message previous to persist but it didn't so I think we're okay. There is probably a corner case somewhere lurking if we don't probably clear out account.message but we can fix that if it ever shows up easily.

Copy link
Contributor

Choose a reason for hiding this comment

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

Whenever we tap Forgot? we trigger resetPassword and we clear message and error in optimisticData, so I think that we should be ok.

onyxMethod: CONST.ONYX.METHOD.MERGE,
key: ONYXKEYS.ACCOUNT,
value: {
isLoading: true,
Copy link
Contributor

Choose a reason for hiding this comment

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

NAB maybe this is just me, but it looks a bit odd to be redirected to the Forgot page and see the loading indicator when the message above says we sent a link already. Should we just remove the loading indicator from the first load? 🤔

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yep agreed.

@bondydaa bondydaa marked this pull request as ready for review September 15, 2022 18:02
@bondydaa bondydaa requested a review from a team as a code owner September 15, 2022 18:02
@bondydaa
Copy link
Contributor Author

Updated and ready for review.

Though there is one thing I'm not sure about, we didn't want the Brick Road messaging showing up when the page first loaded but in the case for SAML required users it actually is and I think that's okay since it then gives a heads up that we didn't actually send the email.

2022-09-15_12-00-51 (1)

@melvin-bot melvin-bot bot requested review from Justicea83 and removed request for a team September 15, 2022 18:03
@luacmartins
Copy link
Contributor

I think the SAML case makes sense.

Comment on lines 304 to 321
successData: [
{
onyxMethod: CONST.ONYX.METHOD.MERGE,
key: ONYXKEYS.ACCOUNT,
value: {
isLoading: false,
},
},
],
failureData: [
{
onyxMethod: CONST.ONYX.METHOD.MERGE,
key: ONYXKEYS.ACCOUNT,
value: {
isLoading: false,
},
},
],
Copy link
Contributor

Choose a reason for hiding this comment

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

Hmm now that we don't set isLoading in optimisticData, there's no need to set it to false here. So we can just get rid of both successData and failureData

luacmartins
luacmartins previously approved these changes Sep 15, 2022
@mananjadhav
Copy link
Collaborator

mananjadhav commented Sep 16, 2022

The code changes look fine but the test didn't work for me. Also I don't have access to a SAML account.

@bondydaa @luacmartins Do I need any additional setup here? I am getting 404 errors in the network tab on clicking Resend Link

image

requestresendpassword.mp4

@luacmartins
Copy link
Contributor

@mananjadhav the API changes that introduce this command are only in staging at the moment. You can either wait until these changes make it to prod (probably on Monday) or point your App to the staging API to test.

@mananjadhav
Copy link
Collaborator

the API changes that introduce this command are only in staging

@luacmartins I thought so, I copied .env.staging into a .env but it gives me CORS error. I used to use a Chrome web plugin for CORS but that doesn't seem to work here. Do I need to do something additional for staging APIs to work?

@luacmartins luacmartins changed the title Add ResendResetPassword action to break up ResetPassword [HOLD Web-E #34769 ] Add ResendResetPassword action to break up ResetPassword Sep 16, 2022
@luacmartins
Copy link
Contributor

@mananjadhav web might be a problem, but I don't have issues on desktop or mobile. Maybe you can test those?

@mananjadhav
Copy link
Collaborator

Yeah App and Desktop I'll sort out. Then I'll test on these platforms and Monday if it is pushed I'll test the Web too.

@mananjadhav
Copy link
Collaborator

mananjadhav commented Sep 16, 2022

Changes look good and I tested them on Desktop, iOS and Android App. The only corner case that might not be related to the PR is, if I press Resend Link and immediately I go offline (before the request completes), the button gets disabled and is in loading state.

🎀 👀 🎀 
C+ reviewed

I haven't tested on Web and mWeb.

PR Reviewer Checklist

The Contributor+ will copy/paste it into a new comment and complete it after the author checklist is completed

  • 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 verified tests pass on all platforms & I tested again on:
    • iOS / native
    • Android / native
    • iOS / Safari
    • Android / Chrome
    • MacOS / Chrome
    • 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 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 was added in all src/languages/* files
    • I verified any copy / text that was added to the app is correct English and approved by marketing by tagging the marketing team 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 */
    • Any functional components have the displayName property
    • 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 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 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.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

@luacmartins
Copy link
Contributor

@mananjadhav thanks for the review! I think that edge case exists for all commands that set a loading state, so I wouldn't block this PR on that. That being said, we should probably address the general issue since it could happen quite often with spotty connections.

@luacmartins luacmartins changed the title [HOLD Web-E #34769 ] Add ResendResetPassword action to break up ResetPassword Add ResendResetPassword action to break up ResetPassword Sep 19, 2022
@luacmartins
Copy link
Contributor

Web-E PR is in prod. Removing hold and merging!

@luacmartins
Copy link
Contributor

I edited the checklists so that tests pass.

@luacmartins luacmartins merged commit e093383 into main Sep 19, 2022
@luacmartins luacmartins deleted the bondy-split-RequestPasswordReset branch September 19, 2022 19:28
@melvin-bot
Copy link

melvin-bot bot commented Sep 19, 2022

@luacmartins looks like this was merged without passing tests. Please add a note explaining why this was done and remove the Emergency label if this is not an emergency.

@melvin-bot melvin-bot bot added the Emergency label Sep 19, 2022
@luacmartins
Copy link
Contributor

Tests passed. Removed Emergency label.

@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 @luacmartins in version: 1.2.3-0 🚀

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

@OSBotify
Copy link
Contributor

🚀 Deployed to production by @luacmartins in version: 1.2.3-1 🚀

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.

4 participants