@samepage/internal
Version:
Utilities used across modules - not meant for use by users directly
92 lines • 3.88 kB
JavaScript
;
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