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

[Mobile] - RichText - Use parsed font size values when comparing new changes #37951

Merged
merged 5 commits into from
Jan 14, 2022

Conversation

geriux
Copy link
Member

@geriux geriux commented Jan 13, 2022

Description

This PR fixes a bug within RichText, where in some cases it would generate a render loop when setting a new font-size value and this didn't match the parsed value.

With this change it'll parse the currentFontSizeStyle and prevFontSizeStyle before comparing values to update the state. As well as not using the font size value from its props if there's a font size provided from the styles.

Note: The font size picker is behind the __DEV__ flag so it'll only show up with metro running for block-based themes. But it will render the font-size value correctly for both default and block-based themes.

How has this been tested?

Test case 1

  • Open the app
  • Switch to the HTML mode
  • Set this content
<!-- wp:paragraph {"style":{"color":{"text":"#fcb900"},"typography":{"fontSize":35.56}}} -->
<p class="has-text-color" style="color:#fcb900;font-size:35.56px">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed imperdiet ut nibh vitae ornare. Sed auctor nec augue at blandit.</p>
<!-- /wp:paragraph -->
  • Go back to the visual mode
  • Expect the Paragraph block to show correctly.

Test case 2

Precondition: Using a block-based theme.

  • Open the WordPress app
  • Start a new post
  • Within the Paragraph block type some text
  • Open the block settings
  • Change the font size using the font size picker
  • Expect to see the new selected font size.

Test case 3

Precondition: Using a block-based theme.

  • Open the WordPress app
  • Start a new post
  • Add a Heading block and type some text
  • Change between different heading levels and expect the size to change correctly
  • Change the font size using the font picker and expect the size to change correctly

Screenshots

Test case 1 Test case 2 Test case 3

Types of changes

Bug fix

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).
  • I've updated related schemas if appropriate.

…anges to avoid not matching values that generate a render loop
@geriux geriux added the Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change) label Jan 13, 2022
@github-actions
Copy link

github-actions bot commented Jan 13, 2022

Size Change: +674 B (0%)

Total Size: 1.13 MB

Filename Size Change
build/block-editor/style-rtl.css 14.6 kB +1 B (0%)
build/block-editor/style.css 14.6 kB +1 B (0%)
build/block-library/index.min.js 165 kB +158 B (0%)
build/components/index.min.js 214 kB +1 B (0%)
build/components/style-rtl.css 15.5 kB -8 B (0%)
build/components/style.css 15.5 kB -8 B (0%)
build/edit-site/index.min.js 37.8 kB +524 B (+1%)
build/editor/index.min.js 38.3 kB +5 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 960 B
build/admin-manifest/index.min.js 1.1 kB
build/annotations/index.min.js 2.75 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.28 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 140 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 470 B
build/block-library/blocks/button/editor.css 470 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 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 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-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/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB
build/block-library/blocks/cover/style.css 1.22 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 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 965 B
build/block-library/blocks/gallery/editor.css 967 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.6 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 810 B
build/block-library/blocks/image/editor.css 809 B
build/block-library/blocks/image/style-rtl.css 507 B
build/block-library/blocks/image/style.css 511 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 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 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.93 kB
build/block-library/blocks/navigation/editor.css 1.94 kB
build/block-library/blocks/navigation/style-rtl.css 1.83 kB
build/block-library/blocks/navigation/style.css 1.82 kB
build/block-library/blocks/navigation/view.min.js 2.82 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 401 B
build/block-library/blocks/page-list/editor.css 402 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 305 B
build/block-library/blocks/post-template/style.css 305 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 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 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 245 B
build/block-library/blocks/separator/style.css 245 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 670 B
build/block-library/blocks/social-links/editor.css 669 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 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 214 B
build/block-library/blocks/tag-cloud/style.css 215 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 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 908 B
build/block-library/common.css 905 B
build/block-library/editor-rtl.css 10 kB
build/block-library/editor.css 10 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.8 kB
build/block-library/style.css 10.8 kB
build/block-library/theme-rtl.css 672 B
build/block-library/theme.css 676 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 46.3 kB
build/compose/index.min.js 11.2 kB
build/core-data/index.min.js 13.3 kB
build/customize-widgets/index.min.js 11.4 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 631 B
build/data/index.min.js 7.49 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 485 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.5 kB
build/edit-navigation/index.min.js 16 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.6 kB
build/edit-post/style-rtl.css 7.16 kB
build/edit-post/style.css 7.16 kB
build/edit-site/style-rtl.css 6.83 kB
build/edit-site/style.css 6.82 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.17 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.7 kB
build/element/index.min.js 3.29 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.58 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.63 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.71 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.8 kB
build/keycodes/index.min.js 1.39 kB
build/list-reusable-blocks/index.min.js 1.72 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 925 B
build/nux/index.min.js 2.08 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.84 kB
build/primitives/index.min.js 924 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 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.65 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11 kB
build/server-side-render/index.min.js 1.58 kB
build/shortcode/index.min.js 1.49 kB
build/token-list/index.min.js 639 B
build/url/index.min.js 1.9 kB
build/viewport/index.min.js 1.05 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.15 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

@geriux geriux requested review from antonis and fluiddot January 13, 2022 17:07
@geriux geriux marked this pull request as ready for review January 13, 2022 17:07
Copy link
Contributor

@fluiddot fluiddot 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 added locally a test case to the integration test for the RichText component (reference) for checking the issue and I managed to reproduce the infinite loop issue:

it( 'should update the font size with provided style', () => {
	// Arrange
	const fontSize = '10';
	const style = { fontSize: '12' };
	// Act
	const screen = render( <RichText fontSize={ fontSize } /> );
	screen.update(
		<RichText fontSize={ fontSize } style={ style } />
	);
	// Assert
	expect( screen.toJSON() ).toMatchSnapshot();
} );

I tested a different flow where the font size could be updated when the style prop with a fontSize property is passed once the component is already mounted, not sure if this case is possible but I bumped into the same loop issue:

Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.

@geriux
Copy link
Member Author

geriux commented Jan 14, 2022

I tested a different flow where the font size could be updated when the style prop with a fontSize property is passed once the component is already mounted, not sure if this case is possible but I bumped into the same loop issue:

Thank you @fluiddot! I'll check it out! 🙇

@fluiddot
Copy link
Contributor

fluiddot commented Jan 14, 2022

I tested a different flow where the font size could be updated when the style prop with a fontSize property is passed once the component is already mounted, not sure if this case is possible but I bumped into the same loop issue:

Thank you @fluiddot! I'll check it out! 🙇

I was also wondering if we could cover the test case you described checking the following HTML via an integration test:

<!-- wp:paragraph {"style":{"color":{"text":"#fcb900"},"typography":{"fontSize":35.56}}} -->
<p class="has-text-color" style="color:#fcb900;font-size:35.56px">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed imperdiet ut nibh vitae ornare. Sed auctor nec augue at blandit.</p>
<!-- /wp:paragraph -->

I could help with that in case you think it's worth it 🙇 .

@fluiddot
Copy link
Contributor

I tested a different flow where the font size could be updated when the style prop with a fontSize property is passed once the component is already mounted, not sure if this case is possible but I bumped into the same loop issue:

Thank you @fluiddot! I'll check it out! 🙇

I was also wondering if we could cover the test case you described checking the following HTML via an integration test:

<!-- wp:paragraph {"style":{"color":{"text":"#fcb900"},"typography":{"fontSize":35.56}}} -->
<p class="has-text-color" style="color:#fcb900;font-size:35.56px">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed imperdiet ut nibh vitae ornare. Sed auctor nec augue at blandit.</p>
<!-- /wp:paragraph -->

I could help with that in case you think it's worth it 🙇 .

In case it helps, here is a diff patch that adds a couple of test cases:

Click here to show diff patch
diff --git a/packages/rich-text/src/test/__snapshots__/index.native.js.snap b/packages/rich-text/src/test/__snapshots__/index.native.js.snap
new file mode 100644
index 0000000000000000000000000000000000000000..eb684a9a01299ba4eb9f435fd81bb6654b8c6b0a
--- /dev/null
+++ b/packages/rich-text/src/test/__snapshots__/index.native.js.snap
@@ -0,0 +1,7 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`<RichText/> Font Size renders component with style and font size 1`] = `
+"<!-- wp:paragraph {\\"style\\":{\\"color\\":{\\"text\\":\\"#fcb900\\"},\\"typography\\":{\\"fontSize\\":35.56}}} -->
+<p class=\\"has-text-color\\" style=\\"color:#fcb900;font-size:35.56px\\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed imperdiet ut nibh vitae ornare. Sed auctor nec augue at blandit.</p>
+<!-- /wp:paragraph -->"
+`;
diff --git a/packages/rich-text/src/test/index.native.js b/packages/rich-text/src/test/index.native.js
index b48d8828326494e3acebd8a944cc6471f4dfc030..a6ce5a233fb3e55d4ca1a911934a2867834eee66 100644
--- a/packages/rich-text/src/test/index.native.js
+++ b/packages/rich-text/src/test/index.native.js
@@ -1,17 +1,27 @@
-jest.mock( '@wordpress/data/src/components/use-select' );
 /**
  * External dependencies
  */
 import { Dimensions } from 'react-native';
-import { render } from 'test/helpers';
+import { getEditorHtml, render, initializeEditor } from 'test/helpers';
+
 /**
  * WordPress dependencies
  */
-import { useSelect } from '@wordpress/data';
+import { select } from '@wordpress/data';
+import { store as blockEditorStore } from '@wordpress/block-editor';
+import { coreBlocks, registerBlock } from '@wordpress/block-library';
+import {
+	getBlockTypes,
+	setDefaultBlockName,
+	unregisterBlockType,
+} from '@wordpress/blocks';
+import '@wordpress/jest-console';
+
 /**
  * Internal dependencies
  */
 import RichText from '../component/index.native';
+import { store as richTextStore } from '../store';
 
 /**
  * Mock `useSelect` with various global application settings, e.g., styles.
@@ -25,16 +35,13 @@ const mockGlobalSettings = (
 	const DEFAULT_GLOBAL_STYLES = {
 		__experimentalGlobalStylesBaseStyles: { typography: { fontSize } },
 	};
-	const selectMock = {
-		getFormatTypes: jest.fn().mockReturnValue( [] ),
-		getBlockParents: jest.fn(),
-		getBlock: jest.fn(),
-		getSettings: jest.fn().mockReturnValue( DEFAULT_GLOBAL_STYLES ),
-	};
 
-	useSelect.mockImplementation( ( callback ) => {
-		return callback( () => selectMock );
-	} );
+	jest.spyOn( select( blockEditorStore ), 'getSettings' ).mockReturnValue(
+		DEFAULT_GLOBAL_STYLES
+	);
+	jest.spyOn( select( richTextStore ), 'getFormatTypes' ).mockReturnValue(
+		[]
+	);
 };
 
 describe( '<RichText/>', () => {
@@ -51,6 +58,13 @@ describe( '<RichText/>', () => {
 		[ '1.42vh', 19 ],
 	];
 
+	beforeAll( () => {
+		// Register Paragraph block
+		const paragraph = coreBlocks[ 'core/paragraph' ];
+		registerBlock( paragraph );
+		setDefaultBlockName( paragraph.name );
+	} );
+
 	beforeEach( () => {
 		mockGlobalSettings( {} );
 	} );
@@ -59,6 +73,13 @@ describe( '<RichText/>', () => {
 		Dimensions.set( { window } );
 	} );
 
+	afterAll( () => {
+		// Clean up registered blocks
+		getBlockTypes().forEach( ( block ) => {
+			unregisterBlockType( block.name );
+		} );
+	} );
+
 	describe( 'Font Size', () => {
 		it( 'should display rich text at the DEFAULT font size.', () => {
 			// Arrange
@@ -193,5 +214,27 @@ describe( '<RichText/>', () => {
 			const actualFontSize = getByA11yLabel( 'editor' ).props.fontSize;
 			expect( actualFontSize ).toBe( expectedFontSize );
 		} );
+
+		it( 'should update the font size when style prop with font size property is provided', () => {
+			// Arrange
+			const fontSize = '10';
+			const style = { fontSize: '12' };
+			// Act
+			const screen = render( <RichText fontSize={ fontSize } /> );
+			screen.update( <RichText fontSize={ fontSize } style={ style } /> );
+			// Assert
+			expect( screen.toJSON() ).toMatchSnapshot();
+		} );
+
+		it( 'renders component with style and font size', async () => {
+			// Arrange
+			const initialHtml = `<!-- wp:paragraph {"style":{"color":{"text":"#fcb900"},"typography":{"fontSize":35.56}}} -->
+			<p class="has-text-color" style="color:#fcb900;font-size:35.56px">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed imperdiet ut nibh vitae ornare. Sed auctor nec augue at blandit.</p>
+			<!-- /wp:paragraph -->`;
+			// Act
+			await initializeEditor( { initialHtml } );
+			// Assert
+			expect( getEditorHtml() ).toMatchSnapshot();
+		} );
 	} );
 } );

Note that I changed the way the store selectors are mocked, instead of mocking the entire useSelect I only mocked the selectors used in the component. This is required for rendering the editor, as it uses several selectors which doesn't make sense to mock them in the test only for this purpose.

@geriux
Copy link
Member Author

geriux commented Jan 14, 2022

In case it helps, here is a diff patch that adds a couple of test cases:

Awesome! Thanks for the diff Carlos, I'll apply that and remove the E2E test 👍

@geriux geriux requested review from fluiddot and removed request for cameronvoell and ellatrix January 14, 2022 12:36
@geriux
Copy link
Member Author

geriux commented Jan 14, 2022

@fluiddot Thank you for the suggestions, I've updated the code and PR descripton. This is ready for another review whenever you have some time 🙇

Copy link
Contributor

@fluiddot fluiddot left a comment

Choose a reason for hiding this comment

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

LGTM 🎊

I performed tests on both platforms for covering the three described tests cases, all of them passed ✅ .

However, I spotted a couple of issues when testing on Android that I think they're not related to this change, as it works on iOS, but that are worth it to share:

Text overlaps on H1 headings

How to reproduce it:

  1. Add a Heading block.
  2. Set H1 level.
  3. Type a text long enough for being displayed in two or more lines.
  4. Observe that part of the text is overlapped.

Specified font size is not preserved when changing heading level

I verified that the behavior on both web and iOS when setting a font size is that changing the heading level doesn't modify the size. However, on Android, this is working differently (see attached video capture).

android-heading-font-size.mp4

Tested on Samsung Galaxy S20 FE 5G (Android 10) and Simulator - iPhone 12 Pro Max (iOS 15.0).

@geriux
Copy link
Member Author

geriux commented Jan 14, 2022

Thank you for testing and reviewing! 🎉

I'll investigate those Android issues regarding the line height and the Heading block to make sure those are fixed before releasing it to production 👍

@geriux geriux merged commit e7eb6d8 into trunk Jan 14, 2022
@geriux geriux deleted the rnmobile/fix/font-size-loop branch January 14, 2022 14:07
@github-actions github-actions bot added this to the Gutenberg 12.5 milestone Jan 14, 2022
mkevins pushed a commit that referenced this pull request Jan 17, 2022
…changes (#37951)

* Mobile - RichText - Use parsed font size values when comparing new changes to avoid not matching values that generate a render loop

* Mobile - E2E - Move typography test to full tests instead of canary

* Mobile - RichText - Avoid using the fontSize value from the props if there's a font size set from the styles

* Mobile - E2E - Remove test and move some test cases into the current integration tests

* Mobile - RichTest - Update tests
@gziolo gziolo mentioned this pull request Jan 18, 2022
7 tasks
mkevins added a commit that referenced this pull request Jan 19, 2022
* Release script: Update react-native-editor version to 1.69.0

* Release script: Update with changes from 'npm run core preios'

* Update native editor changelog for v1.69.0

* Release script: Update react-native-editor version to 1.69.1

* Release script: Update with changes from 'npm run core preios'

* Mobile - Gallery block - Fix issue migrating old format and missing fixedHeight context, use of images prop instead of the attributes (#37889)

* [Mobile] - RichText - Use parsed font size values when comparing new changes (#37951)

* Mobile - RichText - Use parsed font size values when comparing new changes to avoid not matching values that generate a render loop

* Mobile - E2E - Move typography test to full tests instead of canary

* Mobile - RichText - Avoid using the fontSize value from the props if there's a font size set from the styles

* Mobile - E2E - Remove test and move some test cases into the current integration tests

* Mobile - RichTest - Update tests

* Fix LinkPicker freeze when virtual keyboard is hidden (#37782)

* Fix LinkPicker freeze when virtual keyboard is hidden

When a devices virtual keyboard is hidden, e.g. when a hardware
keyboard is connected, dismissing the `LinkPicker` resulted in the
application freezing. The freeze likely originates from an unconsumed
`LayoutAnimation` registered during resizing of the `BottomSheet`.

To address this issue, we now avoid registering a `LayoutAnimation`
whenever the changes to the header are sub-pixel values, which can
result in the `LayoutAnimation` going unconsumed. https://git.io/J9q2G

Long-term, we should likely consider refactoring the `BottomSheet` to
holistically avoid stacking `LayoutAnimations`: https://git.io/J9q2l

* Support unique BottomSheet header testID

This allows individual tests to pass a unique, top-level testID for the BottomSheet and have it propagate to the header as well, which may make querying easier.

Co-authored-by: Carlos Garcia <fluiddot@gmail.com>

* Fix indentation issue in bottom sheet component

* Add change log entry

* Add pull request reference to change log entry

Co-authored-by: Carlos Garcia <fluiddot@gmail.com>

* Update release notes

* Add back missing dep in package-lock

Co-authored-by: Gerardo Pacheco <gerardo.pacheco@automattic.com>
Co-authored-by: David Calhoun <438664+dcalhoun@users.noreply.github.com>
Co-authored-by: Carlos Garcia <fluiddot@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants