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

[RNMobile] Embed block - Link in Block Settings #36099

Merged
merged 32 commits into from
Nov 12, 2021

Conversation

jd-alexander
Copy link
Contributor

@jd-alexander jd-alexander commented Nov 1, 2021

Gutenberg-Mobile PR wordpress-mobile/gutenberg-mobile#4189

Description

This PR is ready for a first pass while some minor issues are investigated 🙇🏾

This PR introduces the Link in the Block Settings of each Embed block. Since the Link is now within the Block Settings component, we no longer need to display the Pencil icon ( Edit action) with the Toolbar, therefore this functionality was removed. To facilitate these changes, the embed-controls.js component that was shared between the web and mobile, was duplicated and modifications were made to the embed-controls.native.js variant to support the Block Settings and Toolbar behavior specific to mobile as described in the associated GB-Mobile ticket.

How has this been tested?

Add Embed block - bottom sheet functionality remains ✅

The main purpose of this test case is to ensure that the changes made here did not impact the existing functionality.

  1. Add an Embed block.
  2. The bottom sheet should auto-open and be focused.
  3. Add a link to the bottom sheet and dismiss it.
  4. Notice the Embed placeholder transforming to an Embed Preview.
Screen.Recording.2021-11-02.at.1.14.21.AM.mov

Edit Embed block - change the link in Block Settings ✅

  1. Using the steps above, create an Embed block and populate it with a preview.
  2. Click on the Gear/Settings icon.
  3. Notice the Link Settings within the Block Settings.
  4. Change the link and dismiss the bottom sheet.
  5. The Embed Preview content should be updated.
  6. Notice that the Pencil icon does not exist.
embed-block-edit-link.mp4

Edit Embed block - Invalid format link does not lead to validation error 🟢

  1. Using the steps above, create an Embed block and populate it with a preview.
  2. Click on the Gear/Settings icon.
  3. Notice the Link Settings within the Block Settings.
  4. Change the link to an invalid one and dismiss the bottom sheet (example: http://).
  5. The Embed Preview tries to load the content.
  6. Notice that the URL error notice is displayed.
  7. Since the Pencil icon is no longer present we are now left in a state where the link cannot be edited.

I think this occurs because the LinkPicker adds http:// to all entries hence the embed-bottomsheet logic believes the URL is true. I will investigate this further.

embed-block-edit-link-invalid.mp4

Edit Embed block - Invalid link 🟢

  1. Using the steps above, create an Embed block and populate it with a preview.
  2. Click on the Gear/Settings icon.
  3. Notice the Link Settings within the Block Settings.
  4. Change the link to an invalid one and dismiss the bottom sheet (example: https://example.com).
  5. The Embed Preview tries to load the content.
  6. Notice the block shows an error message about being unable to embed media.
  7. Click on "More options".
  8. Click on the "Edit link" option.
  9. Set a valid URL and dismiss the bottom sheet.
  10. The Embed Preview content should be updated.
embed-block-edit-link-retry.mp4

Types of changes

  1. A native EmbedControl was created.
  2. The Pencil - Edit icon was removed.
  3. A Link Picker is now used within the Block Settings to change the URL.

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

@jd-alexander jd-alexander 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 Nov 1, 2021
@github-actions
Copy link

github-actions bot commented Nov 1, 2021

Size Change: 0 B

Total Size: 1.09 MB

ℹ️ 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 139 kB
build/block-editor/style-rtl.css 14.5 kB
build/block-editor/style.css 14.5 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 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 291 B
build/block-library/blocks/buttons/editor.css 291 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 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 503 B
build/block-library/blocks/columns/style.css 502 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.18 kB
build/block-library/blocks/cover/style.css 1.18 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.62 kB
build/block-library/blocks/gallery/style.css 1.62 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 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/style-rtl.css 213 B
build/block-library/blocks/navigation-submenu/style.css 213 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.89 kB
build/block-library/blocks/navigation/editor.css 1.89 kB
build/block-library/blocks/navigation/style-rtl.css 1.55 kB
build/block-library/blocks/navigation/style.css 1.54 kB
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 172 B
build/block-library/blocks/page-list/style.css 172 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 347 B
build/block-library/blocks/post-comments-form/style.css 347 B
build/block-library/blocks/post-comments/style-rtl.css 492 B
build/block-library/blocks/post-comments/style.css 493 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/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 770 B
build/block-library/blocks/site-logo/editor.css 770 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 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 824 B
build/block-library/blocks/social-links/editor.css 823 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 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 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 569 B
build/block-library/blocks/video/editor.css 570 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 815 B
build/block-library/common.css 812 B
build/block-library/editor-rtl.css 9.84 kB
build/block-library/editor.css 9.85 kB
build/block-library/index.min.js 161 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.4 kB
build/block-library/style.css 10.4 kB
build/block-library/theme-rtl.css 668 B
build/block-library/theme.css 673 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/components/index.min.js 214 kB
build/components/style-rtl.css 15.3 kB
build/components/style.css 15.3 kB
build/compose/index.min.js 10.9 kB
build/core-data/index.min.js 13.2 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.42 kB
build/date/index.min.js 31.5 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 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.6 kB
build/edit-post/style-rtl.css 7.1 kB
build/edit-post/style.css 7.09 kB
build/edit-site/index.min.js 28.3 kB
build/edit-site/style-rtl.css 5.37 kB
build/edit-site/style.css 5.37 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.18 kB
build/edit-widgets/style.css 4.18 kB
build/editor/index.min.js 37.8 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.29 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.57 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.86 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/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.57 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

Comment on lines 265 to 277
bottomSheetLabel={ bottomSheetLabel }
url={ url }
onEmbedBottomSheetSubmit={ ( value ) => {
// The order of the following calls is important, we need to update the URL attribute before changing `isEditingURL`,
// otherwise the side-effect that potentially replaces the block when updating the local state won't use the new URL
// for creating the new block.
setAttributes( { url: value } );
setIsEditingURL( false );
} }
onEmbedBottomSheetClose={ () =>
setShowEmbedBottomSheet( false )
}
showEmbedBottomSheet={ showEmbedBottomSheet }
Copy link
Contributor Author

Choose a reason for hiding this comment

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

These props are similar to how the EmbedBottomSheet is used within this Component. Let me know if the logic sharing approach here is fine or if there's a more optimal way to do this.

Copy link
Contributor

Choose a reason for hiding this comment

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

Now that the visibility of EmbedBottomSheet component is controlled by EmbedControls, probably we could render EmbedBottomSheet within the EmbedControls component and only expose here a prop to notify when the URL is edited, wdyt?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@fluiddot I think that approach is fine. Do we want to link picking behavior to be the same for both adding and editing a link? I assume that would make the experience more optimal. However, I noticed that when adding a link the embed bottom sheet would accept the input directly but when editing a link as done here, there would be a picker for that link because that is the approach that I see being utilized in other Block Settings. So the question is do we utilize inline editing instead of a Picker for both experiences? I think doing this would allow the experience to be optimal. ( At first, I had tried this but I think how the attributes were being set was possibly causing an issue so I didn't pursue it)

Now when I think about it, I agree with the case where if we utilize a prop to notify when a URL is being edited then, only at that time would we need to render the link editing component within the BlockSettings PanelBody otherwise we return the bottom sheet. i.e a function that does something similar to the link settings logic below.

Copy link
Contributor

Choose a reason for hiding this comment

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

@fluiddot I think that approach is fine. Do we want to link picking behavior to be the same for both adding and editing a link? I assume that would make the experience more optimal. However, I noticed that when adding a link the embed bottom sheet would accept the input directly but when editing a link as done here, there would be a picker for that link because that is the approach that I see being utilized in other Block Settings. So the question is do we utilize inline editing instead of a Picker for both experiences? I think doing this would allow the experience to be optimal. ( At first, I had tried this but I think how the attributes were being set was possibly causing an issue so I didn't pursue it)

I think it makes sense to provide the same experience in both cases. I'd stick with the option where the user can edit directly the URL (as we're currently providing). The one that presents the picker can be confusing because it's related to linking the block to an URL, but in this case, we're editing the source of the embed.

Now when I think about it, I agree with the case where if we utilize a prop to notify when a URL is being edited then, only at that time would we need to render the link editing component within the BlockSettings PanelBody otherwise we return the bottom sheet. i.e a function that does something similar to the link settings logic below.

Yep, exactly. I hope this doesn't introduce undesired side effects but looks like a promising way to go 👍 . Let me know if I can help anyhow in the implementation 🙇 .

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I think it makes sense to provide the same experience in both cases. I'd stick with the option where the user can edit directly the URL (as we're currently providing). The one that presents the picker can be confusing because it's related to linking the block to an URL, but in this case, we're editing the source of the embed.

Agreed!

Yep, exactly. I hope this doesn't introduce undesired side effects but looks like a promising way to go 👍 . Let me know if I can help anyhow in the implementation 🙇 .

Thanks for confirming 🙇🏾 My goal was to take a look at it after I am done WPiOS testing efforts and crash monitoring. If you would want to do the refactor and it doesn't take much effort from your side I am more than happy to review the changes afterward in an effort to keep things moving.

Copy link
Contributor

Choose a reason for hiding this comment

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

Thanks for confirming 🙇🏾 My goal was to take a look at it after I am done WPiOS testing efforts and crash monitoring. If you would want to do the refactor and it doesn't take much effort from your side I am more than happy to review the changes afterward in an effort to keep things moving.

I'd like first to wrap up first the tests tasks but after that, I'll be more than happy to help with this implementation. I'll let you know if I start tackling it 👍 .

@jd-alexander jd-alexander changed the title [RNMobile] Embed block - Link to [RNMobile] Embed block - Link in Block Settings Nov 2, 2021
@jd-alexander jd-alexander requested a review from fluiddot November 2, 2021 07:01
@jd-alexander jd-alexander marked this pull request as ready for review November 2, 2021 07:02
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.

Thanks @jd-alexander for tackling this ❤️!

I've done a quick review and I'd like to propose a different approach where the EmbedBottomSheet would be rendered within the EmbedControls. I think it would be possible but I might be overlooking a potential blocker, let me know what you think, I'll be more than happy to help to land it 🙇 .

packages/react-native-editor/CHANGELOG.md Outdated Show resolved Hide resolved
Comment on lines 265 to 277
bottomSheetLabel={ bottomSheetLabel }
url={ url }
onEmbedBottomSheetSubmit={ ( value ) => {
// The order of the following calls is important, we need to update the URL attribute before changing `isEditingURL`,
// otherwise the side-effect that potentially replaces the block when updating the local state won't use the new URL
// for creating the new block.
setAttributes( { url: value } );
setIsEditingURL( false );
} }
onEmbedBottomSheetClose={ () =>
setShowEmbedBottomSheet( false )
}
showEmbedBottomSheet={ showEmbedBottomSheet }
Copy link
Contributor

Choose a reason for hiding this comment

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

Now that the visibility of EmbedBottomSheet component is controlled by EmbedControls, probably we could render EmbedBottomSheet within the EmbedControls component and only expose here a prop to notify when the URL is edited, wdyt?

@fluiddot
Copy link
Contributor

fluiddot commented Nov 2, 2021

@jd-alexander regarding the issue about the invalid links not leading to a validation error, what URLs did you use for testing? I recall I used the value http:// for this case as referenced in this PR because, as you commented, the LinkPicker component automatically adds the https:// prefix if not provided.

@jd-alexander
Copy link
Contributor Author

@jd-alexander regarding the issue about the invalid links not leading to a validation error, what URLs did you use for testing? I recall I used the value http:// for this case as referenced in this PR because, as you commented, the LinkPicker component automatically adds the https:// prefix if not provided.

For this particular case, I didn't use a URL, I had just typed in a random set of letters. However, this error only occurs when the hasPicker prop is passed. Since we are using the inline editing experience as confirmed in this comment then we won't encounter this issue as our existing implementation with the LinkSettingsNavigation within the EmbedBottomSheet works as expected.

@fluiddot
Copy link
Contributor

fluiddot commented Nov 3, 2021

For this particular case, I didn't use a URL, I had just typed in a random set of letters. However, this error only occurs when the hasPicker prop is passed. Since we are using the inline editing experience as confirmed in this comment then we won't encounter this issue as our existing implementation with the LinkSettingsNavigation within the EmbedBottomSheet works as expected.

Ok, I'm glad to know that it's not happening in the inline editing experience. In any case, it would be great to double-check this once we finish the implementation, thanks for clarifying it 🙇 .

@fluiddot fluiddot self-assigned this Nov 4, 2021
@fluiddot
Copy link
Contributor

fluiddot commented Nov 4, 2021

@jd-alexander I'm going to devote some time today to implement the approach we discussed in this comment.

# Conflicts:
#	packages/block-library/src/embed/embed-bottom-sheet.native.js
#	packages/react-native-editor/CHANGELOG.md
The EmbedBottomSheet component has been also renamed to EmbedLinkSettings because the component is no longer strictly tied to the bottom sheet component.
@fluiddot
Copy link
Contributor

fluiddot commented Nov 9, 2021

@jd-alexander Thank you very much for starting addressing the issues on the integration tests 🥇!

  1. I am faced with an issue I have been investigating so far.

This issue below is occurring when I try to utilize getByA11yLabel( Embed link, ${ initialURL }) to start editing the URL.

Expected 1 but found 2 instances with accessibilityLabel "Embed link, https://youtu.be/BAD_URL"

I utilized debug from the render to see the tree of the Views and I am seeing that two View instances have the label. I know that the primary view in question here is the TextControl

I see that both the TextControl and the underlying Cell are using the label. I am wondering if that may be related. I will take another look tomorrow but if you are able to have a look, that would be helpful. Thanks.

Right, there are two instances because the component EmbedLinkSettings is rendered in two places, the edit component (reference) to edit the URL upon block creation or when it's empty, and within the embed controls to edit the URL via the block settings (reference).

In this case, we can solve the issue by using the within function from the React Native testing library, which allows us to perform a query within an element. I went ahead and applied this change in e27ff9a.

  1. Within the tests, I am following the previous test behavior of waiting for the bottom sheet to become visible and also dismissing it. However, I am seeing where they are other tests in the codebase that do not close the bottom sheet after opening. Is it fine to keep this functionality within the tests that are utilizing the Block Settings?

In general, it shouldn't be necessary to wait for visibility changes in the bottom sheet, however in this case, as we use the dismiss action to perform editing the URL we need it.


Apart from introducing the use of within function for addressing the first issue, I also pushed the following changes to solve other issues I found out debugging further the tests:

  1. Update responsive not supported test case: With the changes in this PR, the block settings button is now always enabled, so this test case now checks if the Media settings panel is present depending on the responsive support.
  2. Expect for link field instead block settings button (4ae85dc, cc80690): I noticed some act warnings while testing produced by the set URL upon block insertion test cases, which I managed to fix by using a different expectation.
  3. Invalidate core-data store before each test: By only enabling some of the test cases, I realized that it was required to invalidate the entire core-data store to prevent caching the network requests made by the embed block. We were already invalidating the requests for fetching the embed previews but not the ones for the theme support. Here is the list of the test cases I disabled for testing this:
    1. displays cannot embed on the placeholder if preview data is null
    2. toggles resize for smaller devices media settings

@jd-alexander I think the PR is finally ready for a final review, let me know if you could take a look, thanks 🙇 .

@fluiddot
Copy link
Contributor

fluiddot commented Nov 9, 2021

I noticed that the Performance and End-to-End Tests are also failing in trunk, so failures aren't caused by the changes in this PR. Once the PR is ready to merge, we should review if the issues are addressed and update the PR with trunk, if not, we could consider skipping the failed tests and proceed with the merge.

@fluiddot
Copy link
Contributor

fluiddot commented Nov 9, 2021

@jd-alexander I updated the test cases described in the PR description due to the recent changes and added one for verifying that it allows editing the link after setting an invalid link.

Additionally, I added a couple of integration tests:

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 run all test cases and everything is working nice 🎊 , I only found a minor issue related to displaying the invalid URL error notice twice, here are the reproduction steps:

  1. Add an embed block.
  2. Set a valid URL.
  3. Open block settings.
  4. Change embed link to an invalid format URL (example: http://).
  5. Tap on the enter key on the keyboard instead of dismissing the bottom sheet.
  6. Observe that the Invalid URL. Please enter a valid URL. error message is displayed twice.
embed-block-edit-link-error-notice-duplicated.mp4

After debugging this issue, I noticed that the performOnCloseOperations handler is being called twice when editing the URL by tapping on the enter key. However, when dismissing the bottom sheet is only called once 🙃 .

@jd-alexander
Copy link
Contributor Author

jd-alexander commented Nov 11, 2021

I run all test cases and everything is working nice 🎊 , I only found a minor issue related to displaying the invalid URL error notice twice

Thanks for spotting this error @fluiddot I resolved this issue by storing if the bottom sheet's close event was consumed in an instance variable via useRef. 3255826

const onCloseSettingsSheetConsumed = useRef( false );

The reason this occurs is because onClose is triggered in these two locations within the LinkSettings component.

  1. onHandleClosingBottomSheet( onCloseSettingsSheet );

Let me know if this approach is optimal. Thank you 🙇🏾

@jd-alexander
Copy link
Contributor Author

@jd-alexander I updated the test cases described in the PR description due to the recent changes and added one for verifying that it allows editing the link after setting an invalid link.

Additionally, I added a couple of integration tests:

Thanks! The tests are looking good 👍🏾

@fluiddot
Copy link
Contributor

I run all test cases and everything is working nice 🎊 , I only found a minor issue related to displaying the invalid URL error notice twice

Thanks for spotting this error @fluiddot I resolved this issue by storing if the bottom sheet's close event was consumed in an instance variable via useRef. 3255826

const onCloseSettingsSheetConsumed = useRef( false );

The reason this occurs is because onClose is triggered in these two locations within the LinkSettings component.

  1. onHandleClosingBottomSheet( onCloseSettingsSheet );

Let me know if this approach is optimal. Thank you 🙇🏾

@jd-alexander thank you very much for addressing the issue ❤️ ! I've just reviewed the changes and provided a change suggestion in this comment.

@fluiddot
Copy link
Contributor

fluiddot commented Nov 12, 2021

I noticed that the CI check End-to-End Tests / Admin - 1 (pull_request) is failing with error:

FAIL packages/e2e-tests/specs/editor/blocks/image.test.js (71.564 s)
  ● Image › should replace, reset size, and keep selection

    expect(received).toBe(expected) // Object.is equality

    Expected: ""
    Received: "<!-- wp:image {\"id\":103,\"sizeSlug\":\"full\",\"linkDestination\":\"none\"} -->
    <figure class=\"wp-block-image size-full\"><img src=\"http://localhost:8889/wp-content/uploads/2021/11/ede1ce48-4ef8-4165-a74c-927833133aff.png\" alt=\"\" class=\"wp-image-103\"/></figure>
    <!-- /wp:image -->"

      108 | 		await page.keyboard.press( 'Backspace' );
      109 |
    > 110 | 		expect( await getEditedPostContent() ).toBe( '' );
          | 		                                       ^
      111 | 	} );
      112 |
      113 | 	it.skip( 'should place caret at end of caption after merging empty paragraph', async () => {

      at Object.<anonymous> (specs/editor/blocks/image.test.js:110:42)
          at runMicrotasks (<anonymous>)

However, this test is also failing in the commits in trunk branch (reference), so looks safe to merge this PR with that failure as it's not related to the changes of this PR.

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 🎊 ! Awesome work @jd-alexander 🥇 !

I've done the following test cases and verified that they passed 🟢 :

  • Add Embed block - bottom sheet functionality remains ✅
  • Edit Embed block - change the link in Block Settings ✅
  • Edit Embed block - Invalid format link does not lead to validation error ✅
  • Edit Embed block - Invalid link ✅

Tested in iPhone 12 Pro Max simulator (iOS 15.0) and Samsung Galaxy S20 FE 5G (Android 11).

@fluiddot
Copy link
Contributor

However, this test is also failing in the commits in trunk branch (reference), so looks safe to merge this PR with that failure as it's not related to the changes of this PR.

The End-to-End Tests / Admin - 1 (pull_request CI check is required so until it's fixed we can't merge the PR.

@fluiddot fluiddot merged commit 80db388 into trunk Nov 12, 2021
@fluiddot fluiddot deleted the rnmobile/embed-block-link-to branch November 12, 2021 15:24
@github-actions github-actions bot added this to the Gutenberg 12.0 milestone Nov 12, 2021
@jd-alexander
Copy link
Contributor Author

LGTM 🎊 ! Awesome work @jd-alexander 🥇 !

I've done the following test cases and verified that they passed 🟢 :

  • Add Embed block - bottom sheet functionality remains ✅
  • Edit Embed block - change the link in Block Settings ✅
  • Edit Embed block - Invalid format link does not lead to validation error ✅
  • Edit Embed block - Invalid link ✅

Tested in iPhone 12 Pro Max simulator (iOS 15.0) and Samsung Galaxy S20 FE 5G (Android 11).

Thanks for the review and tests @fluiddot 🙇🏾

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