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 component: Refactor JSX components to TypeScript #35281

Merged

Conversation

andrewserong
Copy link
Contributor

@andrewserong andrewserong commented Oct 1, 2021

Description

Follows on from #35138

This PR refactors the main JSX components of the UnitControl component to use TypeScript, and adds some additional types.

How has this been tested?

Manually in the editor (e.g. add a Cover block to a post, and try adjusting the padding and minimum height).

Running tests:

npm run test-unit -- --testPathPattern packages/components/src/unit-control/test

In Storybook:

npm run storybook:dev

Ensure that a theme's theme.json units settings overrides the available units

With TT1-Blocks applied, you should see that the list of available units does not include %, but you can also manually edit the theme.json file's settings.spacing.units attribute to a reduced list of unit strings (e.g. [ 'px', 'em', 'rem' ] to ensure it works as expected.

Screenshots

Types of changes

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

@andrewserong andrewserong self-assigned this Oct 1, 2021
@andrewserong andrewserong added [Feature] UI Components Impacts or related to the UI component system [Type] Code Quality Issues or PRs that relate to code quality labels Oct 1, 2021
@github-actions
Copy link

github-actions bot commented Oct 1, 2021

Size Change: +367 B (0%)

Total Size: 1.07 MB

Filename Size Change
build/block-library/blocks/navigation/editor-rtl.css 1.71 kB -5 B (0%)
build/block-library/blocks/navigation/editor.css 1.71 kB -7 B (0%)
build/block-library/blocks/navigation/style-rtl.css 1.64 kB +28 B (+2%)
build/block-library/blocks/navigation/style.css 1.64 kB +26 B (+2%)
build/block-library/common-rtl.css 815 B -38 B (-4%)
build/block-library/common.css 812 B -37 B (-4%)
build/block-library/editor-rtl.css 9.79 kB -44 B (0%)
build/block-library/editor.css 9.79 kB -44 B (0%)
build/block-library/index.min.js 148 kB +247 B (0%)
build/block-library/style-rtl.css 10.4 kB -4 B (0%)
build/block-library/style.css 10.4 kB -5 B (0%)
build/components/index.min.js 217 kB +100 B (0%)
build/compose/index.min.js 10.4 kB -3 B (0%)
build/edit-navigation/style-rtl.css 3.76 kB +21 B (+1%)
build/edit-navigation/style.css 3.76 kB +21 B (+1%)
build/edit-post/style-rtl.css 7.22 kB +24 B (0%)
build/edit-post/style.css 7.22 kB +25 B (0%)
build/edit-site/style-rtl.css 5.54 kB +7 B (0%)
build/edit-site/style.css 5.54 kB +6 B (0%)
build/edit-widgets/style-rtl.css 4.12 kB +24 B (+1%)
build/edit-widgets/style.css 4.13 kB +25 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 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/index.min.js 134 kB
build/block-editor/style-rtl.css 13.9 kB
build/block-editor/style.css 13.9 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 58 B
build/block-library/blocks/audio/editor.css 58 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 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 600 B
build/block-library/blocks/button/style.css 600 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 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 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 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.17 kB
build/block-library/blocks/cover/style.css 1.17 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 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 322 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 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 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/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 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 502 B
build/block-library/blocks/image/style.css 505 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 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 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 568 B
build/block-library/blocks/navigation-link/editor.css 570 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 300 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/view.min.js 2.74 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 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 198 B
build/block-library/blocks/page-list/style.css 198 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/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 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 396 B
build/block-library/blocks/post-featured-image/editor.css 397 B
build/block-library/blocks/post-featured-image/style-rtl.css 156 B
build/block-library/blocks/post-featured-image/style.css 156 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 391 B
build/block-library/blocks/post-template/style.css 392 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 60 B
build/block-library/blocks/post-title/style.css 60 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 378 B
build/block-library/blocks/pullquote/style.css 378 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 262 B
build/block-library/blocks/query-pagination/editor.css 255 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-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 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 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 220 B
build/block-library/blocks/quote/theme.css 222 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 374 B
build/block-library/blocks/search/style.css 375 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 250 B
build/block-library/blocks/separator/style.css 250 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 769 B
build/block-library/blocks/site-logo/editor.css 769 B
build/block-library/blocks/site-logo/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 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 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.3 kB
build/block-library/blocks/social-links/style.css 1.3 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 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 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 636 B
build/block-library/blocks/template-part/editor.css 635 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/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 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/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 669 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 45.7 kB
build/components/style-rtl.css 15.2 kB
build/components/style.css 15.2 kB
build/core-data/index.min.js 12.4 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.46 kB
build/edit-navigation/index.min.js 15.3 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.3 kB
build/edit-site/index.min.js 29.7 kB
build/edit-widgets/index.min.js 15.7 kB
build/editor/index.min.js 37.5 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.17 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.93 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 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.92 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.19 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.52 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.11 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

