diff --git a/app/srv/api/page-reload.ts b/app/srv/api/page-reload.ts new file mode 100644 index 00000000..cf17d694 --- /dev/null +++ b/app/srv/api/page-reload.ts @@ -0,0 +1,52 @@ +import { compress } from "lz-string"; +import { syncronize } from "y-pojo"; +import * as Y from "yjs"; +import { MPage } from "../../web/src/utils/types/general"; +import { WS_MSG_SET_PAGE, WS_MSG_SV_LOCAL } from "../../web/src/utils/types/ws"; +import { eg } from "../ws/edit/edit-global"; +import { loadPage } from "../ws/edit/tools/load-page"; + +export const _ = { + url: "/page-reload/:page_id", + async api(page_id: string) { + if (eg.edit.page[page_id]) { + const rawPage = await loadPage(page_id); + + if (rawPage) { + const ydoc = new Y.Doc() as MPage; + let root = ydoc.getMap("map"); + syncronize(root as any, rawPage); + const um = new Y.UndoManager(root, { ignoreRemoteMapChanges: true }); + const broadcast = () => { + const sv_local = compress( + Y.encodeStateVector(ydoc as any).toString() + ); + const broadcast: WS_MSG_SV_LOCAL = { + type: "sv_local", + sv_local, + mode: "page", + id: page_id, + }; + eg.edit.page[page_id].ws.forEach((w) => + w.send(JSON.stringify(broadcast)) + ); + }; + um.on("stack-item-added", broadcast); + um.on("stack-item-updated", broadcast); + + eg.edit.page[page_id].doc = ydoc; + eg.edit.page[page_id].undoManager = um; + + eg.edit.page[page_id].ws.forEach((w) => { + const sent: WS_MSG_SET_PAGE = { + type: "set_page", + changes: compress(Y.encodeStateAsUpdate(ydoc as any).toString()), + }; + w.send(JSON.stringify(sent)); + }); + } + } + + return "ok"; + }, +}; diff --git a/app/web/src/render/editor/logic/route.ts b/app/web/src/render/editor/logic/route.ts index 5a822e19..7e0eefd3 100644 --- a/app/web/src/render/editor/logic/route.ts +++ b/app/web/src/render/editor/logic/route.ts @@ -20,22 +20,13 @@ export const routeEditor = (p: PG, page_id: string) => { p.render(); if (!p.mpage || p.mpage.getMap("map").get("id") !== page_id) { - if (!loadingCounter[page_id]) { - loadingCounter[page_id] = 1; - } else { - loadingCounter[page_id]++; - } - - if (loadingCounter[page_id] > 2) { - p.status = "reload"; + p.status = "reload"; + await api.page_reload(page_id); + p.mpageLoaded = () => { + p.status = "ready"; p.render(); - p.mpageLoaded = () => { - p.status = "ready"; - p.render(); - }; - - await api.page_reload(page_id); - } + }; + p.render(); } }); }