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

Data: Migrate post editor persistence with fullscreenMode false #21082

Merged

Conversation

aduth
Copy link
Member

@aduth aduth commented Mar 23, 2020

Fixes #20956

This pull request seeks to resolve an issue where the fullscreen mode would not default to false for a user who had previously interacted with the editor, but who had not made an explicit choice to enable or disable the fullscreen mode setting.

This issue stems in-part from the fact that prior to #20611, there was no default value assigned for the fullscreenMode preference, and it was implicitly treated as false. Thus, as of #20611, even if there was persisted state for the editor, the absence of this default value would cause the new default (true) to take effect.

This is compounded with the fact that state is only persisted at the point that any of the preferences within a given store have been changed. Thus, if a user did not change any of the post editor default preferences, the full set of new defaults would be used.

The proposed changes seek to resolve this by considering at first load whether any persisted state had existed previously (for all stores) to use as an indication that the user had previously interacted with the editor. If state had existed, but the user did not have a default value assigned for fullscreenMode, then a value of false is assigned.

This works in large part due to the fact that the "New User Experience" tips are a preference value. At the point a user dismisses these tips (even if by navigating elsewhere in the admin), this preferenece is persisted and leveraged as a marker for prior interaction.

Before After
If the user had interacted with the editor previously but had not made a choice of full screen preference: Use true. If the user had interacted with the editor previously but had not made a choice of full screen preference: Use false.
If the user had interacted with the editor previously and had made a choice of full screen preference: Use their chosen preference. If the user had interacted with the editor previously and had made a choice of full screen preference: Use their chosen preference.
If the user had never interacted with the editor previously. Use true. If the user had never interacted with the editor previously. Use true.

Implementation Notes:

For the purposes of setting a default persistence value, the implementation is based in part on prior art from NUX to welcome guide migration.

While this function was originally marked for removal, given the recent additions of Welcome Mode migration, this is not likely for the near future.

In initial implementations, I had observed some sporadic behavior in whether the default would take effect. I believe this was caused by conflicts with the two separate migrations attempting to merge to the same state. Even changing this mutation was not enough. It may be that since persistence operates with localStorage, there was a race condition causing only one of the two migrations to "take hold". The proposed implementation seeks to try to make this more durable by calling persistence.set at most one time for both of these migrations.

Testing Instructions:

Run through each of the scenarios above, confirming the expected outcomes.

In testing, you will likely want to be running a site on WordPress 5.3.2. For each scenario, start fresh with localStorage by either running localStorage.clear() in your browser console prior (ideally on a screen other than the editor). For simulating the case of a user having made some prior interaction with the editor, you should perform this action while the Gutenberg plugin is disabled.

@aduth aduth added [Type] Bug An existing feature does not function as intended [Package] Data /packages/data [Package] Edit Post /packages/edit-post labels Mar 23, 2020
@github-actions
Copy link

Size Change: +54 B (0%)

Total Size: 857 kB

Filename Size Change
build/data/index.js 8.26 kB +54 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 998 B 0 B
build/annotations/index.js 3.43 kB 0 B
build/api-fetch/index.js 3.39 kB 0 B
build/autop/index.js 2.58 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/index.js 6.02 kB 0 B
build/block-directory/style-rtl.css 760 B 0 B
build/block-directory/style.css 760 B 0 B
build/block-editor/index.js 100 kB 0 B
build/block-editor/style-rtl.css 10.9 kB 0 B
build/block-editor/style.css 10.9 kB 0 B
build/block-library/editor-rtl.css 7.24 kB 0 B
build/block-library/editor.css 7.24 kB 0 B
build/block-library/index.js 110 kB 0 B
build/block-library/style-rtl.css 7.41 kB 0 B
build/block-library/style.css 7.42 kB 0 B
build/block-library/theme-rtl.css 669 B 0 B
build/block-library/theme.css 671 B 0 B
build/block-serialization-default-parser/index.js 1.65 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 57.5 kB 0 B
build/components/index.js 191 kB 0 B
build/components/style-rtl.css 15.8 kB 0 B
build/components/style.css 15.7 kB 0 B
build/compose/index.js 6.21 kB 0 B
build/core-data/index.js 10.6 kB 0 B
build/data-controls/index.js 1.04 kB 0 B
build/date/index.js 5.37 kB 0 B
build/deprecated/index.js 771 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 3.06 kB 0 B
build/edit-post/index.js 91.2 kB 0 B
build/edit-post/style-rtl.css 8.47 kB 0 B
build/edit-post/style.css 8.46 kB 0 B
build/edit-site/index.js 5.95 kB 0 B
build/edit-site/style-rtl.css 2.69 kB 0 B
build/edit-site/style.css 2.69 kB 0 B
build/edit-widgets/index.js 4.43 kB 0 B
build/edit-widgets/style-rtl.css 2.58 kB 0 B
build/edit-widgets/style.css 2.58 kB 0 B
build/editor/editor-styles-rtl.css 381 B 0 B
build/editor/editor-styles.css 382 B 0 B
build/editor/index.js 43.8 kB 0 B
build/editor/style-rtl.css 4 kB 0 B
build/editor/style.css 3.98 kB 0 B
build/element/index.js 4.44 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 6.95 kB 0 B
build/format-library/style-rtl.css 502 B 0 B
build/format-library/style.css 502 B 0 B
build/hooks/index.js 1.93 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 3.49 kB 0 B
build/is-shallow-equal/index.js 710 B 0 B
build/keyboard-shortcuts/index.js 2.3 kB 0 B
build/keycodes/index.js 1.69 kB 0 B
build/list-reusable-blocks/index.js 2.99 kB 0 B
build/list-reusable-blocks/style-rtl.css 226 B 0 B
build/list-reusable-blocks/style.css 226 B 0 B
build/media-utils/index.js 4.84 kB 0 B
build/notices/index.js 1.57 kB 0 B
build/nux/index.js 3.01 kB 0 B
build/nux/style-rtl.css 616 B 0 B
build/nux/style.css 613 B 0 B
build/plugins/index.js 2.54 kB 0 B
build/primitives/index.js 1.5 kB 0 B
build/priority-queue/index.js 781 B 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/rich-text/index.js 14.4 kB 0 B
build/server-side-render/index.js 2.55 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 4.01 kB 0 B
build/viewport/index.js 1.61 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.18 kB 0 B

compressed-size-action

Copy link
Member

@jorgefilipecosta jorgefilipecosta left a comment

Choose a reason for hiding this comment

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

LGTM 👍

The settings seem to be stored correctly.
I verified without anything in the local storage the default mode is still full-screen mode.
I opened the editor in a version where fullscreen mode was not yet enabled by default, I created a post in that branch. I switched to this branch and I verified fullscreen mode was not active when the post loaded.

@jorgefilipecosta jorgefilipecosta merged commit 17ba1a2 into master Mar 23, 2020
@jorgefilipecosta jorgefilipecosta deleted the update/migrate-fullscreen-persisted-default branch March 23, 2020 15:33
@jorgefilipecosta jorgefilipecosta added the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Mar 23, 2020
@github-actions github-actions bot added this to the Gutenberg 7.8 milestone Mar 23, 2020
@noisysocks
Copy link
Member

While this function was originally marked for removal, given the recent additions of Welcome Mode migration, this is not likely for the near future.

We should update the comment that says "Remove this when WordPress 5.5 is released".

More broadly, I'm thinking we should probably admit that this isn't a temporary function and come up with a proper API for migrating local settings, since the need for migrating settings has arisen three times now 🙂

@aduth
Copy link
Member Author

aduth commented Mar 24, 2020

While this function was originally marked for removal, given the recent additions of Welcome Mode migration, this is not likely for the near future.

We should update the comment that says "Remove this when WordPress 5.5 is released".

More broadly, I'm thinking we should probably admit that this isn't a temporary function and come up with a proper API for migrating local settings, since the need for migrating settings has arisen three times now 🙂

I agree on both accounts. I initially prompted @youknowriad to include an "expiration date" when this was introduced largely in mind of the fact that maintaining (and requiring the download of) client-side code in perpetuity is far from ideal. Whether we decide to still do these expirations on a case-by-case basis is still up for debate, but as much as we should want to try to avoid a migration by designing up-front in mind for the future, it seems inevitable we'll encounter scenarios like this again.

A few miscellaneous observations:

  • It's questionable whether we want to keep this as __unstable-prefixed, given its implication of pending removal (documentation). At the same time, I think it's something which should not be considered as part of a public API.
  • While the same may not be said of the other migrations, the one introduced in this pull request could have been avoided by providing a default to the preference value from the point this feature was first introduced. A lesson I draw from this is that all preferences should be assigned a default, and we shouldn't rely on the implicit falsy-ness of an undefined value.
  • We could consider optimizations in tandem with block deprecations, which suffer the same problem of code maintained and downloaded in perpetuity (example).
    • Dynamic importing of migration code on-demand based on some condition could be a nice solution here (example). In fact, Webpack makes this relatively trivial to implement (documentation). The difficulty would likely stem from the WordPress side of things so far as how those scripts integrate into the script loader, and how the client becomes aware of the URL from which they should be loaded.

@jorgefilipecosta jorgefilipecosta removed the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Mar 27, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Data /packages/data [Package] Edit Post /packages/edit-post [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

All sites updated to 7.7 uses by default the Full Screen Mode
3 participants