Copy link
Contributor

@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 for the early ping, @andrewserong !

I've replied to your initial comment with hopefully a good solution.

Next up, I would:

  • add the unit-control folder to tsconfig.json
  • rename index.js and index.native.js to index.tsx and index.native.tsx
  • Look at the imports of each TypeScript file in the unit-control folder. If they are written in JS, add a // @ts-nocheck at the top of each imported file (this is to prevent TypeScript from type-checking the local (in the same package) dependencies of unit-control, since we want to focus only on this folder.
  • Fix the rest of the TypeScript errors, until running npm run dev works fine (and tests still pass)

As always, don't hesitate to ping me! I'm also happy to do some pairing on this, if you prefer.

@andrewserong andrewserong changed the title [WIP] UnitControl component: Refactor JSX components to TypeScript UnitControl component: Refactor JSX components to TypeScript Oct 4, 2021
@andrewserong andrewserong marked this pull request as ready for review October 4, 2021 05:20
@andrewserong
Copy link
Contributor Author

@ciampo thanks again for the feedback, the discussion back and forth on the PR works nicely for me! Today, I've:

  • Added in the unit-control path to ts-config.json
  • Renamed index.js to index.tsx — it doesn't look like we've done any of the other components' native components JS -> TSX yet, so I was wondering if it'd be better to leave that to another PR or time? (I haven't done much with React Native yet, either)
  • Looked at the imports of each TypeScript file in the unit-control folder — it looks like they're mostly being imported from TS files or files that already have the // @ts-nocheck, but I only looked quickly since I'm near the end of the day, so I might have missed something there
  • Made a number of tweaks to resolve all the TypeScript errors, while ensuring tests still pass

For the types, I needed to do a little bit of wrangling with the value type between places where it should be treated as a string (E.g. in the input component) and where it can happily be a number (e.g. passed to onChange for whatever is consuming the UnitControl). I think the expectation of a consumer would be that you could get a real number from the component, but that internally it'd be consistent with how the input control works, where the value is a string. I'm not sure if I've gotten the consistency quite right here, so very happy for feedback, of course!

I've added in a few comments in Github where I made some decisions, to hopefully make it a bit clearer where behaviour has needed to change. I'm sure I've likely missed some details, so I'm keen to hear what you think. There's no rush on reviewing, though, as I've also got plenty else to go on with this week in case you're busy 🙂

Copy link
Contributor

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

I've left replies to your comments — this is definitely moving in the right direction!

t doesn't look like we've done any of the other components' native components JS -> TSX yet, so I was wondering if it'd be better to leave that to another PR or time? (I haven't done much with React Native yet, either)

Me neither. Let's leave it as-is for now, and maybe involve someone who knows a bit more about React Native and how it works in Gutenberg before merging?

Looked at the imports of each TypeScript file in the unit-control folder — it looks like they're mostly being imported from TS files or files that already have the // @ts-nocheck, but I only looked quickly since I'm near the end of the day, so I might have missed something there

Looks like you're correct — that's good news!

For the types, I needed to do a little bit of wrangling with the value type between places where it should be treated as a string (E.g. in the input component) and where it can happily be a number (e.g. passed to onChange for whatever is consuming the UnitControl). I think the expectation of a consumer would be that you could get a real number from the component, but that internally it'd be consistent with how the input control works, where the value is a string. I'm not sure if I've gotten the consistency quite right here, so very happy for feedback, of course!

Yeah, that looks messy and it's definitely something that I'd like to improve in a follow-up PR. For now, let's focus on getting the best type definitions that we can while introducing the least amount ot runtime changes possible.

There's no rush on reviewing, though, as I've also got plenty else to go on with this week in case you're busy 🙂

Same for me. I may be busy with other work in the next days but I'll try to do my best to follow any progress!

@andrewserong
Copy link
Contributor Author

Thanks for the review and the feedback! I've been sucked into a vortex of other tasks, but hope to get back to implementing the changes later on this week 🙂

@andrewserong
Copy link
Contributor Author

Thanks again @ciampo (and for the great suggestions)! I've worked through the feedback and committed changes (and left a couple of comments where I haven't yet made further changes). I'll be switching back to some other tasks again for the rest of my week, so not sure if I'll get time to do more tweaking before the weekend. More than happy to pick this up again on Monday, though 🙂

@ciampo
Copy link
Contributor

ciampo commented Oct 8, 2021

This PR is already in a good place, I think we these latest changes we should be good to merge it!

I left a couple more comments (mostly related to JSDocs) and replied to the opened conversations.

Of course, no rush about working on this. I am also quite busy, so I may be a bit late with my reviews too.

@andrewserong andrewserong force-pushed the update/unit-control-component-refactor-to-typescript branch from 5febeeb to 71f7bf6 Compare October 12, 2021 06:48
@andrewserong
Copy link
Contributor Author

Thanks again for the review @ciampo, I've implemented nearly all of the feedback, but left a couple of comments where I intentionally left things out or wasn't quite sure which way to go. I've given this a rebase, too, to make sure it's still current, and it still seems to be working well for me in testing 🤞

Let me know if I've missed anything, and no rush at all on following up 🙂

@ciampo
Copy link
Contributor

ciampo commented Oct 12, 2021

Thank you @andrewserong! I replied and left a couple more comments, but at this point the work that is left is mostly about documentation. I think I should be able to approve this PR during the next round of feedback 🤞

@andrewserong
Copy link
Contributor Author

Thanks @ciampo! I've implemented this round of documentation feedback, let me know if you'd like any further tweaks, I'm happy to keep refining. Also, do feel free to commit any minor ones if there are little changes you'd like to get in quickly. Cheers!

@ciampo ciampo force-pushed the update/unit-control-component-refactor-to-typescript branch from d7d3d16 to 6ec8dfa Compare October 13, 2021 11:33
Copy link
Contributor

@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 @andrewserong! This has been a great, great effort from your side, and it's very appreciated. I feel like the UnitControl component has become much more robust with the latest changes that you made.

I've pushed one small commit and rebased on top of latest trunk. I also left one last item of feedback, but it's small change which doesn't prevent me from approving this PR 🚀

Feel free to merge after taking care of it!


In case you had capacity to keep working on this component, the next steps I can think of would be:

  • Refactoring the internal file names and folder structure (as advised in the guildelines)
  • Connecting the component to the Context System (should be a small change which I'm also happy to take care of with you as a reviewer)
  • Look a bit more into a couple of types that we had to add to the component. In particular:
    • The WPUnitControlUnitList type, which is currently either an array or false (as discussed here)
    • All of the string | undefined types associated to units (it would be great if we could simplify that a bit)

What do you think?

Comment on lines 110 to 113
/**
* Current value. To set a unit, provide a unit with a value through the `value` prop.
*/
value: string;
Copy link
Contributor

Choose a reason for hiding this comment

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

This should probably be Value, right?

In that case, we should also update the type in the README to be number | string.

Finally, I'm not sure I completely get the meaning of the comment "To set a unit, provide a unit with a value through the value prop." — maybe we should re-write it to clarify it?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good catch, yes, this should have been Value. I've updated the README and reworked the description to be clearer.

@andrewserong andrewserong merged commit 0160b7f into trunk Oct 14, 2021
@andrewserong andrewserong deleted the update/unit-control-component-refactor-to-typescript branch October 14, 2021 02:24
@github-actions github-actions bot added this to the Gutenberg 11.8 milestone Oct 14, 2021
@andrewserong
Copy link
Contributor Author

Excellent, thank you @ciampo, I've implemented that last suggestion of switching to the Value type, re-tested and have merged this in. Thanks again for all the back and forth!

In case you had capacity to keep working on this component, the next steps I can think of would be:

Those next steps sound good to me, too. I have a few other things to switch back to, but if there isn't too much urgency on these tasks, I'm happy to chip away at them over the coming weeks. (In case anyone else happens to read this and wants to pick any of these up sooner, feel free to, of course!)

Refactoring the internal file names and folder structure (as advised in the guildelines)

Just to double-check for this one, among other changes, this would mean moving the unit-select-control.tsx file into its own unit-select-control sub-folder, but we'd likely still have utils.ts in the root of the component?

@ciampo
Copy link
Contributor

ciampo commented Oct 14, 2021

I'm happy to chip away at them over the coming weeks. (In case anyone else happens to read this and wants to pick any of these up sooner, feel free to, of course!)

Sounds great!

Just to double-check for this one, among other changes, this would mean moving the unit-select-control.tsx file into its own unit-select-control sub-folder, but we'd likely still have utils.ts in the root of the component?

I would argue that sub-component folder structures should only be used for components that actually exported. Since, in the case of UnitControl, only one component is exported, I would say that UnitSelectControl is an internal implementation detail and doesn't need its separate subfolder.

This is the folder structure that I'd have in mind:

unit-control/
├── stories
│   └── index.js
├── test
│   ├── index.js
│   └── utils.js
├── component.tsx
├── hook.ts
├── index.ts
├── index.native.js
├── README.md
├── styles.ts
├── styles.native.scss
├── types.ts
└── unit-select-control.tsx
└── utils.ts

To get there, the main changes would be to:

  • take the contents of the current index.tsx and split them between:
    • hook.js (which exports a useUnitControl hook)
    • component.tsx (which exports the UnitControl component)
  • create a new index.ts file which re-exports both useUnitControl and UnitControl
  • rename styles/unit-control-styles.ts to styles.ts

For the split between hook and component, you can look at other components in this package as an example (and of course feel free to ping me early on in your PR if you need advice)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] UI Components Impacts or related to the UI component system [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