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

UnitControl: tidy up utils and types #38987

Merged
merged 38 commits into from
Mar 2, 2022
Merged

Conversation

ciampo
Copy link
Contributor

@ciampo ciampo commented Feb 22, 2022

Description

While working on #38753 (specifically on the type of the value prop of the NumberControl component), it became clear that we should first untangle a few components using NumberControl — and UnitControl is one of them.

This PR tries to refactor and tidy up some of the types (and consequently the logic) of the UnitControl, in particular its many utility functions. With that in mind, this PR's main goal is to add a clear internal split between the numeric quantity and the unit parts that together compose the value held by UnitControl, all while introducing the least amount of runtime change possible and ideally no changes to the public API of UnitControl (despite it being flagged as an experimental component).

Changes overview

  • in order to avoid confusion around the meaning of "value", this PR renamed (and adjusted types) for a few variables/functions:
    • the value passed to UnitControl, which internally goes through the component's parsing logic, is now referred to as "Raw Value"
    • the numeric value parsed by the component's internal logic is now referred to as "quantity", and is always assumed to be a number (when defined)
    • the unit value parsed by the component's internal logic is now referred to as "unit", and is always assumed to be a string (when defined)
    • to recap: a "raw value" passed to UnitControl (e.g 14, '2.5rem', '600%'...) is parsed by the internal logic and split into a "quantity" (of type number) and a "unit" (of type string)
    • some utility functions have also been renamed to be more explicit (and often more verbose), and their JS docs have been updated. This will hopefully add more clarity to what each utility function is supposed to do.
  • the default property of the WPUnitControlUnit has changed to be a number, following the type of a parsed "quantity" (it was also already documented as such in the README)
  • the type alias Value has been removed, and replaced by more explicit string and/or number types where necessary
  • the type alias WPUnitControlUnitList has been removed, and has been replaced by WPUnitControlUnit[] (which means that those values can only be array, and can't be false anymore)
  • the value prop of UnitControl was previously typed as required, this PR changes it to be non-required (it was already being omitted or passed as null in the repo, and advertised as such in the README anyway)
  • the native UnitControl behaviour has slightly changed around how a value of [] for the units prop is handled (see code changes)

List of introduced runtime changes

  • As a consequence of the simplification and removal of the WPUnitControlUnitList type, when passing a list of units, all false values were replaced by []
  • When passing values to UnitControl, changed values from null to undefined
  • Since the parsed "quantity" is considered a number, the parsing logic internal to UnitControl now returns undefined if a quantity can't be parsed (it previously returned ''). As a consequence, the fallback to '' has been moved to each consumer the parsing utility (if necessary).
  • The default value of all "base" units has changed from '' to undefined
  • As a consequence of the fact that value can now be undefined (and that it is already passed as null or undefined anyway across the repo), a few more checks and fallbacks have been added to the UnitControl component and some of its utility functions

Testing Instructions

  • Project builds
  • All tests pass
  • Storybook stories work as expected
  • Components using UnitControl work as expected, both in Storybook and in the editor:
    • FontSizePicker
    • BoxControl
    • FocalPointPicker
    • ToolsPanel
  • Components using UnitControl in the @wordpress/block-editor package work as expected:
    • BorderRadiusControl
    • LetterSpacingControl
    • LineHeightControl
    • BorderWidthEdit
    • GapEdit
    • "Flow" layout inspector controls
    • Column block width control
    • Cover block dimension controls
    • Post featured Image's dimension controls
    • Search block dimensions
    • Spacer block dimensions controls
  • Components using UnitControl in the @wordpress/edit-site package work as expected:
    • Controls in the border panel and dimensions panel

Types of changes

Refactor

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • N/A I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).
  • N/A I've updated related schemas if appropriate.

@github-actions
Copy link

github-actions bot commented Feb 22, 2022

Size Change: +59 B (0%)

Total Size: 1.15 MB

