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

ReusableBlockConvertButton: use React hooks. #24015

Merged

Conversation

ZebulanStanphill
Copy link
Member

@ZebulanStanphill ZebulanStanphill commented Jul 17, 2020

Description

This PR refactors ReusableBlockConvertButton to use the useSelect and useDispatch hooks, rather than the HOC equivalents. It also fixes some comment typos and removes an unnecessary Lodash dependency.

Side note: I'm working on a PR to move the "Convert to Regular Block" button to the block toolbar. This PR is intended to polish the code a bit before I make that change.

How has this been tested?

I've tested to make sure the "Add to Reusable blocks" and "Convert to Reusable Block" options appear when they should and work as intended.

Types of changes

Only refactoring + code quality changes. Everything should act the same as master.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

@ZebulanStanphill ZebulanStanphill added [Type] Code Quality Issues or PRs that relate to code quality [Package] Editor /packages/editor labels Jul 17, 2020
@github-actions
Copy link

github-actions bot commented Jul 17, 2020

Size Change: +14 B (0%)

Total Size: 1.15 MB

Filename Size Change
build/editor/index.min.js 45.3 kB +14 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.min.js 1.14 kB 0 B
build/annotations/index.min.js 3.67 kB 0 B
build/api-fetch/index.min.js 3.43 kB 0 B
build/autop/index.min.js 2.82 kB 0 B
build/blob/index.min.js 620 B 0 B
build/block-directory/index.min.js 7.63 kB 0 B
build/block-directory/style-rtl.css 944 B 0 B
build/block-directory/style.css 945 B 0 B
build/block-editor/index.min.js 125 kB 0 B
build/block-editor/style-rtl.css 10.8 kB 0 B
build/block-editor/style.css 10.8 kB 0 B
build/block-library/editor-rtl.css 7.58 kB 0 B
build/block-library/editor.css 7.57 kB 0 B
build/block-library/index.min.js 132 kB 0 B
build/block-library/style-rtl.css 7.77 kB 0 B
build/block-library/style.css 7.77 kB 0 B
build/block-library/theme-rtl.css 728 B 0 B
build/block-library/theme.css 729 B 0 B
build/block-serialization-default-parser/index.min.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.min.js 3.1 kB 0 B
build/blocks/index.min.js 48.3 kB 0 B
build/components/index.min.js 200 kB 0 B
build/components/style-rtl.css 15.6 kB 0 B
build/components/style.css 15.6 kB 0 B
build/compose/index.min.js 9.68 kB 0 B
build/core-data/index.min.js 11.5 kB 0 B
build/data-controls/index.min.js 1.29 kB 0 B
build/data/index.min.js 8.45 kB 0 B
build/date/index.min.js 5.38 kB 0 B
build/deprecated/index.min.js 772 B 0 B
build/dom-ready/index.min.js 568 B 0 B
build/dom/index.min.js 3.23 kB 0 B
build/edit-navigation/index.min.js 10.8 kB 0 B
build/edit-navigation/style-rtl.css 1.08 kB 0 B
build/edit-navigation/style.css 1.08 kB 0 B
build/edit-post/index.min.js 304 kB 0 B
build/edit-post/style-rtl.css 5.61 kB 0 B
build/edit-post/style.css 5.61 kB 0 B
build/edit-site/index.min.js 16.8 kB 0 B
build/edit-site/style-rtl.css 3.06 kB 0 B
build/edit-site/style.css 3.06 kB 0 B
build/edit-widgets/index.min.js 9.37 kB 0 B
build/edit-widgets/style-rtl.css 2.45 kB 0 B
build/edit-widgets/style.css 2.45 kB 0 B
build/editor/editor-styles-rtl.css 537 B 0 B
build/editor/editor-styles.css 539 B 0 B
build/editor/style-rtl.css 3.78 kB 0 B
build/editor/style.css 3.78 kB 0 B
build/element/index.min.js 4.65 kB 0 B
build/escape-html/index.min.js 733 B 0 B
build/format-library/index.min.js 7.72 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.min.js 2.13 kB 0 B
build/html-entities/index.min.js 621 B 0 B
build/i18n/index.min.js 3.56 kB 0 B
build/is-shallow-equal/index.min.js 711 B 0 B
build/keyboard-shortcuts/index.min.js 2.51 kB 0 B
build/keycodes/index.min.js 1.94 kB 0 B
build/list-reusable-blocks/index.min.js 3.12 kB 0 B
build/list-reusable-blocks/style-rtl.css 476 B 0 B
build/list-reusable-blocks/style.css 476 B 0 B
build/media-utils/index.min.js 5.32 kB 0 B
build/notices/index.min.js 1.79 kB 0 B
build/nux/index.min.js 3.4 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/plugins/index.min.js 2.56 kB 0 B
build/primitives/index.min.js 1.4 kB 0 B
build/priority-queue/index.min.js 789 B 0 B
build/redux-routine/index.min.js 2.85 kB 0 B
build/rich-text/index.min.js 13.9 kB 0 B
build/server-side-render/index.min.js 2.71 kB 0 B
build/shortcode/index.min.js 1.7 kB 0 B
build/token-list/index.min.js 1.27 kB 0 B
build/url/index.min.js 4.06 kB 0 B
build/viewport/index.min.js 1.85 kB 0 B
build/warning/index.min.js 1.14 kB 0 B
build/wordcount/index.min.js 1.17 kB 0 B

compressed-size-action

isReusable ||
// Hide 'Add to Reusable blocks' when reusable blocks are disabled.
( canInsertBlockType( 'core/block' ) &&
blocks?.every(
Copy link
Contributor

Choose a reason for hiding this comment

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

This is interesting while every(undefined, something) returns true, undefined?.every( something ) returns undefined (aka false) which changes the meaning.

It's one of the reasons I still prefer lodash defaults over having to think about these subtile usecases. I find something?.something to be very problematic in a lot of usecases and something to use but not to overuse. It can quickly introduce hidden bugs everywhere.

Copy link
Member Author

Choose a reason for hiding this comment

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

Lodash's every(undefined, something) returning true is a surprise to me. That's not at all what I would expect.

In this case, though, it seems like it isn't even possible for blocks to be undefined; so the optional chaining shouldn't even be necessary, right?

Copy link
Contributor

Choose a reason for hiding this comment

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

Mathematically speaking Every(undefined) = true is the correct thing.

In this case, though, it seems like it isn't even possible for blocks to be undefined; so the optional chaining shouldn't even be necessary, right?

IMO, we should assume things like that. We don't really know at this point what we have in store even if it seems technically impossible. The only way to ensure that is to have typing everywhere.

Maybe:

  • When mounting/unmounting blocks, there's a delay where it could happen,
  • Maybe there's some async behavior (there isn't) causing this.

What I'm trying to say is that the component should be written consistently regardless of how the rest of the system works.

Copy link
Member Author

Choose a reason for hiding this comment

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

In my opinion, running every on undefined isn't something one would assume to be possible by default. That sounds like just as much of a potential gotcha as the optional chaining resulting in false by default.

In this case, I think the current change in behavior is probably fine... if blocks is empty, there's nothing to convert to a reusable block at the moment, so we wouldn't want to show the option, right? In fact, that's what I had assumed the logic was already doing before my changes.

Funny enough, while discussing this, I've just found a bug in the code. We're checking for isReusable || ... when it should be _isReusable || .... Additionally, instead of using optional chaining, we can just use nullish coalescing to default blocks to [] when it is first defined.

I'm going to go implement both of those changes real quick.

Copy link
Contributor

@youknowriad youknowriad left a comment

Choose a reason for hiding this comment

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

Approving but I think we should restore lodash here personally.

@ZebulanStanphill ZebulanStanphill force-pushed the update/reusable-block-convert-button-use-hooks branch 2 times, most recently from 8e112da to ff15c9e Compare July 20, 2020 15:34
@ZebulanStanphill ZebulanStanphill force-pushed the update/reusable-block-convert-button-use-hooks branch from ff15c9e to 5c47241 Compare July 20, 2020 15:36
@ZebulanStanphill
Copy link
Member Author

Alright, I've fixed the _isVisible logic bugs/gotchas and while I was at it, I added a JSDoc to the component for some slightly stronger typing (and to provide a description of what the component does). I'm going to go ahead and merge when the tests pass.

@ZebulanStanphill ZebulanStanphill added the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jul 20, 2020
@ZebulanStanphill

This comment has been minimized.

@ZebulanStanphill
Copy link
Member Author

Whoops, posted that last comment on the wrong PR! Sorry...

@ZebulanStanphill ZebulanStanphill removed the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jul 20, 2020
@ZebulanStanphill ZebulanStanphill merged commit f598d43 into master Jul 20, 2020
@ZebulanStanphill ZebulanStanphill deleted the update/reusable-block-convert-button-use-hooks branch July 20, 2020 16:56
@github-actions github-actions bot added this to the Gutenberg 8.7 milestone Jul 20, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Editor /packages/editor [Type] Code Quality Issues or PRs that relate to code quality
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants