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

Fixes color picker segmented control rendering and scrolling issues #30994

Merged
merged 7 commits into from
May 7, 2021

Conversation

antonis
Copy link
Member

@antonis antonis commented Apr 20, 2021

Fixes: #30878 and wordpress-mobile/gutenberg-mobile#3104

gutenberg-mobile: wordpress-mobile/gutenberg-mobile#3394
WordPress-Android: wordpress-mobile/WordPress-Android#14492
WordPress-iOS: wordpress-mobile/WordPress-iOS#16366

Description

This reverts #28740 falling back to the previous workaround for fixing the crash occurring when segments are changed quickly.
The applied solution is based on rearranging components which might not be optimal but does not cause the following two issues: #30878 and #3104.
The applied solution additionally adds a delay when scrolling to the end to counteract the segment selection delay.

How has this been tested?

Notes: The tests bellow should be performed with builds from the Android PR and iOS PR

Crash regression check

  1. Go to a post/page.
  2. Add Buttons block.
  3. Tap on the gear button.
  4. Tap on Background Color options.
  5. Switch several times between Solid and Gradient segments.
  6. Verify that the app does not crash

Custom gradient button is visible

  1. Go to a post/page
  2. Add Buttons block
  3. Tap on gear button
  4. Tap on Background color option
  5. Tap on Gradient option
  6. Tap one gradient color
  7. Tap on Customize Gradient
  8. Change Gradient Type to Radial (it also works changing other options)
  9. Tap on back arrow button
  10. Tap on Solid option
  11. Tap on Gradient option again
  12. Verify that the custom gradient button is shown and selected
  13. Verify that the scroll goes to the end where the custom gradient is shown

Color picker is not cropped

  1. Launch block editor on WPAndroid.
  2. Add a Button block.
  3. Open the Button block settings.
  4. Tap Background Color.
  5. Tap Gradient.
  6. Scroll to the end of the gradient list.
  7. Tap Solid.
  8. Verify that content is not cropped

Sanity testing test cases

Known issues:

  • TC005: When switching from a customized gradient to a built-in gradient, the Custom button does not "slide out" with a smooth animation

Types of changes

Bug fix (non-breaking change which fixes an issue)

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

@antonis antonis changed the title Revert "[RNMobile] SegmentedControls correction (#28740)" Fixes color picker segmented control rendering and scrolling issues Apr 20, 2021
@github-actions
Copy link

github-actions bot commented Apr 20, 2021

Size Change: 0 B

Total Size: 1.31 MB

ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.11 kB 0 B
build/annotations/index.js 2.93 kB 0 B
build/api-fetch/index.js 2.42 kB 0 B
build/autop/index.js 2.28 kB 0 B
build/blob/index.js 673 B 0 B
build/block-directory/index.js 6.6 kB 0 B
build/block-directory/style-rtl.css 993 B 0 B
build/block-directory/style.css 995 B 0 B
build/block-editor/index.js 116 kB 0 B
build/block-editor/style-rtl.css 13 kB 0 B
build/block-editor/style.css 13 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 515 B 0 B
build/block-library/blocks/button/style.css 515 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 B 0 B
build/block-library/blocks/buttons/style-rtl.css 368 B 0 B
build/block-library/blocks/buttons/style.css 368 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 422 B 0 B
build/block-library/blocks/columns/style.css 422 B 0 B
build/block-library/blocks/cover/editor-rtl.css 603 B 0 B
build/block-library/blocks/cover/editor.css 604 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB 0 B
build/block-library/blocks/cover/style.css 1.22 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/file/editor-rtl.css 301 B 0 B
build/block-library/blocks/file/editor.css 300 B 0 B
build/block-library/blocks/file/frontend.js 773 B 0 B
build/block-library/blocks/file/style-rtl.css 255 B 0 B
build/block-library/blocks/file/style.css 255 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 704 B 0 B
build/block-library/blocks/gallery/editor.css 705 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.06 kB 0 B
build/block-library/blocks/gallery/style.css 1.05 kB 0 B
build/block-library/blocks/group/editor-rtl.css 160 B 0 B
build/block-library/blocks/group/editor.css 160 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 476 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 281 B 0 B
build/block-library/blocks/latest-comments/style.css 282 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/legacy-widget/editor-rtl.css 557 B 0 B
build/block-library/blocks/legacy-widget/editor.css 557 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 176 B 0 B
build/block-library/blocks/media-text/editor.css 176 B 0 B
build/block-library/blocks/media-text/style-rtl.css 492 B 0 B
build/block-library/blocks/media-text/style.css 489 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 617 B 0 B
build/block-library/blocks/navigation-link/editor.css 619 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B 0 B
build/block-library/blocks/navigation-link/style.css 94 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.32 kB 0 B
build/block-library/blocks/navigation/editor.css 1.31 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 1.27 kB 0 B
build/block-library/blocks/navigation/style.css 1.27 kB 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 239 B 0 B
build/block-library/blocks/page-list/editor.css 240 B 0 B
build/block-library/blocks/page-list/style-rtl.css 167 B 0 B
build/block-library/blocks/page-list/style.css 167 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B 0 B
build/block-library/blocks/post-comments-form/style.css 140 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B 0 B
build/block-library/blocks/post-excerpt/style.css 69 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/post-title/style-rtl.css 60 B 0 B
build/block-library/blocks/post-title/style.css 60 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 103 B 0 B
build/block-library/blocks/preformatted/style.css 103 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 83 B 0 B
build/block-library/blocks/query-loop/editor.css 82 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/query/editor-rtl.css 131 B 0 B
build/block-library/blocks/query/editor.css 132 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 189 B 0 B
build/block-library/blocks/search/editor.css 189 B 0 B
build/block-library/blocks/search/style-rtl.css 359 B 0 B
build/block-library/blocks/search/style.css 362 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 251 B 0 B
build/block-library/blocks/separator/style.css 251 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 512 B 0 B
build/block-library/blocks/shortcode/editor.css 512 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 440 B 0 B
build/block-library/blocks/site-logo/editor.css 441 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 154 B 0 B
build/block-library/blocks/site-logo/style.css 154 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 796 B 0 B
build/block-library/blocks/social-links/editor.css 795 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB 0 B
build/block-library/blocks/social-links/style.css 1.33 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 308 B 0 B
build/block-library/blocks/spacer/editor.css 308 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 485 B 0 B
build/block-library/blocks/table/style.css 485 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 551 B 0 B
build/block-library/blocks/template-part/editor.css 550 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 569 B 0 B
build/block-library/blocks/video/editor.css 570 B 0 B
build/block-library/blocks/video/style-rtl.css 169 B 0 B
build/block-library/blocks/video/style.css 169 B 0 B
build/block-library/common-rtl.css 1.26 kB 0 B
build/block-library/common.css 1.26 kB 0 B
build/block-library/editor-rtl.css 9.62 kB 0 B
build/block-library/editor.css 9.61 kB 0 B
build/block-library/index.js 142 kB 0 B
build/block-library/reset-rtl.css 506 B 0 B
build/block-library/reset.css 507 B 0 B
build/block-library/style-rtl.css 9.45 kB 0 B
build/block-library/style.css 9.46 kB 0 B
build/block-library/theme-rtl.css 692 B 0 B
build/block-library/theme.css 693 B 0 B
build/block-serialization-default-parser/index.js 1.3 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/blocks/index.js 47 kB 0 B
build/components/index.js 186 kB 0 B
build/components/style-rtl.css 16.2 kB 0 B
build/components/style.css 16.2 kB 0 B
build/compose/index.js 9.96 kB 0 B
build/core-data/index.js 12.1 kB 0 B
build/customize-widgets/index.js 5.82 kB 0 B
build/customize-widgets/style-rtl.css 689 B 0 B
build/customize-widgets/style.css 690 B 0 B
build/data-controls/index.js 829 B 0 B
build/data/index.js 7.23 kB 0 B
build/date/index.js 31.8 kB 0 B
build/deprecated/index.js 738 B 0 B
build/dom-ready/index.js 576 B 0 B
build/dom/index.js 4.62 kB 0 B
build/edit-navigation/index.js 13.7 kB 0 B
build/edit-navigation/style-rtl.css 2.88 kB 0 B
build/edit-navigation/style.css 2.88 kB 0 B
build/edit-post/classic-rtl.css 454 B 0 B
build/edit-post/classic.css 454 B 0 B
build/edit-post/index.js 334 kB 0 B
build/edit-post/style-rtl.css 6.98 kB 0 B
build/edit-post/style.css 6.97 kB 0 B
build/edit-site/index.js 26.1 kB 0 B
build/edit-site/style-rtl.css 4.91 kB 0 B
build/edit-site/style.css 4.9 kB 0 B
build/edit-widgets/index.js 12.6 kB 0 B
build/edit-widgets/style-rtl.css 2.98 kB 0 B
build/edit-widgets/style.css 2.98 kB 0 B
build/editor/index.js 60.5 kB 0 B
build/editor/style-rtl.css 3.95 kB 0 B
build/editor/style.css 3.95 kB 0 B
build/element/index.js 3.44 kB 0 B
build/escape-html/index.js 739 B 0 B
build/format-library/index.js 5.68 kB 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 1.76 kB 0 B
build/html-entities/index.js 628 B 0 B
build/i18n/index.js 3.73 kB 0 B
build/is-shallow-equal/index.js 710 B 0 B
build/keyboard-shortcuts/index.js 1.65 kB 0 B
build/keycodes/index.js 1.43 kB 0 B
build/list-reusable-blocks/index.js 2.06 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/media-utils/index.js 3.08 kB 0 B
build/notices/index.js 1.07 kB 0 B
build/nux/index.js 2.3 kB 0 B
build/nux/style-rtl.css 718 B 0 B
build/nux/style.css 716 B 0 B
build/plugins/index.js 2 kB 0 B
build/primitives/index.js 1.03 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/react-i18n/index.js 924 B 0 B
build/redux-routine/index.js 2.82 kB 0 B
build/reusable-blocks/index.js 2.56 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/rich-text/index.js 11.9 kB 0 B
build/server-side-render/index.js 1.64 kB 0 B
build/shortcode/index.js 1.68 kB 0 B
build/token-list/index.js 847 B 0 B
build/url/index.js 1.95 kB 0 B
build/viewport/index.js 1.28 kB 0 B
build/warning/index.js 1.13 kB 0 B
build/widgets/index.js 1.68 kB 0 B
build/wordcount/index.js 1.24 kB 0 B

