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

feat: Added keyboard navigation to Compose Actions Menu #7846

Merged

Conversation

mananjadhav
Copy link
Collaborator

@mananjadhav mananjadhav commented Feb 20, 2022

Details

  • Added keyboard navigation and keyboard based menu trigger for Compose Actions Menu <PopoverMenu />
  • Updated changes consists of using ArrowKeyFocusManager and KeyboardShortcuts lib for keyboard handling.
  • Impacted Components:
    - ReportActionComposer, additional actions menu consisting Request Money, Split Money and Add Attachment
    - FAB Menu/Sidebar Screen, which pops up when clicking the green floating action Menu
    - AvatarImagePicker, which can be tested with Profile Picture
    - Payments List, which pops up when clicking Add Payment Methods
    - ButtonWithMenu component, which is available when we select the Payment method when settling IOU
    - ThreeDotsMenu /Workspace Menu, which is visible on the workspace RHS header

Fixed Issues

$ #7317

Tests

  1. Tested keyboard navigation with arrow keys
  2. Tested each menu trigger by clicking enter
  3. Checked the focus border blue color shows for active menu
  4. Tested the components mentioned in the GH body "Impacted Components" section.
  • Verify that no errors appear in the JS console

QA Steps

Web and Desktop

A. Report Action Composer

  1. With the cursor in compose box Type Shift+Tab to navigate to ➕
  2. Click on the ➕ icon to open the compose menu
  3. With the Up and Down Arrow keys, track the movement of the selected menu item. Selected Menu item should be in grey background.
  4. On selecting a particular menu item and pressing Enter key it should open the respective menu.
    a. Request Money, it should Request Money RHS
    b. Send Money, should open Send Money RHS
    c. Add attachment, should open File Picker
  5. Escape should hide the Popover

B. Payment Method List

  1. Open the RHS by clicking the profile picture
  2. Click on the Payments Menu
  3. Click on the "Add Payment method"
  4. With the Up and Down Arrow keys, track the movement of the selected menu item. Selected Menu item should be in grey background.
  5. On selecting a particular menu item and pressing Enter key it should open the respective menu.
    a. Debit Card, should open the Add Debit card page
    b. Bank Account, should open the Plaid popup
  6. Escape should hide the Popover

C. Sidebar Screen/FAB Menu

  1. On the Home Screen, click on the Green FAB (floating action button)
  2. With the Up and Down Arrow keys, track the movement of the selected menu item. Selected Menu item should be in grey background.
  3. On selecting a particular menu item and pressing Enter key it should open the respective menu.
    a. New Chat, should open New chat search screen
    b. New Group, should open Search Member selection screen
    c. Send Money, should open IOU Amount screen, with title "Send Money"
    d. Request Money, should open IOU Amount screen, with title "Request Money"
    c. Split Bill, should open IOU Amount screen, with title "Split Bill"
  4. Escape should hide the Popover

D. Button with Menu (IOU Payments Settlement options)

  1. Find any chat with outstanding IOU
  2. Click on the amount in the LHS, it should open up the IOU Transactions screen
  3. At the bottom you should see Settlement Button, click on the down arrow button on the right
  4. With the Up and Down Arrow keys, track the movement of the selected menu item. Selected Menu item should be in grey background.
  5. Selecting the option from the menu, should set the title of the green settlement button to the selected menu item text
  6. Escape should hide the Popover

E. Avatar Picker / Profile Picture

  1. Open the Settings menu by clicking Profile Picture
  2. Click on the Avatar on the RHS
  3. Click on the camera icon (edit icon) on the Avatar
  4. With the Up and Down Arrow keys, track the movement of the selected menu item. Selected Menu item should be in grey background.
  5. If you don't have a profile picture then only one menu option will be available to upload the picture, clicking should open the File Manager
  6. If you have a profile picture (upload one if you don't), then you should be able to navigate with arrow keys between "upload photo" and "remove photo"
  7. Escape should hide the Popover

F. Workspace Menu/Three Dots Menu

  1. Open the Settings Menu clicking the Profile Picture
  2. Select any workspace on the RHS
  3. Open the Three Dots Menu (image)
  4. With the Up and Down Arrow keys, track the movement of the selected menu item. Selected Menu item should be in grey background.
  5. On selecting a particular menu item and pressing Enter key it should do the following:
    a. "New Workspace", should create a new Workspace
    b. "Delete Workspace", should open the confirm delete popup.
  6. Escape should hide the Popover

Mobile Web, iOS and Android App

A. Report Action Composer

  1. Keyboard shortcuts won't work here, so we click the FAB (➕) button
  2. For this we just need to check that clicking each menu item should open its respective menu
  3. No crashes or exceptions on these items.
  4. Tapping outside the popover should close it.

B. Payment Method List

  1. Open the RHS by clicking the profile picture
  2. Click on the Payments Menu
  3. Click on the "Add Payment method"
  4. For this we just need to check that clicking each menu item should open its respective menu
  5. No crashes or exceptions on these items.
  6. Tapping outside the popover should close it.

C. Sidebar Screen/FAB Menu

  1. On the Home Screen/Chat List screen, click on the Green FAB (floating action button)
  2. For this we just need to check that clicking each menu item should open its respective menu
  3. No crashes or exceptions on these items.
  4. Tapping outside the popover should close it.

D. Button with Menu (IOU Payments Settlement options)

  1. Find any chat with outstanding IOU
  2. Click on the amount in the LHS, it should open up the IOU Transactions screen
  3. At the bottom you should see Settlement Button, click on the down arrow button on the right
  4. Selecting the option from the menu, should set the title of the green settlement button to the selected menu item text
  5. Tapping outside the popover should close it.

E. Avatar Picker / Profile Picture

  1. Open the Settings menu by clicking Profile Picture
  2. Click on the Avatar on the RHS
  3. Click on the camera icon (edit icon) on the Avatar
  4. If you don't have a profile picture then only one menu option will be available to upload the picture, clicking should open the File Manager
  5. If you have a profile picture (upload one if you don't), then you should be able to navigate with arrow keys between "upload photo" and "remove photo"
  6. Tapping outside the popover should close it.

F. Workspace Menu/Three Dots Menu

  1. Open the Settings Menu clicking the Profile Picture
  2. Select any workspace on the RHS
  3. Open the Three Dots Menu (image)
  4. On selecting a particular menu item and pressing Enter key it should do the following:
    a. "New Workspace", should create a new Workspace
    b. "Delete Workspace", should open the confirm delete popup.
  5. Tapping outside the popover should close it.
  • Verify that no errors appear in the JS console

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.

Screenshots

Web

Composer Menu

web-compose-menu-keyboard-nav.mp4

Sidebar Screen

web-keyboard-nav-sidebar-screen_WtH8rIlj.mp4

Avatar Image Picker

web-keyboard-nav-avatar-picker_xOlxmbxf.mp4

Button with Menu

web-keyboard-nav-button-with-menu_TRtqcUdP.mp4

Payments Menu

web-keyboard-nav-payments-menu_hVMmGCdR.mp4

Workspace Menu/Three Dots Menu

web-keyboard-nav-threedots-menu.mp4

Mobile Web

mweb-compose-menu-keyboard-nav.mp4

Desktop

Composer Menu

desktop-compose-menu-keyboard-nav.mp4

All Components (mentioned in the Web individually)

desktop-keyboard-nav-all-components_W1LqyYy5.mp4

Workspace/ThreeDots Menu (revised)

desktop-keyboard-nav-threedots-menu.mp4

iOS

ios-compose-menu-keyboard-nav.mp4

Android

android-compose-menu-keyboard-nav.mp4

@mananjadhav mananjadhav requested a review from a team as a code owner February 20, 2022 12:29
@MelvinBot MelvinBot requested review from parasharrajat and puneetlath and removed request for a team February 20, 2022 12:29
@mananjadhav
Copy link
Collaborator Author

@parasharrajat @puneetlath PR Raised.

Questions:

  1. The QA steps in the linked issue says "Cmd+Tab", I am guessing they mean "Shift+Tab" and not Command.
  2. I've kept the border radius on focus as 0 for the blue border.
  3. For a single menu item, it doesn't do anything, just shows a blue border

Copy link
Member

@parasharrajat parasharrajat left a comment

Choose a reason for hiding this comment

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

Tab focus has this UI
image

And when we hover the blue border hides.

src/components/PopoverMenu/BasePopoverMenu.js Outdated Show resolved Hide resolved
@mananjadhav
Copy link
Collaborator Author

Tab focus has this UI

Hmm. I checked Arrow keys, not Tab. So should we also change activeMenuIndex based on Tab movement?

@parasharrajat
Copy link
Member

Tab movement automatically works. You just need to adjust the Border UI>

  1. Shift+tab.
  2. Tab.
  3. Arrow keys

All should focus on the item. Which it does but UI needs to be adjusted. @mananjadhav could you please record a video for all in the above list. So that we can assess UI. cc: @Expensify/design

@mananjadhav
Copy link
Collaborator Author

You just need to adjust the Border UI

Done

Tab movement automatically works.

It works but is not in sync with Arrow keys. If I am at the second menu item, pressing the Tab should take me to the third menu item, it doesn't. What I'll have to do is update activeMenuIndex with Tab and Shift+Tab as well. Here's the video of the problem.

screen-recording-2022-02-20-at-92930-pm_NZ1mw0Ef.mp4

@parasharrajat
Copy link
Member

Yeah, That as well. Thanks for bringing this up. You can use the OnFocus event. That should suffice.

@shawnborton
Copy link
Contributor

It looks like tabbing between menu items causes the items to slightly jump around. Could you please take a look at that? Perhaps it's due to the outline style that's being applied, but it looks like we're getting small 1-2px movements. I think the menu should stay perfectly in place and not move around, and you should only see outline styles being applied to the focused item.

@parasharrajat
Copy link
Member

I agree with @shawnborton 's comment. This is happening as the not-focused item does not have any border but focused has which takes 1px on each edge.

To fix this, I think we should use a transparent border for not-focused state so it does not cause a layout shift.

@parasharrajat
Copy link
Member

cc: @mananjadhav ⬆️

@parasharrajat
Copy link
Member

@mananjadhav Do you think we can reuse code from #7702? I was hoping to create a generic utility to manage arrow navigation as this is common to a few components but It seems Rory already created it in the linked PR. We can reuse that in this PR. Let's hold it till that PR is merged.

@mananjadhav
Copy link
Collaborator Author

Was reviewing. Yeah looks like we can reuse. Lets wait for it to get merged.

@parasharrajat
Copy link
Member

parasharrajat commented Feb 27, 2022

Please use HOLD in the title for clear indication.

@mananjadhav mananjadhav changed the title feat: Added keyboard navigation to Compose Actions Menu [Hold for PR 7702] feat: Added keyboard navigation to Compose Actions Menu Feb 27, 2022
@puneetlath puneetlath requested review from mountiny and removed request for puneetlath March 4, 2022 01:54
@mananjadhav
Copy link
Collaborator Author

@roryabraham @parasharrajat PR is updated by making the keyboard navigation available by default. Also updated the screencasts and QA steps for the additional components. Please take a look.


I found one issue, which isn't related to my change afaik, when clicking the menu items in the ThreeDotsMenu, the popover doesn't close. What do you think of putting it outside the scope of this PR?

@roryabraham
Copy link
Contributor

Thanks for adding screenshots and QA steps! However, I'm not able to reproduce the ThreeDotsMenu issue on staging, so I think we need to address it here

@mananjadhav
Copy link
Collaborator Author

Thanks for adding screenshots and QA steps! However, I'm not able to reproduce the ThreeDotsMenu issue on staging, so I think we need to address it here

In the current PR, it works fine for all the other components, except for ThreeDotsMenu. Let me check once again. Thanks for pointing it out.

@roryabraham
Copy link
Contributor

It looks like what's happening is:

  1. ThreeDots icon is focused
  2. When you open the PopoverMenu, the focus shifts to that
  3. You use the arrow keys to select an option from the PopoverMenu.
  4. Then you press enter to select the highlighted option from the PopoverMenu
  5. This executes the callback and closes the PopoverMenu, and the focus shifts back to the ThreeDots icon. The same Enter event fires on the ThreeDots menu and it reopens.

Something like that

@mananjadhav
Copy link
Collaborator Author

@roryabraham @parasharrajat Fix added for ThreeDotsMenu. Ready for review.

@parasharrajat
Copy link
Member

Reviewing now.

Copy link
Contributor

@roryabraham roryabraham left a comment

Choose a reason for hiding this comment

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

  • 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.

@roryabraham
Copy link
Contributor

LGTM and tests well

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.

Code lgtm! Great job @mananjadhav being persistent with this issue!

@roryabraham
Copy link
Contributor

Merging this because I think the checklist PR checks are not working as expected

@roryabraham roryabraham merged commit 14643ff into Expensify:main Sep 6, 2022
@melvin-bot melvin-bot bot added the Emergency label Sep 6, 2022
@melvin-bot
Copy link

melvin-bot bot commented Sep 6, 2022

@roryabraham 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.

@roryabraham
Copy link
Contributor

Not an emergency, see above comment

@roryabraham
Copy link
Contributor

Echoing @mountiny's sentiment above, thanks so much for your patience and persistence with this issue. I love how we really applied this solution in a generalized way across the app

@AndrewGable
Copy link
Contributor

This was using an old checklist, please make sure to use the latest one from main on older PRs 👍

@roryabraham
Copy link
Contributor

Ah, my mistake! Thanks @AndrewGable

Copy link
Member

@parasharrajat parasharrajat left a comment

Choose a reason for hiding this comment

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

Lol, this is merged by my testing is still not completed. The List is very big. But code is looking good.

this.state = {
isPopupMenuVisible: false,
};
this.button = null;
Copy link
Member

@parasharrajat parasharrajat Sep 6, 2022

Choose a reason for hiding this comment

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

NAB: Not needed.

@mananjadhav
Copy link
Collaborator Author

Lol, this is merged by my testing is still not completed

Do ping me if you find anything and I'll try to quickly raise another PR to address any issue/bug.

@OSBotify
Copy link
Contributor

OSBotify commented Sep 8, 2022

🚀 Deployed to staging by @roryabraham in version: 1.1.98-0 🚀

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

@parasharrajat
Copy link
Member

I forgot to leave the note here. Everything is looking good. I didn't find any issues caused by this PR.

Just for Automation's sake...

PR 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 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.

🎀 👀 🎀 C+ reviewed

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.

8 participants