UNPKG

@samepage/internal

Version:

Utilities used across modules - not meant for use by users directly

92 lines 3.88 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const mergeDocs_1 = tslib_1.__importDefault(require("../utils/mergeDocs")); const localAutomergeDb_1 = require("../utils/localAutomergeDb"); const apiClient_1 = tslib_1.__importDefault(require("./apiClient")); const loadAutomergeFromBase64_1 = tslib_1.__importDefault(require("./loadAutomergeFromBase64")); const saveAndApply_1 = tslib_1.__importDefault(require("./saveAndApply")); const types_1 = require("./types"); const UserOnlyError_1 = tslib_1.__importDefault(require("./UserOnlyError")); const automerge_1 = tslib_1.__importDefault(require("automerge")); const dispatchAppEvent_1 = tslib_1.__importDefault(require("./dispatchAppEvent")); const binaryToBase64_1 = tslib_1.__importDefault(require("./binaryToBase64")); const zod_1 = require("zod"); const acceptSharePageOperation = ({ ensurePageByTitle, openPage, deletePage, decodeState, encodeState, initPage, }) => async ({ $title, title: legacyTitle, page }) => { const parsedTitle = types_1.zSamePageSchema.safeParse($title); const title = parsedTitle.success ? parsedTitle.data : { content: legacyTitle, annotations: [] }; const result = await ensurePageByTitle(title); const { notebookPageId, preExisting } = typeof result === "string" ? { notebookPageId: result, preExisting: false } : result; return (0, apiClient_1.default)({ method: "join-shared-page", notebookPageId, pageUuid: await zod_1.z .string() .parseAsync(page) .catch(() => notebookPageId), title, }) .then(async (res) => { if (!res.found) return Promise.reject(new UserOnlyError_1.default(res.reason)); const saveDoc = (doc) => (0, saveAndApply_1.default)({ notebookPageId, doc, decodeState, properties: res.properties, }) .then(() => { initPage({ notebookPageId, }); }) .catch((e) => { (0, localAutomergeDb_1.deleteId)(notebookPageId); (0, apiClient_1.default)({ method: "disconnect-shared-page", notebookPageId, }).then(() => Promise.reject(e)); }); const doc = await (0, loadAutomergeFromBase64_1.default)(res.state); (0, localAutomergeDb_1.set)(notebookPageId, doc); if (preExisting) { const { $body: preExistingDoc, ...preExistingProperties } = await encodeState(notebookPageId); const mergedDoc = (0, mergeDocs_1.default)(doc, preExistingDoc); await (0, apiClient_1.default)({ method: "update-shared-page", changes: automerge_1.default.getChanges(doc, mergedDoc).map(binaryToBase64_1.default), notebookPageId, state: (0, binaryToBase64_1.default)(automerge_1.default.save(mergedDoc)), properties: { ...res.properties, ...preExistingProperties, }, }); await saveDoc(mergedDoc); } else await saveDoc(doc); (0, dispatchAppEvent_1.default)({ type: "log", id: "join-page-success", content: `Successfully connected to shared page ${title.content}!`, intent: "success", }); return openPage(notebookPageId); }) .catch((e) => { if (!preExisting) deletePage(notebookPageId); (0, apiClient_1.default)({ method: "revert-page-join", notebookPageId, }); return Promise.reject(e); }); }; exports.default = acceptSharePageOperation; //# sourceMappingURL=acceptSharePageOperation.js.map