@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
54 lines (53 loc) • 1.78 kB
JavaScript
// packages/editor/src/components/autosave-monitor/index.js
import { useEffect, useRef } from "@wordpress/element";
import { useSelect, useDispatch } from "@wordpress/data";
import { store as coreStore } from "@wordpress/core-data";
import { store as editorStore } from "../../store/index.mjs";
function useInterval(callback, intervalInSeconds) {
const callbackRef = useRef(callback);
useEffect(() => {
callbackRef.current = callback;
}, [callback]);
useEffect(() => {
if (!intervalInSeconds) {
return;
}
const id = setInterval(
() => callbackRef.current(),
intervalInSeconds * 1e3
);
return () => clearInterval(id);
}, [intervalInSeconds]);
}
function AutosaveMonitor({ interval, autosave }) {
const { autosave: autosaveAction } = useDispatch(editorStore);
const triggerAutosave = autosave ?? autosaveAction;
const { getReferenceByDistinctEdits } = useSelect(coreStore);
const { isEditedPostDirty, isEditedPostAutosaveable, isAutosavingPost } = useSelect(editorStore);
const autosaveInterval = useSelect(
(select) => {
if (interval !== void 0) {
return interval;
}
return select(editorStore).getEditorSettings().autosaveInterval;
},
[interval]
);
const lastEditsReferenceRef = useRef();
useInterval(() => {
if (!isEditedPostAutosaveable()) {
return;
}
const editsReference = getReferenceByDistinctEdits();
const hasNewEdits = editsReference !== lastEditsReferenceRef.current;
if (hasNewEdits && isEditedPostDirty() && !isAutosavingPost()) {
lastEditsReferenceRef.current = editsReference;
triggerAutosave();
}
}, autosaveInterval);
return null;
}
export {
AutosaveMonitor as default
};
//# sourceMappingURL=index.mjs.map