diff --git a/.changeset/itchy-swans-kick.md b/.changeset/itchy-swans-kick.md new file mode 100644 index 0000000000..b0c01a8b42 --- /dev/null +++ b/.changeset/itchy-swans-kick.md @@ -0,0 +1,5 @@ +--- +'@udecode/plate-yjs': patch +--- + +Allow BYO provider instead of plate hocuspocus setup. diff --git a/packages/yjs/src/lib/BaseYjsPlugin.ts b/packages/yjs/src/lib/BaseYjsPlugin.ts index 84ec0c97c3..d6ec783576 100644 --- a/packages/yjs/src/lib/BaseYjsPlugin.ts +++ b/packages/yjs/src/lib/BaseYjsPlugin.ts @@ -13,7 +13,7 @@ export type YjsConfig = PluginConfig< { isConnected: boolean; isSynced: boolean; - provider: HocuspocusProvider; + provider?: HocuspocusProvider; /** WithCursors options */ cursorOptions?: WithCursorsOptions; disableCursors?: boolean; @@ -34,11 +34,26 @@ export const BaseYjsPlugin = createTSlatePlugin({ options: { isConnected: false, isSynced: false, - provider: {} as any, }, }).extend(({ getOptions, setOption }) => { - const { hocuspocusProviderOptions } = getOptions(); + const { hocuspocusProviderOptions, provider } = getOptions(); + if (provider) { + provider.on('connect', () => { + setOption('isConnected', true); + }); + provider.on('disconnect', () => { + setOption('isConnected', false); + setOption('isSynced', false); + }); + provider.on('synced', () => { + setOption('isSynced', true); + }); + + return { + options: { provider }, + }; + } if (!hocuspocusProviderOptions) { throw new Error('HocuspocusProvider configuration is required'); } @@ -48,9 +63,9 @@ export const BaseYjsPlugin = createTSlatePlugin({ * connected ydoc, is not destroyed, the changes will be synced to other * clients via the connected server. */ - const provider = new HocuspocusProvider({ + const defaultProvider = new HocuspocusProvider({ ...hocuspocusProviderOptions, - onAwarenessChange() {}, + onAwarenessChange() { }, onConnect() { setOption('isConnected', true); hocuspocusProviderOptions.onConnect?.(); @@ -67,6 +82,6 @@ export const BaseYjsPlugin = createTSlatePlugin({ }); return { - options: { provider }, + options: { provider: defaultProvider }, }; }); diff --git a/packages/yjs/src/lib/withPlateYjs.ts b/packages/yjs/src/lib/withPlateYjs.ts index 3f511af0f0..eb291d9956 100644 --- a/packages/yjs/src/lib/withPlateYjs.ts +++ b/packages/yjs/src/lib/withPlateYjs.ts @@ -17,6 +17,9 @@ export const withPlateYjs: ExtendEditor = ({ // not reactive const { cursorOptions, disableCursors, provider, yjsOptions } = getOptions(); + if (!provider) + throw new Error('HocuspocusProvider configuration is required'); + const sharedType = provider.document.get( 'content', Y.XmlText diff --git a/yarn.lock b/yarn.lock index a8c5023f85..40a064e9e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6360,7 +6360,7 @@ __metadata: resolution: "@udecode/plate-ai@workspace:packages/ai" dependencies: "@udecode/plate-combobox": "npm:44.0.0" - "@udecode/plate-markdown": "npm:46.0.3" + "@udecode/plate-markdown": "npm:46.0.8" "@udecode/plate-selection": "npm:46.0.4" ai: "npm:^3.4.33" lodash: "npm:^4.17.21" @@ -6832,7 +6832,7 @@ __metadata: languageName: unknown linkType: soft -"@udecode/plate-markdown@npm:46.0.3, @udecode/plate-markdown@workspace:^, @udecode/plate-markdown@workspace:packages/markdown": +"@udecode/plate-markdown@npm:46.0.8, @udecode/plate-markdown@workspace:^, @udecode/plate-markdown@workspace:packages/markdown": version: 0.0.0-use.local resolution: "@udecode/plate-markdown@workspace:packages/markdown" dependencies: