Skip to content

Conversation

fabiankaegy
Copy link
Member

Description

The ServerSideRender component now continues to show the markup from the previous request when it is fetching the new markup. The reason behind it is preventing the flashing of content when attributes are being changed. This work is a continuation building on the work of @dgwyer here: https://github.com/dgwyer/server-side-render-x

How has this been tested?

This was tested using the bundled wp-env environment with the Archives block.

Screenshots

Types of changes

  • ServerSideRender Component continues to show markup while loading new markup when for example attributes change

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • 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.

@fabiankaegy
Copy link
Member Author

@dgwyer I'd love to get your thoughts on this first because I used your https://github.com/dgwyer/server-side-render-x repository as an inspiration for the change.

@fabiankaegy fabiankaegy linked an issue Jan 18, 2021 that may be closed by this pull request
@fabiankaegy fabiankaegy marked this pull request as ready for review January 18, 2021 13:04
@github-actions
Copy link

github-actions bot commented Jan 18, 2021

Size Change: +104 B (0%)

Total Size: 1.06 MB

Filename Size Change
build/server-side-render/index.min.js 1.42 kB +104 B (+8%) 🔍
ℹ️ 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.19 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 128 kB
build/block-editor/style-rtl.css 13.9 kB
build/block-editor/style.css 13.8 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 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 600 B
build/block-library/blocks/button/style.css 600 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 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 666 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.23 kB
build/block-library/blocks/cover/style.css 1.23 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 983 B
build/block-library/blocks/gallery/editor.css 988 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 728 B
build/block-library/blocks/image/editor.css 728 B
build/block-library/blocks/image/style-rtl.css 482 B
build/block-library/blocks/image/style.css 487 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 488 B
build/block-library/blocks/media-text/style.css 485 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 489 B
build/block-library/blocks/navigation-link/editor.css 488 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 300 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.72 kB
build/block-library/blocks/navigation/editor.css 1.72 kB
build/block-library/blocks/navigation/style-rtl.css 1.5 kB
build/block-library/blocks/navigation/style.css 1.49 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 202 B
build/block-library/blocks/page-list/style.css 202 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/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-content/editor-rtl.css 138 B
build/block-library/blocks/post-content/editor.css 138 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 398 B
build/block-library/blocks/post-featured-image/editor.css 398 B
build/block-library/blocks/post-featured-image/style-rtl.css 143 B
build/block-library/blocks/post-featured-image/style.css 143 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 378 B
build/block-library/blocks/post-template/style.css 379 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-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 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 220 B
build/block-library/blocks/quote/theme.css 222 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 374 B
build/block-library/blocks/search/style.css 375 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 462 B
build/block-library/blocks/site-logo/editor.css 464 B
build/block-library/blocks/site-logo/style-rtl.css 153 B
build/block-library/blocks/site-logo/style.css 153 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 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.3 kB
build/block-library/blocks/social-links/style.css 1.3 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 636 B
build/block-library/blocks/template-part/editor.css 635 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/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 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 853 B
build/block-library/common.css 849 B
build/block-library/editor-rtl.css 9.71 kB
build/block-library/editor.css 9.7 kB
build/block-library/index.min.js 153 kB
build/block-library/reset-rtl.css 527 B
build/block-library/reset.css 527 B
build/block-library/style-rtl.css 10.3 kB
build/block-library/style.css 10.3 kB
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 669 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.9 kB
build/components/index.min.js 210 kB
build/components/style-rtl.css 15.8 kB
build/components/style.css 15.8 kB
build/compose/index.min.js 10.3 kB
build/core-data/index.min.js 12.3 kB
build/customize-widgets/index.min.js 11.1 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.45 kB
build/edit-navigation/index.min.js 16.3 kB
build/edit-navigation/style-rtl.css 3.7 kB
build/edit-navigation/style.css 3.7 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 28.9 kB
build/edit-post/style-rtl.css 7.23 kB
build/edit-post/style.css 7.22 kB
build/edit-site/index.min.js 26.4 kB
build/edit-site/style-rtl.css 5.07 kB
build/edit-site/style.css 5.07 kB
build/edit-widgets/index.min.js 16.1 kB
build/edit-widgets/style-rtl.css 4.09 kB
build/edit-widgets/style.css 4.09 kB
build/editor/index.min.js 37.7 kB
build/editor/style-rtl.css 3.76 kB
build/editor/style.css 3.75 kB
build/element/index.min.js 3.17 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.34 kB
build/format-library/style-rtl.css 668 B
build/format-library/style.css 670 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.88 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.28 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.27 kB
build/widgets/style-rtl.css 1.17 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

Copy link
Member

@ZebulanStanphill ZebulanStanphill left a comment

Choose a reason for hiding this comment

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

Coincidentally, I happened to be working on a PR that just refactors ServerSideRender into a function component using React hooks: #28297. (Which your PR also does, in addition to updating the behavior.) I didn't realize that this PR existed until after I'd created mine. 😛

It might make more sense for my PR to be reviewed and merged first since it would make this one a lot smaller and easier to review. Either way, feel free to rebase this PR off of mine or just use it as a guide to improve your own. I've managed to spot several issues/potential-tweaks that I've already addressed in my PR.

@ZebulanStanphill ZebulanStanphill added [Package] Server Side Render /packages/server-side-render [Type] Enhancement A suggestion for improvement. labels Jan 18, 2021
@fabiankaegy
Copy link
Member Author

@ZebulanStanphill Thanks for the review and sorry that you were also working on this at the same time :(

I'm fine either way. I have addressed all your comments and tested it locally. :) So should be in a better state now 👍

Copy link
Member

@ZebulanStanphill ZebulanStanphill left a comment

Choose a reason for hiding this comment

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

One of the tests is failing because package-lock.json needs to be updated. You can do this by running npm install.

@fabiankaegy
Copy link
Member Author

@ZebulanStanphill Thank you for taking the time to review all of this. I have updated all the requested changes :)

@Mamaduka
Copy link
Member

Mamaduka commented Aug 3, 2021

Hi, @fabiankaegy

Do you have time to rebase the branch off of the current trunk?

@fabiankaegy
Copy link
Member Author

@Mamaduka Looking at it now 👍

@fabiankaegy fabiankaegy force-pushed the feature/improve-server-side-render branch from d7aca9a to dbe27b7 Compare August 17, 2021 13:21
@Mamaduka
Copy link
Member

Thanks for the follow-up, @fabiankaegy.

It looks like I missed the notification, but I will try to review this tomorrow.

@fabiankaegy fabiankaegy requested a review from Mamaduka August 27, 2021 15:32
Copy link
Member

@Mamaduka Mamaduka left a comment

Choose a reason for hiding this comment

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

Thanks again for working on this, @fabiankaegy.

Changes look great, and I left few minor comments regarding the code.

Here is an example of the updated UX:

CleanShot.2021-08-30.at.15.15.24.mp4

One thing I'm not sure about is hardcoded inline styles. It will make it harder for developers to override them without providing a custom LoadingResponsePlaceholder component. But since the package doesn't ship with styles file, I guess this is our only option.

P.S. Maybe we should match loading state styling to blocks design. Video Block example:

CleanShot.2021-08-30.at.15.47.31.mp4

@jasmussen, any recommendations regarding the styling of the loading state?

@jasmussen
Copy link
Contributor

any recommendations regarding the styling of the loading state?

Thanks for the ping. Overall I think loading states across the board need a holistic rethink. The spinner needs love, and the states themselves could be looked at on whether they need spinners in the first place: if the loading happens fast enough, it's best not to show a spinner at all (i.e. the spinner could appear after a delay).

However the current loading state for the RSS feed is so mediocre that what's shipping already in this branch is an improvement, and since we need to look at loading states holistically, probably best to not hold up this PR for that.

I do share your instinct, though, that if there's prior art, it'd be nice to leverage that, and the prior art for the video is a good one to emulate. I.e. the entire item that is in a loading state becomes semi-transparent, and the spinner is overlaid dead center of the container. Same as for the image:

image

@Mamaduka
Copy link
Member

Mamaduka commented Sep 20, 2021

I updated the loading state styling to match existing ones in the core.

@fabiankaegy, @jasmussen, I would love to get your feedback if you think this is in a good state to land.

CleanShot.2021-09-20.at.13.33.47.mp4

@fabiankaegy
Copy link
Member Author

@Mamaduka I think that visual style works and is a great improvement over the current styling because we don't have that huge visual jump. I would be okay with shipping it like that. :) Thank you for your help! :)

@jasmussen
Copy link
Contributor

From a quick glance at the video (thank you for providing!) I see the spinner centered in the box, which in its transient state is semi-transparent. Which seems good to me, thank you!

@dgwyer
Copy link
Contributor

dgwyer commented Sep 20, 2021

Good to see some progress on this. However, I'm not really a fan of the 'dimming' of the block content during the re-render cycle. I can appreciate why it was done this way. i.e. To make it easier to place the spinner in a consistent position central to the block.

Dimming though, introduces unecessary visual cruft for me. Especially for multiple quick fire changes in the block settings panel. I originally created my own version of the SSR component to remove as much visual change between the new rendered content and the previous content as possible.

e.g. This is my initial original effort. See how even for rapid settings changes the UI changes look almost as smooth as if it was being updated directly via JS.

@Mamaduka
Copy link
Member

Thanks for the feedback, @dgwyer.

I tried without dimming, but then Spinner isn't visible in some cases.

After this change, you should be able to override the LoadingResponsePlaceholder prop with a custom component and use styling that matches your block's UI. In addition, there will be no need to maintain the custom ServerSideDrender component since now you have access to the prevResponse as children prop.

@jasmussen
Copy link
Contributor

Perhaps a separate exploration can be to only show the dimming and the spinner after a delay of a second or so, in an optimistic assumption that the operation will have finished before that.

@dgwyer
Copy link
Contributor

dgwyer commented Sep 20, 2021

@Mamaduka As I mentioned, it's obvious why the dimming was introduced but it doesn't really help solve the original issue. Ideally, no visual changes to the content transition should be introduced apart from the spinner. This was the primary motivation behind the original implementation.

I already addressed the issue of the spinner not being visible in some cases by providing a spinnerLocation prop to adjust the spinner relative location as required. Perhaps we can implement something similar here rather than introduce unecessary additional UI?

@dgwyer
Copy link
Contributor

dgwyer commented Sep 20, 2021

@jasmussen Debouncing might work. But I think being able to adjust the spinner location should be fine in almost all cases?

@Mamaduka
Copy link
Member

@dgwyer I would like to avoid controlling individual pieces of the component using props. It could easily increase the complexity of the component.

It's a little more code, but you could achieve the same results by overriding default loading placeholder:

function LoadingResponsePlaceholder( { children } ) {
	return (
		<div style={ { position: 'relative' } }>
			<div
				style={ {
					position: 'absolute',
					top: '10px',
					righ: '0',
				} }
			>
				<Spinner />
			</div>
			{ children }
		</div>
	);
}

<ServerSideRender
	block="core/archives"
	attributes={ attributes }
	LoadingResponsePlaceholder={ LoadingResponsePlaceholder }
/>

@fabiankaegy
Copy link
Member Author

@Mamaduka Is there anything left that we need to do before this can get merged? Currently Merging is still blocked beause it needs approval.

@dgwyer
Copy link
Contributor

dgwyer commented Sep 20, 2021

@fabiankaegy See my comments above.

@Mamaduka Mamaduka dismissed ZebulanStanphill’s stale review September 20, 2021 14:21

