diff --git a/docs/designers-developers/developers/data/data-core-editor.md b/docs/designers-developers/developers/data/data-core-editor.md
index 356688f6618718..1cf2a7cf6e297b 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_
@@ -1153,11 +1156,6 @@ _Related_
- insertDefaultBlock in core/block-editor store.
-# **localAutosave**
-
-Action generator used in signalling that the post should be locally
-autosaved (e.g. on the Web, it might be committed to Session Storage).
-
# **lockPostAutosaving**
Returns an action object used to signal that post autosaving is locked.
diff --git a/packages/e2e-tests/specs/editor/various/autosave.test.js b/packages/e2e-tests/specs/editor/various/autosave.test.js
index 51382e6e41a2d8..ef0522dc9d990e 100644
--- a/packages/e2e-tests/specs/editor/various/autosave.test.js
+++ b/packages/e2e-tests/specs/editor/various/autosave.test.js
@@ -103,7 +103,7 @@ describe( 'autosave', () => {
// Trigger local autosave
await page.evaluate( () =>
- window.wp.data.dispatch( 'core/editor' ).localAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
// Reload without saving on the server
await page.reload();
@@ -205,7 +205,7 @@ describe( 'autosave', () => {
// Trigger local autosave
await page.evaluate( () =>
- window.wp.data.dispatch( 'core/editor' ).localAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
expect(
await page.evaluate( () => window.sessionStorage.length )
@@ -229,7 +229,7 @@ describe( 'autosave', () => {
// Trigger local autosave
await page.evaluate( () =>
- window.wp.data.dispatch( 'core/editor' ).localAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
expect(
await page.evaluate( () => window.sessionStorage.length )
@@ -254,7 +254,7 @@ describe( 'autosave', () => {
// Trigger local autosave
await page.evaluate( () =>
- window.wp.data.dispatch( 'core/editor' ).localAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
expect(
await page.evaluate( () => window.sessionStorage.length )
@@ -275,7 +275,7 @@ describe( 'autosave', () => {
// Trigger local autosave
await page.evaluate( () =>
- window.wp.data.dispatch( 'core/editor' ).localAutosave()
+ window.wp.data.dispatch( 'core/editor' ).autosave( { local: true } )
);
expect(
await page.evaluate( () => window.sessionStorage.length )
@@ -304,7 +304,7 @@ describe( 'autosave', () => {
// Force conflicting local autosave
await page.evaluate( () =>
- window.wp.data.dispatch( 'core/editor' ).localAutosave()
+ 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 07ba23d7a85027..aaf697bc70d946 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 { localAutosave } = useDispatch( 'core/editor' );
- const autosave = useCallback( () => {
- requestIdleCallback( localAutosave );
+ 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 bcb4b121b4d984..388368d205b6fa 100644
--- a/packages/editor/src/store/actions.js
+++ b/packages/editor/src/store/actions.js
@@ -342,40 +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 } );
-}
-
-/**
- * Action generator used in signalling that the post should be locally
- * autosaved (e.g. on the Web, it might be committed to Session Storage).
- */
-export function* localAutosave() {
- 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,
+ } );
+ }
}
/**