compressed-size-action

@antonis antonis marked this pull request as ready for review April 20, 2021 11:06
@antonis antonis requested review from dcalhoun, fluiddot and geriux April 20, 2021 11:08
@antonis antonis self-assigned this Apr 20, 2021
@antonis antonis added the [Type] Bug An existing feature does not function as intended label Apr 20, 2021
Copy link
Member

@dcalhoun dcalhoun left a comment

Choose a reason for hiding this comment

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

I encountered two issues while testing these changes on a Samsung Galaxy S20.

First, selecting a custom color and toggling the segment resulted in the horizontal color list to be incorrectly scrolled. One can merely swipe to "recover" the scrollable list, but it does create an odd looking state.

Custom color segment overflow

Screenshot_20210420-224139_WordPress Pre-Alpha

Screen_Recording_20210420-224225_WordPress.Pre-Alpha.mp4

Second, when switching from a customized gradient to a built-in gradient, the Custom button does not "slide out" with an animation. This is likely not a big issue, but it is included in the TC005 color settings test case expectation, so I wanted to draw attention to it.

Custom gradient button animation
Screen_Recording_20210420-234416_WordPress.Pre-Alpha.mp4

Comment on lines -86 to -90
}, [
shouldShowCustomIndicatorOption,
isGradientSegment,
isCustomGradientColor,
] );
Copy link
Member

Choose a reason for hiding this comment

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

I think reverting #28740 is likely a fine approach, but I am curious as to why it was not working.

I haven't explored it fully, but I wonder if the dependency array is not inclusive enough. It included isCustomGradientColor, but that value is computed with isSelectedCustom, which relies upon the values activeColor, colors, isGradientSegment, and isGradientColor.

I would think React would appropriately "watch" for changes to all those sub-dependencies of isSelectedCustom, but I wonder if maybe that is not occurring. Maybe we need to declare all of those values as dependencies for this hook?

Copy link
Member Author

Choose a reason for hiding this comment

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

Thank you for your feedback and reviewing this so quickly @dcalhoun 🙇
I was able to reproduce both the reported issues.

Maybe we need to declare all of those values as dependencies for this hook?

I will revisit this with this approach and report back 👍

Copy link
Member Author

Choose a reason for hiding this comment

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

Hey @dcalhoun 👋
Thank you once more for the tip on this. Passing all the values and doing the calculation within the hook (85ff940) only fixes the disappearing custom gradient and not the original issue. Tbh I'm still a bit confused on why this happens only only compiled builds. I'll continue the investigation and get back 😕

Copy link
Member

@dcalhoun dcalhoun Apr 21, 2021

Choose a reason for hiding this comment

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

