From 4d2936627c841ab60d22e42cf694ed344b93f722 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Mon, 22 Jul 2024 11:02:43 +0100 Subject: [PATCH] fix: generate ydoc state during page import to prevent duplicate nodes on the editor --- .../src/collaboration/collaboration.util.ts | 4 ++- .../src/integrations/import/import.service.ts | 25 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/apps/server/src/collaboration/collaboration.util.ts b/apps/server/src/collaboration/collaboration.util.ts index 8f8c98a..e942f9f 100644 --- a/apps/server/src/collaboration/collaboration.util.ts +++ b/apps/server/src/collaboration/collaboration.util.ts @@ -29,7 +29,9 @@ import { } from '@docmost/editor-ext'; import { generateText, JSONContent } from '@tiptap/core'; import { generateHTML } from '../common/helpers/prosemirror/html'; -// default tiptap library works best generating prosemirror json state +// @tiptap/html library works best for generating prosemirror json state but not HTML +// see: https://github.com/ueberdosis/tiptap/issues/5352 +// see:https://github.com/ueberdosis/tiptap/issues/4089 import { generateJSON } from '@tiptap/html'; export const tiptapExtensions = [ diff --git a/apps/server/src/integrations/import/import.service.ts b/apps/server/src/integrations/import/import.service.ts index 175855f..f78666e 100644 --- a/apps/server/src/integrations/import/import.service.ts +++ b/apps/server/src/integrations/import/import.service.ts @@ -3,12 +3,17 @@ import { PageRepo } from '@docmost/db/repos/page/page.repo'; import { MultipartFile } from '@fastify/multipart'; import { sanitize } from 'sanitize-filename-ts'; import * as path from 'path'; -import { htmlToJson } from '../../collaboration/collaboration.util'; +import { + htmlToJson, + tiptapExtensions, +} from '../../collaboration/collaboration.util'; import { InjectKysely } from 'nestjs-kysely'; import { KyselyDB } from '@docmost/db/types/kysely.types'; import { generateSlugId } from '../../common/helpers'; import { generateJitteredKeyBetween } from 'fractional-indexing-jittered'; import { markdownToHtml } from './utils/marked.utils'; +import { TiptapTransformer } from '@hocuspocus/transformer'; +import * as Y from 'yjs'; @Injectable() export class ImportService { @@ -69,6 +74,7 @@ export class ImportService { slugId: generateSlugId(), title: pageTitle, content: prosemirrorJson, + ydoc: await this.createYdoc(prosemirrorJson), position: pagePosition, spaceId: spaceId, creatorId: userId, @@ -106,6 +112,23 @@ export class ImportService { } } + async createYdoc(prosemirrorJson: any): Promise { + if (prosemirrorJson) { + this.logger.debug(`Converting prosemirror json state to ydoc`); + + const ydoc = TiptapTransformer.toYdoc( + prosemirrorJson, + 'default', + tiptapExtensions, + ); + + Y.encodeStateAsUpdate(ydoc); + + return Buffer.from(Y.encodeStateAsUpdate(ydoc)); + } + return null; + } + extractTitleAndRemoveHeading(prosemirrorState: any) { let title = null;