diff --git a/docs/designers-developers/developers/data/data-core-editor.md b/docs/designers-developers/developers/data/data-core-editor.md index ffba8e67b9aa3..1cf2a7cf6e297 100644 --- a/docs/designers-developers/developers/data/data-core-editor.md +++ b/docs/designers-developers/developers/data/data-core-editor.md @@ -1068,7 +1068,10 @@ _Related_ # **autosave** -Action generator used in signalling that the post should autosave. +Action generator used in signalling that the post should autosave. This +includes server-side autosaving (default) and client-side (a.k.a. local) +autosaving (e.g. on the Web, the post might be committed to Session +Storage). _Parameters_ diff --git a/packages/e2e-tests/specs/editor/various/autosave.test.js b/packages/e2e-tests/specs/editor/various/autosave.test.js index 34822f8c680aa..ef0522dc9d990 100644 --- a/packages/e2e-tests/specs/editor/various/autosave.test.js +++ b/packages/e2e-tests/specs/editor/various/autosave.test.js @@ -103,9 +103,7 @@ describe( 'autosave', () => { // Trigger local autosave await page.evaluate( () => - window.wp.data - .dispatch( 'core/editor' ) - .__experimentalLocalAutosave() + window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } ) ); // Reload without saving on the server await page.reload(); @@ -207,9 +205,7 @@ describe( 'autosave', () => { // Trigger local autosave await page.evaluate( () => - window.wp.data - .dispatch( 'core/editor' ) - .__experimentalLocalAutosave() + window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } ) ); expect( await page.evaluate( () => window.sessionStorage.length ) @@ -233,9 +229,7 @@ describe( 'autosave', () => { // Trigger local autosave await page.evaluate( () => - window.wp.data - .dispatch( 'core/editor' ) - .__experimentalLocalAutosave() + window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } ) ); expect( await page.evaluate( () => window.sessionStorage.length ) @@ -260,9 +254,7 @@ describe( 'autosave', () => { // Trigger local autosave await page.evaluate( () => - window.wp.data - .dispatch( 'core/editor' ) - .__experimentalLocalAutosave() + window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } ) ); expect( await page.evaluate( () => window.sessionStorage.length ) @@ -283,9 +275,7 @@ describe( 'autosave', () => { // Trigger local autosave await page.evaluate( () => - window.wp.data - .dispatch( 'core/editor' ) - .__experimentalLocalAutosave() + window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } ) ); expect( await page.evaluate( () => window.sessionStorage.length ) @@ -314,9 +304,7 @@ describe( 'autosave', () => { // Force conflicting local autosave await page.evaluate( () => - window.wp.data - .dispatch( 'core/editor' ) - .__experimentalLocalAutosave() + window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } ) ); expect( await page.evaluate( () => window.sessionStorage.length ) diff --git a/packages/editor/src/components/local-autosave-monitor/index.js b/packages/editor/src/components/local-autosave-monitor/index.js index e79fe0642b3af..aaf697bc70d94 100644 --- a/packages/editor/src/components/local-autosave-monitor/index.js +++ b/packages/editor/src/components/local-autosave-monitor/index.js @@ -169,9 +169,9 @@ function useAutosavePurge() { } function LocalAutosaveMonitor() { - const { __experimentalLocalAutosave } = useDispatch( 'core/editor' ); - const autosave = useCallback( () => { - requestIdleCallback( __experimentalLocalAutosave ); + const { autosave } = useDispatch( 'core/editor' ); + const deferedAutosave = useCallback( () => { + requestIdleCallback( () => autosave( { local: true } ) ); }, [] ); useAutosaveNotice(); useAutosavePurge(); @@ -187,7 +187,7 @@ function LocalAutosaveMonitor() { return ( ); } diff --git a/packages/editor/src/store/actions.js b/packages/editor/src/store/actions.js index d58fbef47254a..388368d205b6f 100644 --- a/packages/editor/src/store/actions.js +++ b/packages/editor/src/store/actions.js @@ -342,36 +342,46 @@ export function* trashPost() { } /** - * Action generator used in signalling that the post should autosave. + * Action generator used in signalling that the post should autosave. This + * includes server-side autosaving (default) and client-side (a.k.a. local) + * autosaving (e.g. on the Web, the post might be committed to Session + * Storage). * * @param {Object?} options Extra flags to identify the autosave. */ -export function* autosave( options ) { - yield dispatch( STORE_KEY, 'savePost', { isAutosave: true, ...options } ); -} - -export function* __experimentalLocalAutosave() { - const post = yield select( STORE_KEY, 'getCurrentPost' ); - const isPostNew = yield select( STORE_KEY, 'isEditedPostNew' ); - const title = yield select( STORE_KEY, 'getEditedPostAttribute', 'title' ); - const content = yield select( - STORE_KEY, - 'getEditedPostAttribute', - 'content' - ); - const excerpt = yield select( - STORE_KEY, - 'getEditedPostAttribute', - 'excerpt' - ); - yield { - type: 'LOCAL_AUTOSAVE_SET', - postId: post.id, - isPostNew, - title, - content, - excerpt, - }; +export function* autosave( { local = false, ...options } = {} ) { + if ( local ) { + const post = yield select( STORE_KEY, 'getCurrentPost' ); + const isPostNew = yield select( STORE_KEY, 'isEditedPostNew' ); + const title = yield select( + STORE_KEY, + 'getEditedPostAttribute', + 'title' + ); + const content = yield select( + STORE_KEY, + 'getEditedPostAttribute', + 'content' + ); + const excerpt = yield select( + STORE_KEY, + 'getEditedPostAttribute', + 'excerpt' + ); + yield { + type: 'LOCAL_AUTOSAVE_SET', + postId: post.id, + isPostNew, + title, + content, + excerpt, + }; + } else { + yield dispatch( STORE_KEY, 'savePost', { + isAutosave: true, + ...options, + } ); + } } /**