The feedback got addressed.

@fabiankaegy
Copy link
Member Author

@dgwyer I saw your note but thought that it was addressed by the feedback from @Mamaduka here: #28289 (comment)

Because the ServerSideRender component now takes a LoadingPlaceholder component that gives you the ability to customize the experience to your liking this should give the flexibility to achieve the experience you are going after in core.

@jasmussen
Copy link
Contributor

Debouncing might work. But I think being able to adjust the spinner location should be fine in almost all cases?

The postponed spinner feels like it could potentially benefit a lot of these blocks in a generic and reproducible way. The problem with spinner location is that you can't be sure any location is "safe", as it depends on the content inside and how it wraps. Since this PR is an improvement over what's shipping, it feels worth landing it and continuing conversation in new PRs and tickets.

@fabiankaegy fabiankaegy merged commit 3dd1420 into trunk Sep 20, 2021
@fabiankaegy fabiankaegy deleted the feature/improve-server-side-render branch September 20, 2021 14:25
@github-actions github-actions bot added this to the Gutenberg 11.6 milestone Sep 20, 2021
@dgwyer
Copy link
Contributor

dgwyer commented Sep 20, 2021

The point is the defaut behaviour shouldn't have any additional layering over existing content during content re-rendering. The 'problem' of spinner location is easily mitigated by displaying it outside the block content. I've been doing this since the beginning and it just works (very well).

Adding UI on top of the content during render transition misses the point entirely. For JS only blocks the content is seamlessly updated, and that's what we want to achieve with SSR blocks too. My solution displays the spinner so it does not intefere with block content at all. See the GIF above (I've since update it so it displays to the left of the block container, vertically centered). This is a much better rendering experience for the user.

I've been using this daily for well over a year and have seen thousands of transitions. Dimming the content and adding the spinner right in the center of the block content during a render transition is not an ideal UX.

@dgwyer
Copy link
Contributor

dgwyer commented Sep 20, 2021

@jasmussen Outide of the block content can be considered a safe location.

I've been using this for a long time and it works very well. As you can see, rapid updating of attributes renders block updates very smoothly. Having the content blinking on/off continuously makes this a very poor UX and is why I implemented this solution in the first place.

spinner-location.mp4

@jasmussen
Copy link
Contributor

jasmussen commented Sep 20, 2021

Not necessarily. In the site editor the block might be flush against the top of the screen, which is why we moved the block toolbar below in #29464. Or you might be inserting the block in a narrow context, such as a column, where the block toolbar, or screen edge, will cover the spinner.

I do appreciate your point, and I do think it's worth following up with a postponed spinner. I think in many cases, certainly those you demo, there reaction time will be so fast there really is no need to see a spinner at all.

@dgwyer
Copy link
Contributor

dgwyer commented Sep 20, 2021

@jasmussen I'll reiterate my point for what it's worth and leave it at that. I would welcome the chance to make this even better for users.

The initial motivation for updating the SSR component was to match as closely the (re)rendering experience of pure JS blocks; which I achieved (with spinner location option). This merged solution does not do that in its current state.

As you pointed out we may not even need the spinner displayed at all in most cases. It would only need to be rendered as a fallback if there is a server delay.

This would be the best all-around solution as it would closely match JS block rendering behavior, fulfilling the original criteria.

@BinaryMoon
Copy link

Hi - I've been following this thread since I like what @dgwyer had done originally and I am in agreement that no dimming is preferable.

As a user experience it looks so much nicer to not fade out, it feels instant even though it takes the same amount of time. I'm disappointed this (appears to be) merged as is since it doesn't feel any better than what we have currently.

@jasmussen
Copy link
Contributor

I created a new ticket, #35027, to improve the transient state so that it only appears if an operation takes a while. I'll see if I can ask a friend to work on it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Server Side Render /packages/server-side-render [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Improve ServerSideRender UX
6 participants