Interesting. #30878 seems like either a style issue (i.e. some flex styles are conflicting or causing rendering issues), a calculation issue (i.e. there is somewhere else where we do not always re-calculate when we should), or a race condition (e.g. a computation occurs during layout and finishes at different times).

I might start by placing "debug styles" on each element to see which element is the offending item "cutting off" the children. Specifically, I know ScrollView contains multiple elements, a container and a content container. Which one is rendering too skinny?

Relatedly, the broken scroll-to-end for custom colors/gradients (wordpress-mobile/gutenberg-mobile#3104) is likely caused by the same issue where we compute the status within the hook, but do not have a dependency declared on the sub-dependency values.

useEffect( () => {
if ( scrollViewRef.current ) {
if ( isSelectedCustom() ) {
scrollViewRef.current.scrollToEnd();
} else {
scrollViewRef.current.scrollTo( { x: 0, y: 0 } );
}
}
}, [ currentSegment ] );

Applying a similar change as 85ff940 would likely resolve the scroll issue.

@antonis antonis marked this pull request as draft April 22, 2021 14:35
@antonis antonis force-pushed the rnmobile/30878-colorpicker branch from d8156c1 to a18a140 Compare April 23, 2021 11:01
@antonis antonis marked this pull request as ready for review April 23, 2021 12:00
@antonis antonis requested a review from dcalhoun April 23, 2021 12:06
Copy link
Member

@dcalhoun dcalhoun left a comment

Choose a reason for hiding this comment

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

I noticed a few issues on Android in my testing.

First, often times when a Custom gradient is not enabled, the space remains for the Custom gradient to display. So, there is a gap at the end of the gradient list.

Screenshot: Custom gradient space android-segment-gap
Screen_Recording_20210423-210413_WordPress.Pre-Alpha.mp4

Second, when switching between the two segments, there is often a "jump" in the animation. I would imagine this may be related to the delay added to setting the scroll position. The UI is still functional, but the transition isn't the smoothest.

Screenshot: Segment animation jump
Screen_Recording_20210423-210011_WordPress.Pre-Alpha.mp4

For iOS, I wanted to point out conflicting statements in this PR's description where it claims to fix wordpress-mobile/gutenberg-mobile#3104, but then lists it as a "known issue." That issue is not necessarily directly related to #30878, so I understand if we do not want to address it in this PR, but we should be clear about what is included within the description.

Fixes: #30878 and wordpress-mobile/gutenberg-mobile#3104

The disappearing custom gradient persists on iOS release builds and is further investigated.

Comment on lines 101 to 103
const delayedScroll = setTimeout( () => {
resetScrollPosition();
}, SEGMENTED_CONTROL_ANIMATION_DURATION_DELAY );
Copy link
Member

Choose a reason for hiding this comment

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

What is the delayed scroll addressing?

Copy link
Member Author

Choose a reason for hiding this comment

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

Thank you once more for the feedback @dcalhoun 🙇
My understanding is that the scrolling doesn't complete because when the value of currentSegment changes there is an extra delay before the selected segment ScrollView is rendered due to the SegmentedControl animation. Thus the scrolling occurs on the old segment selection.
I tried various approaches (e.g. using useLayoutEffect instead of useEffect) and tweaking SegmentedControl implementation but nothing did the trick :(
I understand that this is more of a hack and not a proper solution. Any suggestions or hints on better approaches are more than welcome.

Copy link
Member

@dcalhoun dcalhoun Apr 23, 2021

Choose a reason for hiding this comment

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

Ah, OK. I see. If that is the case, my recommendation would be to rely upon the pre-existing ANIMATION_DURATION constant. To me, that would communicate much clearer what the function is waiting on. Additionally, I do not believe we need the inline anonymous function. We could likely reference pass resetScrollPosition directly.

const delayedScroll = setTimeout( resetScrollPosition, ANIMATION_DURATION );

That said, I suppose setting a delay is an alternative approach to "track the contentWidth and scroll when it changes" that was removed, correct? Did you find that original approach was causing issues?

Copy link
Member Author

Choose a reason for hiding this comment

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

Thank you for your feedback David 🙇

Ah, OK. I see. If that is the case, my recommendation would be to rely upon the pre-existing ANIMATION_DURATION constant. To me, that would communicate much clearer what the function is waiting on. Additionally, I do not believe we need the inline anonymous function. We could likely reference pass resetScrollPosition directly.

Great points. Updated with cc018b7

That said, I suppose setting a delay is an alternative approach to "track the contentWidth and scroll when it changes" that was removed, correct? Did you find that original approach was causing issues?

The original approach was not causing the issue but did not help in solving it either. The content size changes still set the scroll position directly. I found that tracking the contentWidth was not necessary since it was actually used only on Android and the workaround seemed to have no actual effect any longer.

Copy link
Member Author

Choose a reason for hiding this comment

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

Hey @dcalhoun 👋
I updated the PR and added some extra notes on the known issues. Both the original issues are now resolved (
#30878 and wordpress-mobile/gutenberg-mobile#3104) and the missing custom gradient button is now back on both platforms.

@antonis antonis force-pushed the rnmobile/30878-colorpicker branch 2 times, most recently from e25ab69 to cc018b7 Compare April 26, 2021 14:46
@antonis antonis requested a review from dcalhoun April 27, 2021 11:06
Copy link
Member

@dcalhoun dcalhoun left a comment

Choose a reason for hiding this comment

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

I tested the latest builds. Overall things are operating well. The two original issues no longer occur. However, there do appear to be lingering issues. I will attempt to make time to investigate further, but I wanted to share what I have noticed sooner rather than later.

Priority Issue Reference Thoughts
🔴 Android Colors unscrollable New Sporadically the Colors segment will not be scrollable. I haven't been able to pin down why it occurs at this point, but often times it shows up when I switch segments a lot.
🟡 Empty Custom gradient space #30994 (review) Sporadically there is an empty space where a Custom gradient button would appear if it were enabled.
🟡 Segment animation jump #30994 (review) I understand if we do not want to spend time smoothing the animation now, but we may want to create a new issue for it.
🟡 Custom gradient button animation #30994 (review) Another transition, which we could postpone fixing, but it is referenced in the test cases, so we should likely update the test case with a new issue.

@antonis
Copy link
Member Author

antonis commented Apr 29, 2021

I tested the latest builds. Overall things are operating well. The two original issues no longer occur. However, there do appear to be lingering issues. I will attempt to make time to investigate further, but I wanted to share what I have noticed sooner rather than later.

Thank you for thoroughly testing this @dcalhoun 🙇 I haven't been able to reproduce the 1st issue yet. I will check this and report back.

@antonis antonis force-pushed the rnmobile/30878-colorpicker branch from 509588e to 9094f38 Compare May 6, 2021 12:46
@antonis
Copy link
Member Author

antonis commented May 6, 2021

Hey @dcalhoun 👋

I haven't been able to reproduce the 1st issue yet. I will check this and report back.

I was able to reproduce the reported unscrollable colors issue on an older Pixel device but unfortunately wasn't able to find a solution to this.

Thus after several failed attempts I retracted to the initial solution of reverting #28740 and adding a delay to solve the Custom color segment overflow issue.
I've tested:

  • APK from the Android PR on a Pixel 2 XL and a Pixel 5 with Android 11
  • Appcenter build 47260 from the iOS PR on an iPhone SE 2020 with iOS 14.4.1

The only issue that persisted on my tests was the smooth slide out animation when deselecting a custom gradient(TC005). For this we can create a new issue and reference it in the test case till it is resolved. Wdyt?

@antonis antonis requested a review from dcalhoun May 6, 2021 13:11
@dcalhoun
Copy link
Member

dcalhoun commented May 6, 2021

I was able to reproduce the reported unscrollable colors issue on an older Pixel device but unfortunately wasn't able to find a solution to this.

Thus after several failed attempts I retracted to the initial solution of reverting #28740 and adding a delay to solve the Custom color segment overflow issue.

I think the reversion makes since at this point. Thank you for exploring all the options.

The only issue that persisted on my tests was the smooth slide out animation when deselecting a custom gradient(TC005). For this we can create a new issue and reference it in the test case till it is resolved. Wdyt?

Agreed. Moving forward with the fix we have in place seems like the best approach. We can create a new issue for the remain bug and update the test case with a reference.

Copy link
Member

@dcalhoun dcalhoun left a comment

Choose a reason for hiding this comment

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

LGTM. 🎉 Tested this on an iPhone SE and Samsung Galaxy S20.

@antonis
Copy link
Member Author

antonis commented May 7, 2021

Thank you for patiently reviewing all my approaches @dcalhoun. I really appreciate this 🙇

We can create a new issue for the remain bug and update the test case with a reference.

I created an issue for this and updated the test case.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants