diff --git a/src/app.css b/src/app.css index 51ded9d..3c1737a 100644 --- a/src/app.css +++ b/src/app.css @@ -243,4 +243,9 @@ iframe[name="editor-canvas"] { .revision-content { max-width: 600px; +} + +.is-loading { + pointer-events: none; + opacity: 0.5; } \ No newline at end of file diff --git a/src/list.jsx b/src/list.jsx index fce5a3f..b7bbeb5 100644 --- a/src/list.jsx +++ b/src/list.jsx @@ -26,7 +26,13 @@ import { __ } from '@wordpress/i18n'; import { v4 as uuidv4 } from 'uuid'; import { motion } from 'framer-motion'; -import { Read, Write, saveFile, getTagsFromText } from './read-write'; +import { + Read, + Write, + saveFile, + getTagsFromText, + createRevisionName, +} from './read-write'; import Editor from './editor'; import Sidebar, { filterItems, INITIAL_VIEW } from './sidebar.jsx'; import { Revisions } from './revisions'; @@ -47,8 +53,8 @@ function getInitialSelection({ path, blocks }) { return { selectionStart: sel, selectionEnd: sel }; } -function refresh({ selectedFolderURL, items, setItems, setItem }) { - getPaths('', selectedFolderURL) +async function refresh({ selectedFolderURL, items, setItems, setItem }) { + await getPaths('', selectedFolderURL) .then((_paths) => { const pathObjects = _paths.map((_file) => ({ ..._file, @@ -135,6 +141,33 @@ export default function Frame({ selectedFolderURL, setSelectedFolderURL }) { const [observer, { width }] = useResizeObserver(); + const itemsRef = useRef(items); + + useEffect(() => { + itemsRef.current = items; + }, [items]); + + useEffect(() => { + function change() { + if (document.visibilityState === 'visible') { + currentRevisionRef.current = createRevisionName(); + document.body.classList.add('is-loading'); + refresh({ + selectedFolderURL, + items: itemsRef.current, + setItems, + setItem, + }).then(() => { + document.body.classList.remove('is-loading'); + }); + } + } + document.addEventListener('visibilitychange', change); + return () => { + document.removeEventListener('visibilitychange', change); + }; + }, [currentRevisionRef, selectedFolderURL, setItem]); + if (!currentId) { return null; } @@ -276,7 +309,7 @@ export default function Frame({ selectedFolderURL, setSelectedFolderURL }) { onClick={() => { refresh({ selectedFolderURL, - items, + items: itemsRef.current, setItems, setItem, }); diff --git a/src/read-write.js b/src/read-write.js index 0f7d88e..d77127a 100644 --- a/src/read-write.js +++ b/src/read-write.js @@ -8,7 +8,7 @@ import { } from '@wordpress/blocks'; import { decodeEntities } from '@wordpress/html-entities'; -function createRevisionName() { +export function createRevisionName() { return new Date().toISOString().replaceAll(':', '_'); } @@ -255,18 +255,6 @@ export function Write({ setItem, ]); - useEffect(() => { - function change() { - if (document.visibilityState === 'visible') { - currentRevisionRef.current = createRevisionName(); - } - } - document.addEventListener('visibilitychange', change); - return () => { - document.removeEventListener('visibilitychange', change); - }; - }, [currentRevisionRef]); - return null; }