UNPKG

@wordpress/editor

Version:
54 lines (53 loc) 1.78 kB
// 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