feat: update page content

This commit is contained in:
Philipinho
2026-01-16 22:18:52 +00:00
parent bcb004af21
commit c93ea6cfc9
6 changed files with 119 additions and 9 deletions
@@ -64,6 +64,10 @@ export class CollaborationGateway {
return this.hocuspocus.getDocumentsCount();
}
openDirectConnection(documentName: string, context?: any) {
return this.hocuspocus.openDirectConnection(documentName, context);
}
async destroy(): Promise<void> {
await this.hocuspocus.destroy();
}
@@ -43,6 +43,7 @@ import { generateHTML, generateJSON } from '../common/helpers/prosemirror/html';
// see: https://github.com/ueberdosis/tiptap/issues/5352
// see:https://github.com/ueberdosis/tiptap/issues/4089
import { Node } from '@tiptap/pm/model';
import * as Y from 'yjs';
export const tiptapExtensions = [
StarterKit.configure({
@@ -116,3 +117,32 @@ export function jsonToNode(tiptapJson: JSONContent) {
export function getPageId(documentName: string) {
return documentName.split('.')[1];
}
export function prosemirrorNodeToYElement(node: any): Y.XmlElement | Y.XmlText {
if (node.type === 'text') {
const ytext = new Y.XmlText();
ytext.insert(0, node.text || '');
if (node.marks?.length > 0) {
const attrs: Record<string, any> = {};
for (const mark of node.marks) {
attrs[mark.type] = mark.attrs || true;
}
ytext.format(0, node.text?.length || 0, attrs);
}
return ytext;
}
const element = new Y.XmlElement(node.type);
if (node.attrs) {
for (const [key, value] of Object.entries(node.attrs)) {
if (value !== null && value !== undefined) {
element.setAttribute(key, value as any);
}
}
}
if (node.content?.length > 0) {
const children = node.content.map(prosemirrorNodeToYElement);
element.insert(0, children);
}
return element;
}
@@ -179,7 +179,7 @@ export class PersistenceExtension implements Extension {
async onChange(data: onChangePayload) {
const documentName = data.documentName;
const userId = data.context?.user.id;
const userId = data.context?.user?.id;
if (!userId) return;
if (!this.contributors.has(documentName)) {