Filename Size Change
build/block-editor/index.min.js 143 kB +26 B (0%)
build/block-library/index.min.js 167 kB -10 B (0%)
build/components/index.min.js 215 kB +43 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/admin-manifest/index.min.js 1.24 kB
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.49 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/style-rtl.css 14.8 kB
build/block-editor/style.css 14.8 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.56 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 965 B
build/block-library/blocks/gallery/editor.css 967 B
build/block-library/blocks/gallery/style-rtl.css 1.61 kB
build/block-library/blocks/gallery/style.css 1.61 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 518 B
build/block-library/blocks/image/style.css 523 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.01 kB
build/block-library/blocks/navigation/editor.css 2.02 kB
build/block-library/blocks/navigation/style-rtl.css 1.89 kB
build/block-library/blocks/navigation/style.css 1.88 kB
build/block-library/blocks/navigation/view.min.js 2.85 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 389 B
build/block-library/blocks/pullquote/style.css 388 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 201 B
build/block-library/blocks/quote/style.css 201 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 744 B
build/block-library/blocks/site-logo/editor.css 744 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 934 B
build/block-library/common.css 932 B
build/block-library/editor-rtl.css 9.89 kB
build/block-library/editor.css 9.9 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 11.4 kB
build/block-library/style.css 11.4 kB
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 670 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 46.4 kB
build/components/style-rtl.css 15.6 kB
build/components/style.css 15.6 kB
build/compose/index.min.js 11.2 kB
build/core-data/index.min.js 13.9 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.57 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.53 kB
build/edit-navigation/index.min.js 16.2 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 29.8 kB
build/edit-post/style-rtl.css 7.14 kB
build/edit-post/style.css 7.13 kB
build/edit-site/index.min.js 42.1 kB
build/edit-site/style-rtl.css 7.23 kB
build/edit-site/style.css 7.22 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.12 kB
build/edit-widgets/style.css 4.13 kB
build/editor/index.min.js 38.5 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 4.29 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.12 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences/index.min.js 1.2 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 611 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.94 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@ciampo ciampo self-assigned this Feb 22, 2022
@ciampo ciampo added [Feature] Component System WordPress component system [Package] Components /packages/components [Type] Enhancement A suggestion for improvement. labels Feb 22, 2022
@ciampo ciampo force-pushed the feat/unit-control-tidy-types branch from 57a4b7f to b5d6a28 Compare February 23, 2022 09:34
@ciampo ciampo marked this pull request as ready for review February 23, 2022 12:34
@ciampo ciampo changed the title UnitControl: tidy up utilities and types UnitControl: tidy up utils and types Feb 23, 2022
Copy link
Member

@mirka mirka left a comment

Choose a reason for hiding this comment

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

I love these improvements, it's like a masterclass in using empty arrays and undefined instead of false/null to simplify conditionals 💯 And as someone who's reading this code for the first time, the verbosity helps a lot. Beautiful work!

I mainly approached this as a code reader, so although it looks like we have decent test coverage around the runtime changes, I'll defer to others who've worked with UnitControl more intimately to take a better look at the behavioral aspects.

@@ -20,7 +21,7 @@ export default function LineHeightControl( { value: lineHeight, onChange } ) {
step={ STEP }
value={ value }
onChange={ onChange }
units={ false }
units={ [] }
Copy link
Member

Choose a reason for hiding this comment

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

Based on the separate index, I'd assume this is the RN version of UnitControl, so we probably shouldn't make this change? Like, I see some runtime changes that would happen.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

You definitely make a good point, although this may lead to more issues, since the native UnitControl component shares the same utility functions of the web component.

Also, I think it would be overall be better to have the web and mobile counterpart share the same public APIs, since they also share the same README etc.

For now, I've gone ahead and removed all changes related to native components. That, in combination with the "more robust" checks that I've added back to the shared utils, should be good enough to avoid introducing regressions to the native components.

Having said that, I'm still not convinced that this is best solution. Ideally, we should update the native UnitControl's behaviour not to rely on units being false at all — although I'm not in a position to say what's the best solution here, since it looks like the native UnitControl behaves differently when false is passed instead of []. Tagging in @enejb and @lukewalczak who recently worked on this component for guidance.

packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/unit-control/types.ts Outdated Show resolved Hide resolved
@ramonjd
Copy link
Member

ramonjd commented Feb 24, 2022

Things are working well for me. I tested changing units, changing individual box control values. All looks as it should in the frontend and editors.

I've tested the following:

Components using UnitControl in the @wordpress/block-editor package work as expected:

✅ BorderRadiusControl
✅ LetterSpacingControl
✅ LineHeightControl
✅ BorderWidthEdit
✅ GapEdit
✅ Column block width control
✅ Cover block dimension controls
✅ Spacer block dimensions controls
✅ Search block dimensions
✅ Post featured Image's dimension controls

Components using UnitControl in the @wordpress/edit-site package work as expected:

✅ Controls in the border panel and dimensions panel

  • FocalPointPicker
  • Padding
  • Margin
  • Block spacing
  • Custom font size
  • Border width and radius

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

What a great PR, thanks for all your work here tidying up the component, I think this greatly improves the readability of the component and its utility functions! ✨

I haven't been able to find any actual issues with using the component in practice, but I've added some comments about where there are some runtime changes surrounding the expected value for units and the removal of some Array.isArray() checks. Most of the feedback is totally optional, of course, and sort of point more to the question of how careful should the component be about dealing with potential values that it's passed? Because it's such a heavily used component, I think I lean a bit toward a cautious approach of leaving some of those checks in, but I do appreciate it might be cleaner to remove some of them, too!

Also, just to echo Lena's feedback, I love the shift to undefined in most of the areas, and using it as a valid value (without accidentally rendering it as a string) — I think that fix probably explains why null might have been used in lots of places in the past?

The careful function renaming and added inline comments are really great, too, gives the component a much-needed polish. Kudos!

Copy link
Contributor

@ntsekouras ntsekouras left a comment

Choose a reason for hiding this comment

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

Thanks for the PR Marco! We always need some simplifications and that make the code more maintainable, kudos! 🚀

I've tested and everything seems to be working well! All my comments are super small nit picks.

packages/components/src/unit-control/utils.ts Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/unit-control/index.tsx Outdated Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
Copy link
Contributor Author

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Thank you all! I'm humbled by all of your thoughtful and detailed reviews 🙇

I've pushed changes and replied to all comments, trying to be as granular as possible with my commits to facilitate reviewing.

Most of the feedback is totally optional, of course, and sort of point more to the question of how careful should the component be about dealing with potential values that it's passed? Because it's such a heavily used component, I think I lean a bit toward a cautious approach of leaving some of those checks in, but I do appreciate it might be cleaner to remove some of them, too!

You definitely make a good point, and I agree with you on this one. Using TypeScript internally to UnitControl doesn't necessarily prevent the component from being used incorrectly in non-typed environments. And since there may already be a few instances out there, it's probably best to stay on the side of caution and re-introduce a few more checks.

@@ -20,7 +21,7 @@ export default function LineHeightControl( { value: lineHeight, onChange } ) {
step={ STEP }
value={ value }
onChange={ onChange }
units={ false }
units={ [] }
Copy link
Contributor Author

Choose a reason for hiding this comment

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

You definitely make a good point, although this may lead to more issues, since the native UnitControl component shares the same utility functions of the web component.

Also, I think it would be overall be better to have the web and mobile counterpart share the same public APIs, since they also share the same README etc.

For now, I've gone ahead and removed all changes related to native components. That, in combination with the "more robust" checks that I've added back to the shared utils, should be good enough to avoid introducing regressions to the native components.

Having said that, I'm still not convinced that this is best solution. Ideally, we should update the native UnitControl's behaviour not to rely on units being false at all — although I'm not in a position to say what's the best solution here, since it looks like the native UnitControl behaves differently when false is passed instead of []. Tagging in @enejb and @lukewalczak who recently worked on this component for guidance.

packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/unit-control/index.tsx Outdated Show resolved Hide resolved
packages/components/src/unit-control/utils.ts Outdated Show resolved Hide resolved
@andrewserong
Copy link
Contributor

Nice work making all those updates @ciampo, I've replied and resolved all the feedback I gave (looks like you've addressed it all), and this PR is looking in great shape to me. I haven't had a chance to re-test it in detail yet, but happy to do that tomorrow. Also, looks like it needs a rebase now due to other changes in unit-control/index.tsx.

Thanks again for all the detailed work here!

@ciampo ciampo force-pushed the feat/unit-control-tidy-types branch from 24077bd to 49b645b Compare March 2, 2022 13:01
@ciampo
Copy link
Contributor Author

ciampo commented Mar 2, 2022

Update: I rebased this PR (and renamed a variable) to include changes from #39148.

Regarding the React Native runtime changes, I've decided to remove those changes from this PR as they were causing a regression (see details below). I will tackle those changes separately, so that they don't delay this PR further (cc @geriux @hypest @enejb — I'll ping you once the new PR is ready).

Since the rest of these changes have already been approved, I'll wait for CI to go green (both on this PR and on wordpress-mobile/gutenberg-mobile#4618) and then merge.

@geriux
Copy link
Member

geriux commented Mar 2, 2022

Regarding the React Native runtime changes, I've decided to remove those changes from this PR as they were causing a regression (see details below). I will tackle those changes separately, so that they don't delay this PR further (cc @geriux @hypest @enejb — I'll ping you once the new PR is ready).

Thanks @ciampo!

@hypest
Copy link
Contributor

hypest commented Mar 2, 2022

Regarding the React Native runtime changes, I've decided to remove those changes from this PR as they were causing a regression (see details below)

Works for me @ciampo , thank you for that strategy! By the way, curious to ask, was that a regression you spotted by manual testing or some other means? Thanks!

@ciampo
Copy link
Contributor Author

ciampo commented Mar 2, 2022

Forgot to add it to my previous comment! Basically, my changes were unintentionally hiding the part of the UI showing the unit (including the unit picker). Here's an example for the Spacer block:

trunk regression
Screenshot 2022-03-02 at 13 08 32 Screenshot 2022-03-02 at 13 28 04

In that new PR, we will need to investigate better the logic around checking the units value. Thankfully, @geriux should be able to help with that :)

@ciampo ciampo merged commit 0ea49d6 into trunk Mar 2, 2022
@ciampo ciampo deleted the feat/unit-control-tidy-types branch March 2, 2022 17:58
@github-actions github-actions bot added this to the Gutenberg 12.8 milestone Mar 2, 2022
@priethor priethor added the [Type] Code Quality Issues or PRs that relate to code quality label Mar 15, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Component System WordPress component system Mobile App - Automation Label used to initiate Mobile App PR Automation [Package] Components /packages/components [Type] Code Quality Issues or PRs that relate to code quality [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants