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

New block: Link Preview #47765

Open
wants to merge 9 commits into
base: trunk
Choose a base branch
from
Open

New block: Link Preview #47765

wants to merge 9 commits into from

Conversation

ellatrix
Copy link
Member

@ellatrix ellatrix commented Feb 5, 2023

What?

Adds a new block for previewing links. This could be done as a fallback for embeds, but I think this deserves to be its own block and I don't want to add complexity to the embed block and endpoints (my first attempt at this involved adding it to the embed API and block). We could add a button to convert to a link preview block if embedding fails.

This still needs some design work, and for some reason the stylesheet is not loading on the front end.

Screenshot 2023-02-05 at 23 25 16

Why?

I've been missing this feature. I'd love it if we could automatically create this block when pasting a link on an empty line, but we need to see how this works with the embed block.

How?

Uses the existing url-details endpoint. Is might be that we need to improve this, I don't know how good it is. Currently it's only used to preview links in the link editing UI.

Testing Instructions

Create a link preview block and submit any URL.

Testing Instructions for Keyboard

Screenshots or screencast

@github-actions
Copy link

github-actions bot commented Feb 5, 2023

Size Change: +1.96 kB (0%)

Total Size: 1.33 MB

Filename Size Change
build/block-editor/index.min.js 195 kB +368 B (0%)
build/block-editor/style-rtl.css 14.4 kB +12 B (0%)
build/block-editor/style.css 14.4 kB +12 B (0%)
build/block-library/blocks/query/editor-rtl.css 463 B +5 B (+1%)
build/block-library/blocks/query/editor.css 463 B +6 B (+1%)
build/block-library/editor-rtl.css 11.6 kB +8 B (0%)
build/block-library/editor.css 11.6 kB +8 B (0%)
build/block-library/index.min.js 201 kB +848 B (0%)
build/block-library/style-rtl.css 12.8 kB +98 B (+1%)
build/block-library/style.css 12.8 kB +98 B (+1%)
build/components/index.min.js 207 kB +6 B (0%)
build/core-data/index.min.js 16.2 kB +321 B (+2%)
build/edit-site/index.min.js 65.2 kB -1 B (0%)
build/editor/index.min.js 45.7 kB +172 B (0%)
build/style-engine/index.min.js 1.53 kB +3 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
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 90 B
build/block-library/blocks/archives/style.css 90 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 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 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 100 B
build/block-library/blocks/categories/style.css 100 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 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 265 B
build/block-library/blocks/file/style.css 265 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 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 654 B
build/block-library/blocks/group/editor.css 654 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 76 B
build/block-library/blocks/heading/style.css 76 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 830 B
build/block-library/blocks/image/editor.css 829 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/link-preview/style-rtl.css 230 B
build/block-library/blocks/link-preview/style.css 230 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 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 507 B
build/block-library/blocks/media-text/style.css 505 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 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/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
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 376 B
build/block-library/blocks/page-list/editor.css 376 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 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 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/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 134 B
build/block-library/blocks/post-excerpt/style.css 134 B
build/block-library/blocks/post-featured-image/editor-rtl.css 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/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 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 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 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 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 409 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 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 490 B
build/block-library/blocks/site-logo/editor.css 490 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 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 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.4 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.57 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.71 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 34.8 kB
build/edit-post/style-rtl.css 7.53 kB
build/edit-post/style.css 7.52 kB
build/edit-site/style-rtl.css 9.96 kB
build/edit-site/style.css 9.95 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.55 kB
build/edit-widgets/style.css 4.55 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.27 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 940 B
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.8 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.69 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.31 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@github-actions
Copy link

github-actions bot commented Feb 5, 2023

Flaky tests detected in 1db7e0c.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4252162003
📝 Reported issues:

@jasmussen
Copy link
Contributor

Nice PR, from the screenshots these look close. I'd add the 2px border radius and maybe a little padding.

I'm having some trouble reproducing, though. When I paste a URL on an empty paragraph and press Enter, I would expect the link preview to be used, but it's using a regular Embed block:

Screenshot 2023-02-06 at 09 39 47

This looks a new block, "Link preview":
Screenshot 2023-02-06 at 09 40 03

That seems okay if it's an embed variation, categorized with the other embeds. But key here would be that it's automatically transformed into, when OG tags are detected. Can we do that?

And if so, what's a good URL to test? I'm not sure why but I'm having trouble finding good examples that work:

Screenshot 2023-02-06 at 09 40 41

@ellatrix
Copy link
Member Author

ellatrix commented Feb 6, 2023

I'm having some trouble reproducing, though. When I paste a URL on an empty paragraph and press Enter, I would expect the link preview to be used, but it's using a regular Embed block:

Yes, I mentioned in the PR description that I'd like it to be possible to paste a URL and get a preview, but we need to figure out how it interacts with the embed block because right now we try embedding first.

But key here would be that it's automatically transformed into, when OG tags are detected. Can we do that?

What do you mean? I think we are checking OG tags now though the url-details endpoint. I need to double check that.

And if so, what's a good URL to test?

It's good that you find examples that don't work. Could you share them? Cause ideally any link should work. If there's no OG tags, then we can fall back to the document title.

@jasmussen
Copy link
Contributor

Yes, I mentioned in the PR description that I'd like it to be possible to paste a URL and get a preview, but we need to figure out how it interacts with the embed block because right now we try embedding first.

🚀

What do you mean? I think we are checking OG tags now though the url-details endpoint. I need to double check that.

Same as above: that it tries to convert it into your new block if there's content to show in it.

It's good that you find examples that don't work. Could you share them? Cause ideally any link should work. If there's no OG tags, then we can fall back to the document title.

I actually tried pasting in a couple of Gutenberg PRs, such as this one. I also tried a couple of wikipedia links, such as https://en.wikipedia.org/wiki/Atomic_Swing:

Screenshot 2023-02-07 at 09 01 40

@ellatrix
Copy link
Member Author

ellatrix commented Feb 7, 2023

I actually tried pasting in a couple of Gutenberg PRs, such as this one. I also tried a couple of wikipedia links, such as https://en.wikipedia.org/wiki/Atomic_Swing:

But are you trying it with the Link Preview block? The image you shared is the Embed block?

@jasmussen
Copy link
Contributor

My apologies, I should've included that. Nothing happens, no console error, I click embed but it's stuck:

link preview

@getdave
Copy link
Contributor

getdave commented Feb 8, 2023

Nice PR. I particularly like the idea of auto transforming pasting links into this block 👍

I tested the url-details endpoint with https://en.wikipedia.org/wiki/Atomic_Swing and it works reasonably well returning the following:

{
    "title": "Atomic Swing - Wikipedia",
    "icon": "https://en.wikipedia.org/static/favicon/wikipedia.ico",
    "description": "",
    "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Atomic_Swing_Wordmark.svg/1200px-Atomic_Swing_Wordmark.svg.png"
}

The REST API endpoint itself has several methods for parsing the various url details. You can see these starting at

https://github.com/WordPress/wordpress-develop/blob/7e0fe194aa7b65625af460957f9a468a5194a926/src/wp-includes/rest-api/endpoints/class-wp-rest-url-details-controller.php#L286

Most of the methods look for OG tags as well as standard HTML tags. There are certain sites which is doesn't play well with, including sites that rely on JavaScript for rendering and which also don't provide useful metadata in the server response. I don't see any way we can work around that. Google et al. presumably do it by relying on their internal search APIs to retrieve data parser by their own crawlers. We can't do that unfortunately...

@ellatrix
Copy link
Member Author

ellatrix commented Feb 8, 2023

This is so strange. I had it working properly when I created the PR, and now the onSubmit handler doesn't seem to be called any more.

@ellatrix
Copy link
Member Author

ellatrix commented Feb 8, 2023

@joen My apologies as well, I accidentally added an onClick listener that prevents default behaviour on the whole block, so that's why the button in the placeholder didn't work anymore. 🙈

Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

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

I'd like a way to edit my link after I've submitted it. Currently you can't do that.

Also I tried pasting in a YT watch link like https://www.youtube.com/watch?v=0mUrwyyw-8I&t=269s. The preview was broken (because many elements of data are expected in the block but missing in the response) but the strangest thing was when you click on the link it tries to load internally within the iframe.

Screen.Capture.on.2023-02-08.at.18-37-58.mp4

@ellatrix
Copy link
Member Author

ellatrix commented Feb 8, 2023

@getdave I added URL editing and fixed it for cases where some of the fields is empty.

@ellatrix
Copy link
Member Author

ellatrix commented Feb 8, 2023

Does anyone know how to get the stylesheet enqueued on the front-end?

@ellatrix ellatrix requested a review from getdave February 8, 2023 20:20
@ellatrix ellatrix added New Block Suggestion for a new block [Type] Enhancement A suggestion for improvement. labels Feb 8, 2023
Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

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

Pushed one change ( hope you don't mind?) and left some comments to consider.

There are some visual aspects that it would be nice to tidy up too including providing fallbacks in case of missing data. You can see how we handled that for LinkControl in

https://github.com/WordPress/gutenberg/blob/7b3c06edd3ee3e8573819176dd8f426774333d04/packages/block-editor/src/components/link-control/link-preview.js

packages/block-library/src/link-preview/edit.js Outdated Show resolved Hide resolved
packages/block-library/src/link-preview/edit.js Outdated Show resolved Hide resolved
packages/block-library/src/link-preview/edit.js Outdated Show resolved Hide resolved
packages/block-library/src/link-preview/edit.js Outdated Show resolved Hide resolved
Comment on lines 20 to 31
{ image && <img src={ image } alt={ title } /> }
<div>
{ title && <strong>{ title }</strong> }
{ icon && (
<img
className="link-preview__icon"
src={ icon }
alt={ new URL( url ).host }
/>
) }
{ title ? new URL( url ).host.replace( /^www\./, '' ) : url }
</div>
Copy link
Contributor

Choose a reason for hiding this comment

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

Same comment here as for edit - let's provide fallbacks if data is missing.

Copy link
Contributor

Choose a reason for hiding this comment

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

Also the code here could be shared with the edit file.

Copy link
Member Author

Choose a reason for hiding this comment

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

I already added a fallback: the fallback is simply the URL.

/**
* Default transforms for generic embeds.
*/
const transforms = {
Copy link
Contributor

Choose a reason for hiding this comment

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

I tried pasting https://aheadcreative.com into the editor canvas and it turned it into an embed block. I couldn't see how to get the link preview block to work.

Copy link
Member Author

Choose a reason for hiding this comment

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

Oh, I've not added that yet. When should we convert a pasted link to a link preview? When it fails to embed?

Copy link
Contributor

Choose a reason for hiding this comment

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

If that can be achieved then yes that would seem logical 👍

@ellatrix
Copy link
Member Author

ellatrix commented Feb 9, 2023

Regarding paste, I'm wondering if we should give people the option between three different blocks when pasting a link:

  • An embed
  • A link preview block
  • Just a paragraph with the link

So upon paste, we could show a placeholder with the three different blocks and a preview of them from which the user can pick. Not sure if this is a good or bad idea.

@jasmussen
Copy link
Contributor

Regarding paste, I'm wondering if we should give people the option between three different blocks when pasting a link:

Just to be sure: is the Link Preview superior to the current Link Embed block? If it is, it could replace it (or the embed could be "refactored" into this). Or is there a reason to keep the existing link embed block around?

That said, one way of transforming one into the other could potentially be this top of the inspector interface that we are discussing for navigation items in #46195. I.e. the toggles. Maybe?

@ellatrix
Copy link
Member Author

@jasmussen What is the Link Embed? I've never heard of it and I'm also not seeing it in the block library.

@ellatrix
Copy link
Member Author

Not sure how to handle paste. When an embed block is created, there's no way to know it came from paste, and we don't just want to replace any failing embed block to a link preview (for example when you load a post in the editor). We only want it on paste. The paste handler also doesn't know when a block "failed".

It seems that the only option right now is to offer it next to "Convert to link" in the placeholder you see when an Embed failed to preview.

In any case, I don't think this should be a blocker for adding this new block?

Would love some help with the design of this preview.

Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

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

The single fetch in the effect is much better 👍

Tested with a super slow network and noticed that the form remains visible even during fetching. This means that it's possible to update the URL after the initial fetch has been initiated. This leads to potential network race conditions.

We should probably disable the UI whilst fetching - what do you think?

Screen.Capture.on.2023-02-23.at.11-00-39.mp4

I also pushed a change to improve the error notice styling:

Screen Shot 2023-02-23 at 11 14 51

@getdave
Copy link
Contributor

getdave commented Feb 23, 2023

In any case, I don't think this should be a blocker for adding this new block?

Not a blocker.

@getdave getdave added the Needs Design Feedback Needs general design feedback. label Feb 23, 2023
@jasmussen
Copy link
Contributor

@jasmussen What is the Link Embed? I've never heard of it and I'm also not seeing it in the block library.

Sorry, just coming back to this now. What I mean is, currently when you paste a link on a new line and press enter, it's transformed into a sort of Oembed block that does show a little preview. That's what I called the "Link Embed", but I'm not actually sure what technically it's called — perhaps just the regular Embed block? The main point I wanted to make was that this feature already appears to exist, even if it's hit and miss, and that the superior version should replace whatever is in place at the moment.

Does that make sense?

@ellatrix
Copy link
Member Author

@jasmussen That sort of what we talked about before. Whether this should serve as a fallback if embedding doesn't work. It's two different things though. The current embed block is used for video embedding etc., but not every link can be embedded. This is different: it fetches the title and featured image of a page so you can "preview" the link. I think it's worth starting by adding this block and then figuring out when a pasted link should be embedded or previewed.

@jasmussen
Copy link
Contributor

I'm mainly wondering about the flow. If I paste a link in Facebook, Twitter, Slack, or otherwise, and give it its own line, I expect a visual preview/embed. If we build a new block that provides a better preview than what occasionally works here, that's cool, but if I have to manually pick that particular block first in order to accomplish that, I worry no-one will discover it, due to the expected embedding flow.

@Mamaduka
Copy link
Member

Mamaduka commented Mar 4, 2023

@ellatrix, I've got a block plugin that does the same. Feel free to use any part of it - https://github.com/Mamaduka/bookmark-card.

The single fetch in the effect is much better 👍

I don't think that the fetch should live in effect. The block only wants to retrieve data on a particular interaction: when users press the button. I think it would be more suitable to move that logic inside submit event handler.

@masteradhoc
Copy link
Contributor

@ellatrix any update on this block? looks promising. thanks for the great work!

@getdave
Copy link
Contributor

getdave commented Apr 18, 2023

The single fetch in the effect is much better 👍

I don't think that the fetch should live in effect. The block only wants to retrieve data on a particular interaction: when users press the button. I think it would be more suitable to move that logic inside submit event handler.

@Mamaduka Just for context on why this was implemented. Is there a particular reason why you dislike the useEffect? I assume you have some learnings from your existing Plugin to share? Thanks!

@Mamaduka
Copy link
Member

Thanks for sharing the context, @getdave!

I don't dislike the useEffect hook, but I think there are multiple places in the project where we're misusing them. While I understand that it's hard to follow recommended practices in large projects like Gutenberg, we should be cautious when introducing new cases.

I think @kevin940726 summarizes the "cons" well in this comment - #48225 (comment).

Restored the effect so it can be transformed to from an embed block

We can also display the placeholder component with a URL and let the users "embed" the links, instead of auto-embedding them.

@kevin940726
Copy link
Member

I don't dislike the useEffect hook, but I think there are multiple places in the project where we're misusing them. While I understand that it's hard to follow recommended practices in large projects like Gutenberg, we should be cautious when introducing new cases.

I fully agree with @Mamaduka here. The useEffect here looks a bit like an anti-pattern and could cause some unexpected and difficult-to-fix side effects if we aren't careful.

If it's the only way that could be done to support transforming from and to an embed block, then at least we should document it with a comment so that people don't blindly copy-paste it.

} else {
setHasError( false );
setIsEditingUrl( false );
setAttributes( {
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 we also need a couple of things if this effect is required.

  • Add __unstableMarkNextChangeAsNotPersistent before setAttributes to prevent "undo traps".
  • Add a cleanup function to prevent race conditions and memory leaks. Don't update states if the component is already unmounted.

@getdave
Copy link
Contributor

getdave commented Feb 7, 2024

Just remembered this PR. Is there still interest in pursuing this block?

I think we could get it to land by descoping this PR a little even if that compromises initial utility.

For example by just shipping the block code and not including the transforms and auto-embedding behaviour.

That could all be handled in follow ups.

Looks like we need to address a few nits as well.

Copy link

github-actions bot commented Feb 7, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Core SVN

Core Committers: Use this line as a base for the props when committing in SVN:

Props ellatrix, get_dave, kevin940726, joen, mamaduka, masteradhoc.

GitHub Merge commits

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: ellatrix <ellatrix@git.wordpress.org>
Co-authored-by: getdave <get_dave@git.wordpress.org>
Co-authored-by: kevin940726 <kevin940726@git.wordpress.org>
Co-authored-by: jasmussen <joen@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: masteradhoc <masteradhoc@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@ellatrix
Copy link
Member Author

ellatrix commented Feb 7, 2024

@getdave I thought it's already pretty descoped. What were you thinking of removing? I would still love this block. :)

@getdave
Copy link
Contributor

getdave commented Feb 8, 2024

...not including the transforms and auto-embedding behaviour.

@ellatrix I was thinking this was more complex than it actually is.

So nothing to descope. Just fixing up the effectful code. Probably one for post 6.5.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Needs Design Feedback Needs general design feedback. New Block Suggestion for a new block [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants