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

Migrate post editor feature preferences to use new preferences package #39115

Merged
merged 4 commits into from
Mar 2, 2022

Conversation

talldan
Copy link
Contributor

@talldan talldan commented Feb 28, 2022

Description

Addresses some of #31965, follows #39112

Migrates the post editor to use the new preferences package (introduced in #38873). Previously it was using interface, but the plan is now to deprecate the preferences APIs in interface in favor of this new package.

The main goal here is that nothing is different from a user perspective.

Testing Instructions

  1. Delete your WP localstorage data
  2. Using trunk open the post editor and dismiss the welcome guide
  3. Toggle some of the preferences in the More Menu to something other than the default (e.g. set Top toolbar to active)
  4. Checkout this branch and rebuild
  5. Reload the post editor
  6. The welcome guide should not show and the preferences set in step 3 should still be the same (the data migration worked)
  7. Change a few more preferences
  8. Reload
  9. The preferences should still be the same from step 7 (preference changes are still persisted)

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).
  • I've updated related schemas if appropriate.

@talldan talldan added [Type] Enhancement A suggestion for improvement. [Package] Edit Post /packages/edit-post labels Feb 28, 2022
Comment on lines 150 to +151
export const toggleFeature = ( feature ) => ( { registry } ) =>
registry
.dispatch( interfaceStore )
.toggleFeature( 'core/edit-post', feature );
registry.dispatch( preferencesStore ).toggle( 'core/edit-post', feature );
Copy link
Contributor Author

Choose a reason for hiding this comment

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

There is the option of deprecating the existing actions and selectors in edit-post.

There's quite a lot of usage across the codebase (and possibly in plugins too), so I haven't done that. I'd be happy to address that in a follow-up if reviewers feel a deprecation is best.

Copy link
Member

Choose a reason for hiding this comment

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

Yes I think we should deprecate it. Otherwise future devs will mistakenly use this one. Since it is a method that made it into Core, we can't remove the method, but that's okay.

Copy link
Contributor

Choose a reason for hiding this comment

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

What form could that deprecation take?

I'm thinking we could add some sort of message in the actions and selectors but we might never be able to remove them altogether without risk of breaking things for plugins. It would be good to update usage in this codebase anyway, to make sure we're setting the right example (definitely a follow-up job though!)

Copy link
Member

@noisysocks noisysocks Mar 2, 2022

Choose a reason for hiding this comment

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

Yes because it shipped in Core we have to follow the Core deprecation policy which is to call deprecated() (or any of the deprecated_* methods in PHP) but never actually remove the method. It will spit out a a warning but continue working.

@github-actions
Copy link

github-actions bot commented Feb 28, 2022

Size Change: +795 B (0%)

Total Size: 1.15 MB

Filename Size Change
build/block-editor/index.min.js 143 kB -45 B (0%)
build/block-library/index.min.js 167 kB +35 B (0%)
build/components/index.min.js 215 kB +68 B (0%)
build/components/style-rtl.css 15.6 kB +31 B (0%)
build/components/style.css 15.6 kB +32 B (0%)
build/data/index.min.js 7.57 kB -87 B (-1%)
build/edit-post/index.min.js 29.8 kB -124 B (0%)
build/edit-post/style-rtl.css 7.14 kB -43 B (-1%)
build/edit-post/style.css 7.13 kB -43 B (-1%)
build/edit-site/index.min.js 42.1 kB -20 B (0%)
build/edit-site/style-rtl.css 7.23 kB +5 B (0%)
build/edit-site/style.css 7.22 kB +5 B (0%)
build/element/index.min.js 4.29 kB +971 B (+29%) 🚨
build/nux/style-rtl.css 751 B +4 B (+1%)
build/nux/style.css 749 B +6 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/admin-manifest/index.min.js 1.24 kB
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.49 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/style-rtl.css 14.8 kB
build/block-editor/style.css 14.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 150 B
build/block-library/blocks/audio/editor.css 150 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 445 B
build/block-library/blocks/button/editor.css 445 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 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 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-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 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-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 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.56 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 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 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 965 B
build/block-library/blocks/gallery/editor.css 967 B
build/block-library/blocks/gallery/style-rtl.css 1.61 kB
build/block-library/blocks/gallery/style.css 1.61 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/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 518 B
build/block-library/blocks/image/style.css 523 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 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.01 kB
build/block-library/blocks/navigation/editor.css 2.02 kB
build/block-library/blocks/navigation/style-rtl.css 1.89 kB
build/block-library/blocks/navigation/style.css 1.88 kB
build/block-library/blocks/navigation/view.min.js 2.85 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 363 B
build/block-library/blocks/page-list/editor.css 363 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 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 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 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 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/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 323 B
build/block-library/blocks/post-template/style.css 323 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 80 B
build/block-library/blocks/post-title/style.css 80 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 389 B
build/block-library/blocks/pullquote/style.css 388 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 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 201 B
build/block-library/blocks/quote/style.css 201 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 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 233 B
build/block-library/blocks/separator/style.css 233 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 744 B
build/block-library/blocks/site-logo/editor.css 744 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 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 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 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 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 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 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 934 B
build/block-library/common.css 932 B
build/block-library/editor-rtl.css 9.89 kB
build/block-library/editor.css 9.9 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 11.4 kB
build/block-library/style.css 11.4 kB
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 670 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 46.4 kB
build/compose/index.min.js 11.2 kB
build/core-data/index.min.js 13.9 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.53 kB
build/edit-navigation/index.min.js 16.2 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.12 kB
build/edit-widgets/style.css 4.13 kB
build/editor/index.min.js 38.5 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 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.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 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.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.12 kB
build/plugins/index.min.js 1.98 kB
build/preferences/index.min.js 1.2 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 611 B
build/react-i18n/index.min.js 704 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.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.94 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@talldan talldan self-assigned this Feb 28, 2022
@talldan talldan changed the title Migrate post editor preferences to use new preferences package Migrate post editor feature preferences to use new preferences package Feb 28, 2022
@talldan
Copy link
Contributor Author

talldan commented Feb 28, 2022

Something to note is that there are still some persisted preferences left in the post editor after this change:

export const preferences = flow( [
combineReducers,
createWithInitialState( PREFERENCES_DEFAULTS ),
] )( {
panels( state, action ) {
switch ( action.type ) {
case 'TOGGLE_PANEL_ENABLED': {
const { panelName } = action;
return {
...state,
[ panelName ]: {
...state[ panelName ],
enabled: ! get( state, [ panelName, 'enabled' ], true ),
},
};
}
case 'TOGGLE_PANEL_OPENED': {
const { panelName } = action;
const isOpen =
state[ panelName ] === true ||
get( state, [ panelName, 'opened' ], false );
return {
...state,
[ panelName ]: {
...state[ panelName ],
opened: ! isOpen,
},
};
}
}
return state;
},
editorMode( state, action ) {
if ( action.type === 'SWITCH_MODE' ) {
return action.mode;
}
return state;
},
hiddenBlockTypes( state, action ) {
switch ( action.type ) {
case 'SHOW_BLOCK_TYPES':
return without( state, ...action.blockNames );
case 'HIDE_BLOCK_TYPES':
return union( state, action.blockNames );
}
return state;
},
preferredStyleVariations( state, action ) {
switch ( action.type ) {
case 'UPDATE_PREFERRED_STYLE_VARIATIONS': {
if ( ! action.blockName ) {
return state;
}
if ( ! action.blockStyle ) {
return omit( state, [ action.blockName ] );
}
return {
...state,
[ action.blockName ]: action.blockStyle,
};
}
}
return state;
},
localAutosaveInterval( state, action ) {
switch ( action.type ) {
case 'UPDATE_LOCAL_AUTOSAVE_INTERVAL':
return action.interval;
}
return state;
},
} );

Here's the list:

Panel preferences

This stores and persists whether a panel is open or closed. This is probably more of an interface package responsibility. I don't know if this could use the existing enableItem API from the interface package. I'll try this in a separate PR. It'll require some custom code to migrate the local storage data.

Block Preferences

There are a coupe of different types of block preferences—hiddenBlockTypes (used for the block manager) and preferredStyleVariations (used for style variations).

Should we consider using @wordpress/preferences for these? This is technically possible (though perhaps would use the API in a slightly unexpected way with compound keys), but I wonder if it's the right thing to do. Is the preferences package a way to persist anything? Or is it a way to store more general WordPress settings?

I feel like it be concerned only with more general WordPress settings, but I'd be interested to hear other thoughts.

Local autosave interval and editor mode (visual or code editor)

These both seem like ok things to store in the new preferences packages.

They'll require some custom migration code for local storage data, so I think I'll do this in a separate PR.

@talldan talldan force-pushed the migrate/edit-post-to-use-new-preferences branch from 6cc033f to c79bdba Compare February 28, 2022 09:07
@youknowriad
Copy link
Contributor

@talldan In this comment #39115 (comment) you seem to suggest that some preferences are not suited for the "preferences" package. Can you help understand why is that? and how to know if it's suitable or not. I guess for me, all preferences should be handled by the package.

@talldan
Copy link
Contributor Author

talldan commented Feb 28, 2022

@youknowriad I'm wondering where we draw the line on some things. I think there are some parts of the post editor's preferences reducer that are not preferences in the traditional sense.

For example the panels reducer remembers whether a panel is collapsed or expanded. This could be implemented in the preferences store, but I don't know if it's a preference, it's just persisting a user's action.

I think this kind of use case (UI state) is quite a common one. IIRC there's been some similar feedback about the design tools (#38219 (comment)).

At the same time, the interface store also has a similar feature for storing UI state, which it uses to keep track of pinned items. But maybe the answer is to also make everything in interface use preferences too.

At that point we're using preferences just for its ability to persist things rather than purely for WordPress user settings.

@youknowriad
Copy link
Contributor

At that point we're using preferences just for its ability to persist things rather than purely for WordPress user settings.

I guess that was my initial thinking: a package used to persist and interact with preferences rather than a package that defines the "WordPress preferences" that can be accessed/edited.

In a sense, the difference between "@wordpress/data" and "@wordpress/core-data". I see the preferences package as the "data" package (the generic layer) but not the "core-data" (the usage of the data package to access WP data)

@talldan
Copy link
Contributor Author

talldan commented Mar 1, 2022

I guess that was my initial thinking: a package used to persist and interact with preferences rather than a package that defines the "WordPress preferences" that can be accessed/edited.

In a sense, the difference between "@wordpress/data" and "@wordpress/core-data". I see the preferences package as the "data" package (the generic layer) but not the "core-data" (the usage of the data package to access WP data)

I think it's ok for it to evolve in that way, it's pretty much a blank canvas right now.

I'll work on some separate PRs for those preferences mentioned and then we can see how that looks and whether we want to change the API in any way 👍

@noisysocks
Copy link
Member

In a sense, the difference between "@wordpress/data" and "@wordpress/core-data". I see the preferences package as the "data" package (the generic layer) but not the "core-data" (the usage of the data package to access WP data)

Yeah this makes sense to me. I don't think we'd ever need @wordpress/core-preferences, though, as all of the APIs in @wordpress/preferences are "stringly" typed. That is, it's a dumb key value store and it's up to the caller to apply meaning to it.

Copy link
Member

@noisysocks noisysocks left a comment

Choose a reason for hiding this comment

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

Looks good and tests well! 👍

Could be a good chance to update those E2E selectors to something more resilient, but only if you can be bothered.

@@ -359,7 +359,10 @@ persistencePlugin.__unstableMigrate = ( pluginOptions ) => {
persistence,
Copy link
Member

Choose a reason for hiding this comment

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

A few lines above this we have a comment about WordPress 6.0. What's up with that? I imagine this stuff needs to stay around forever, no?

Copy link
Contributor Author

@talldan talldan Mar 2, 2022

Choose a reason for hiding this comment

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

Hmm, I don't know what the policy is, that note is definitely outdated though, I'll remove it for now. There were some previous very old migrations in the past that had a note to remove them, so I did that. Was that a bad idea? 😄

Maybe it's worth being a bit more careful now that there are a few preferences that affect accessibility.

Previously the functionality tied to this was fairly minor (fullscreen mode, top toolbar).

Copy link
Member

Choose a reason for hiding this comment

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

It depends what the migrations did 😀

If e.g. WordPress 5.0 stored something in localStorage in an old format then WordPress 6.0 needs to be able to migrate that.

If it was only ever in the Gutenberg plugin then we can safely delete the migration after a few versions.

Copy link
Member

Choose a reason for hiding this comment

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

(Mind you, "needs" is a strong word, it's not very impactful when migration doesn't work as localStorage tends to be cleared by the user periodically anyway.)

@@ -14,7 +14,7 @@ import { toggleMoreMenu } from './toggle-more-menu';

const SELECTORS = {
postEditorMenuContainer:
'//*[contains(concat(" ", @class, " "), " edit-post-more-menu__content ")]',
'//*[contains(concat(" ", @class, " "), " interface-more-menu-dropdown__content ")]',
Copy link
Member

Choose a reason for hiding this comment

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

Can we target using something that's user oriented e.g. ARIA label?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Could be tricky as the block toolbar has an identical label for its settings menu.

I would like to get rid of this logic that uses a different class name for the site editor:

const SELECTORS = {
postEditorMenuContainer:
'//*[contains(concat(" ", @class, " "), " edit-post-more-menu__content ")]',
siteEditorMenuContainer:
'//*[contains(concat(" ", @class, " "), " edit-site-more-menu__content ")]',
};

I'll be able to remove that once I've done the migration for the site editor, so at that point I'll loop back and improve this.

Copy link
Contributor

Choose a reason for hiding this comment

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

In my experience user-facing labels change more often than classnames 😅
It's always a compromise with e2e selectors; it's not a huge deal if we have to change them once in a while. Classnames also tend to be more unique than aria-labels.

@@ -11,16 +11,16 @@ describe( 'popovers', () => {
describe( 'dropdown', () => {
it( 'toggles via click', async () => {
const isMoreMenuOpen = async () =>
!! ( await page.$( '.edit-post-more-menu__content' ) );
!! ( await page.$( '.interface-more-menu-dropdown__content' ) );
Copy link
Member

Choose a reason for hiding this comment

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

Same again here. Could be a good opportunity to make these tests less dependent on implementation details such as class name.

Comment on lines 150 to +151
export const toggleFeature = ( feature ) => ( { registry } ) =>
registry
.dispatch( interfaceStore )
.toggleFeature( 'core/edit-post', feature );
registry.dispatch( preferencesStore ).toggle( 'core/edit-post', feature );
Copy link
Member

Choose a reason for hiding this comment

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

Yes I think we should deprecate it. Otherwise future devs will mistakenly use this one. Since it is a method that made it into Core, we can't remove the method, but that's okay.

Copy link
Contributor

@tellthemachines tellthemachines left a comment

Choose a reason for hiding this comment

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

Code looks good and tests OK! Is the plan to merge this one first or wait until #39132 is ready?

MoreMenuDropdown,
ActionItem,
Copy link
Contributor

Choose a reason for hiding this comment

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

Was this an accident?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Seems like it. I'll switch it back as I like alphabetical order.

Comment on lines 150 to +151
export const toggleFeature = ( feature ) => ( { registry } ) =>
registry
.dispatch( interfaceStore )
.toggleFeature( 'core/edit-post', feature );
registry.dispatch( preferencesStore ).toggle( 'core/edit-post', feature );
Copy link
Contributor

Choose a reason for hiding this comment

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

What form could that deprecation take?

I'm thinking we could add some sort of message in the actions and selectors but we might never be able to remove them altogether without risk of breaking things for plugins. It would be good to update usage in this codebase anyway, to make sure we're setting the right example (definitely a follow-up job though!)

@talldan
Copy link
Contributor Author

talldan commented Mar 2, 2022

Is the plan to merge this one first or wait until #39132 is ready?

I'll merge this first now it's approved. Thanks for the reviews ❤️

@talldan talldan merged commit fc595ba into trunk Mar 2, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Edit Post /packages/edit-post [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants