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

Add Media File and Attachment Page options to the native Image block Link To menu #34846

Merged
merged 50 commits into from
Nov 3, 2021

Conversation

dcalhoun
Copy link
Member

@dcalhoun dcalhoun commented Sep 15, 2021

Related PRs

Description

Fixes wordpress-mobile/gutenberg-mobile#924. Add Media File and Attachment Page options to the native Image block Link To menu to allow quickly setting commonly used URLs. This feature already exists in the web interface.

Installable builds are available on the aforementioned PRs.

How has this been tested?

Verify Link Destinations

  1. Add an Image block.
  2. Set the media to an existing upload or upload a new image.
  3. Tap "Link to."
  4. Select one of the options.
  5. ℹ️ Expected: The additional "Open in new tab" and "Link Rel" options are displayed.
  6. Publish and visit a preview of the post.
  7. ℹ️ Expected: The image is linked to the selected option.
  8. Repeat steps 4-7 with each of the other options.

Verify External Image Options

  1. Add an Image block.
  2. Set the media to an external URL.
  3. Tap "Link to."
  4. ℹ️ Expected: The "Attachment Page" option is not available.

Screenshots

Screenshots
Android iOS
android-link-to ios-link-to
android-none ios-none
android-custom-url ios-custom-url
Video
ios-image-link-destinations.MP4

Types of changes

New feature

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

Displays "Media" and "Attachment Page" options within the Link To
settings for the Image block. The logic does not work for the new
options, and the implementation is rudimentary. Several `TODO(David)`
are in place for remaining work.
Using a callback avoids placing context-specific props reference inside
of link settings. I.e. `imageUrl` and `attachmentPageUrl` are no longer
referenced within link settings.
Reusing label text from the web will likely increase familiarity and
reduce confusion for users.
Display the currently selected link to option in the top-level Image
block settings.
@dcalhoun dcalhoun added Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change) [Block] Image Affects the Image Block [Type] Feature New feature to highlight in changelogs. labels Sep 15, 2021
@dcalhoun dcalhoun self-assigned this Sep 15, 2021
@dcalhoun
Copy link
Member Author

@mkevins this is very much still a work-in-progress and not completely functional, but I wanted to share it in case you'd like to provide a high-level review on the overall approach. A review now is not urgent if you do not have time, I will definitely seek your full review before merging this work. Thanks!

@github-actions
Copy link

github-actions bot commented Sep 15, 2021

Size Change: +100 B (0%)

Total Size: 1.08 MB

Filename Size Change
build/components/index.min.js 212 kB -19 B (0%)
build/edit-navigation/index.min.js 15.9 kB +119 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.14 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 136 kB
build/block-editor/style-rtl.css 14.1 kB
build/block-editor/style.css 14.1 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 309 B
build/block-library/blocks/buttons/editor.css 309 B
build/block-library/blocks/buttons/style-rtl.css 317 B
build/block-library/blocks/buttons/style.css 317 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.17 kB
build/block-library/blocks/cover/style.css 1.17 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 502 B
build/block-library/blocks/image/style.css 505 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 642 B
build/block-library/blocks/navigation-link/editor.css 642 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 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.83 kB
build/block-library/blocks/navigation/editor.css 1.84 kB
build/block-library/blocks/navigation/style-rtl.css 1.71 kB
build/block-library/blocks/navigation/style.css 1.7 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 198 B
build/block-library/blocks/page-list/style.css 198 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/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-content/style-rtl.css 56 B
build/block-library/blocks/post-content/style.css 56 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 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 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 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 815 B
build/block-library/common.css 812 B
build/block-library/editor-rtl.css 9.8 kB
build/block-library/editor.css 9.8 kB
build/block-library/index.min.js 157 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.5 kB
build/block-library/style.css 10.6 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 kB
build/components/style-rtl.css 15.4 kB
build/components/style.css 15.4 kB
build/compose/index.min.js 10.9 kB
build/core-data/index.min.js 12.6 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.44 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.4 kB
build/edit-post/style-rtl.css 7.12 kB
build/edit-post/style.css 7.12 kB
build/edit-site/index.min.js 30.7 kB
build/edit-site/style-rtl.css 5.79 kB
build/edit-site/style.css 5.78 kB
build/edit-widgets/index.min.js 16.4 kB
build/edit-widgets/style-rtl.css 4.17 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.21 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.34 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.19 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.7 kB
build/server-side-render/index.min.js 1.52 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.82 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.11 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

Relying upon the `placeholder` did not work correctly whenever a `value`
was set, i.e. in the case of a Custom URL. Additionally, overloading the
`placeholder` prop is confusing. The new `valueMask` prop hopefully
better communicates the intent.
The prior references are non-existent.
Selecting Media File or Attachment Page sets a URL value. Originally,
this caused the Custom URL option to display the URL value, rather than
persistently displaying its "Search or type URL" placeholder. The Custom
URL option should only display an actual URL value if it is manually
typed or selected within the link picker.
When the Media File or Attachment Page options are selected, a URL value
is set. Previously, this value was passed to the link picker when the
Custom URL option was subsequently selected. This meant the link picker
would be pre-populated with a (likely unidentifiable) URL that was not
manually entered by the user, which could be confusing.
Referencing `inputValue` from within LinkSettingsScreen resulted in a
stale value to from `useRoute`. By referencing, the `url` where the
callback is defined, we avoid this issue.
Set more appropriate defaults for link settings, the new values match
the sibling state values of the components.  Previously the `undefined`
values for `label` and `rel` differed from the empty string values in
component state. This change helps avoid unnecessary calls to
`setAttributes` that occurred when the BottomSheet was closed.

In addition to being unnecessary, these additional `setAttributes` calls
caused the Image edit component to erroneously change the
`linkDestination` even though the URL had not changed.
When "Open in new tab" or "Link Rel" is modified, the URL is again
passed to be set within `setMappedAttributes`. This caused the
`linkDestination` to improperly be modified. This change now avoid
settings `linkDestination` if the URL is not changing.
External images will not have an attachment page URL, so this option
should not be displayed when the URL is undefined.
Toggling the icon opacity rather than the presence of the icon itself
produces the desired alignment for both selected an unselected options.
After reviewing the logic within `LinkSettings`, it largely manages
invoking `setAttributes` in different scenarios. Therefore, using
`setAttributes` directly makes sense for this component.
Attempt to better describe component intent.
Relocate the logic to allow for a single `isSelected` prop to improve
readability.
@dcalhoun
Copy link
Member Author

@mkevins thank you for the review. 🙇🏻 I have addressed each of your comments. When you have time, will you please review again and let me know if there is anything we'd like to address further?

@mkevins
Copy link
Contributor

mkevins commented Sep 23, 2021

Thanks for addressing all the comments!

When you have time, will you please review again and let me know if there is anything we'd like to address further?

I've given it another pass, and it is looking great! Also, I tested it out, and it is mostly working according to the steps described, with a few exceptions:

For some reason, at one point I got into a state where the media file option would not persist. The steps are as follows:

  1. Set a custom URL
  2. Select none
  3. Select media file

When I did this, the media file was not set, and instead it remained at none. 🤔

media-file-not-persisted.mp4

When I set the media URL to an external image (via the web) I happened to have the attachment page setting already set. This resulted in the attachment page appearing to be set, but it was not present in the options (as expected).

attachment-page-still-set.mp4

I'm not sure if this is something we can easily address (and may likely be an issue for web as well). Also, it's a bit "out of the way" to reproduce it, so I wouldn't expect the impact to be large for this issue. Just noting it since I happened to encounter this while testing that flow.

Finally (though this is not introduced in this PR, and I'm only mentioning for completeness), I also encountered the strange "transparent fullscreen modal" again:

@dcalhoun
Copy link
Member Author

dcalhoun commented Sep 23, 2021

For some reason, at one point I got into a state where the media file option would not persist. The steps are as follows:

  1. Set a custom URL
  2. Select none
  3. Select media file

When I did this, the media file was not set, and instead it remained at none. 🤔

@mkevins I observed an issue like this in the past, but I am been unable to reproduce this now. 😕 May I verify you are using the latest build for Android: WordPress-pr-15336-build-115665.apk? If yes, were there any other steps to reproduce? New image or existing image in a post? Did you close the bottom sheet between switching Link Destinations? Update the post between switching options?

When I set the media URL to an external image (via the web) I happened to have the attachment page setting already set. This resulted in the attachment page appearing to be set, but it was not present in the options (as expected).

I'm not sure if this is something we can easily address (and may likely be an issue for web as well). Also, it's a bit "out of the way" to reproduce it, so I wouldn't expect the impact to be large for this issue. Just noting it since I happened to encounter this while testing that flow.

From my testing, it does appear the web suffers from the same "stale" link issue. However, it is not as pronounced as the web UI merely renders the "stale" link address rather than claiming it to be the image's "Attachment Page" specifically.

Web UI: Image with "detached" Attachment Page URL web-image-with-detached-url

One fix might be no longer relying solely upon linkDestination to dictate the currently selected option. We could check if the set url is actually the attachment page URL. It feels a bit "icky" to no longer treat linkDestination as truth, but I wonder if that is what the web is doing. WDYT?

I would agree—with what I believe you implied—that we could ship with this issue as it is likely an edge case.

Finally (though this is not introduced in this PR, and I'm only mentioning for completeness), I also encountered the strange "transparent fullscreen modal" again:

Yes, hopefully we are able to find a solution to this issue within #34425.

@mkevins
Copy link
Contributor

mkevins commented Sep 24, 2021

@mkevins I observed an issue like this in the past, but I am been unable to reproduce this now. May I verify you are using the latest build for Android: WordPress-pr-15336-build-115665.apk? If yes, were there any other steps to reproduce? New image or existing image in a post? Did you close the bottom sheet between switching Link Destinations? Update the post between switching options?

Actually, I encountered this issue by testing this PR and using WordPress-Android develop (at this commit: wordpress-mobile/WordPress-Android@9a6f115). It was with a new image that I created by inserting an image block and choosing an image from the media library. I did not close the bottomsheet between switching link destinations, nor update the post between switching options. I will also try with the generated APK to see if there's different behavior there.

I would agree—with what I believe you implied—that we could ship with this issue as it is likely an edge case.

Yes, you believe right 😄 : I don't consider the second issue to be a blocker for merging the PR.

@mkevins
Copy link
Contributor

mkevins commented Sep 24, 2021

I was able to reproduce it on the apk as well (though it seems I had to fiddle quite a bit by changing the options a lot — I even added custom URL twice). I'm not sure why sometimes it happens with fewer steps 🤔

media-file-not-persisted-apk-build-115665.mp4

You may also notice in that video a regression unrelated to this PR in which the search results are cleared a moment after they are displayed, which seems as though it might be related with the keyboard suggestion, since it happens to me when I swipe a word, but not hunt-and-peck 🤷‍♂️ . I wonder whether these kinds of state issues could be related with the bottomsheet animations / navigation 🤔

There are no references to this method in the source.
This prop referenced an undefined class method.
Stringifying the styles appears unnecessary, and it was also causing
missing key warnings in tests as the styles are undefined in that
context. Leveraging the index appears to be enough to satisfy both the
app and the tests.
Test from the "public" API of the component and its output, rather than
internal methods. I.e. press rendered buttons instead of calling methods
by name.
Metro resolves native files by default.
The Image component invokes `getMedia` within its selector. This results
in an async resolver running, which leads to changes to the component
after the async work completes. Rather than wrapping the entire test
helper with `act`, we should target the specific change within the test
file.
Per React Navigation documentation, this file should be included.
https://bit.ly/3n6Rotv
There appears to be a bug in React Navigation that causes error logs in
Jest tests. We must await the `fireEvent` that triggers the navigation
event in order to suppress the error. https://git.io/Ju35Z
Originally, ImageLinkDestinationsScreen relied upon (1) differing route
parameter names from LinkPicker and (2) explicitly set `linkDestination`
while LinkPicker did not. Stale route parameters resulted in erroneous
attribute updates when swapping the link destination from Media File >
Custom URL > Media File.

This change addresses the stale route parameters by (1) unifying the
route parameter names between the two components and (2) unifying the
approach for setting `linkDestination` to be computed based upon the
URL. The URL, represented as the `inputValue` route parameter, is now
the sole route parameter.
The image URL may contain query parameters for aspects like display
dimensions. This caused a comparison based upon the URL to unexpectedly
mismatch. By leveraging `linkDestination` instead, we correctly hide the
URL from the Custom URL input whenever Media File or Attachment Page is
selected.
@dcalhoun
Copy link
Member Author

dcalhoun commented Nov 1, 2021

@mkevins thank you for your patience while I found time to address your feedback. 🙇🏻 This PR and its sibling are now ready for another round of review. Installable builds can be found on the sibling WPiOS and WPAndroid PRs.

I ended up cherry picking a few commits from another branch to allow me to write tests from this new Image work. So, it may be easiest to step through each of the commits since your last review individually. I tried to leave commit messages explaining each.

(FIXED) Selection Sporadically Not Persisting

I believe I have addressed this issue within cf4027f. To recap, here are the steps I used to reproduce the issue:

  1. Add an Image block and set its media.
  2. Change Link To from None to Media File.
  3. Change Link To from Media File to Custom URL.
  4. Change Link To from Custom URL to Media File.
  5. 💥 The Link To is now erroneously displayed as None.

(POSTPONED) Incorrect Link To After Swap to External Image

We agreed that we do no need to address this issue within this PR, but I will recap in case we decide to re-engage it later. We noticed the web editor seemingly suffers from a stale URL in this context as well, but it is not as noticeable. For future reference these lines appear to be relevant, and were modified from the previous code that managed this scenario. I will create a new issue for this if/when we merge this work.

  1. In the mobile editor, add an Image block and set its media.
  2. Open the same post in the web editor, change the Image block's media to an external image URL.
  3. In the mobile editor, view the same Image block again.
  4. 💥 Notice the Link To claims to be Attachment Page, but that is not valid for an external image. The Attachment Page option is not available within the options.

Copy link
Contributor

@mkevins mkevins left a comment

Choose a reason for hiding this comment

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

Thanks for addressing the issues David! I also very much appreciate the attention to detail and the added and improved tests 👍 . The code looks good, and I have confirmed that the "link to not persisting" bug has been resolved. Nice work!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Image Affects the Image Block Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change) [Type] Feature New feature to highlight in changelogs.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Image Block: add a "Link To" option to easily link media to a larger or original version of the image
3 participants