webapp/src/components/Editor/prosemirror/extension/collab.ts

31 lines
938 B
TypeScript
Raw Normal View History

2022-09-09 11:53:35 +00:00
import { ySyncPlugin, yCursorPlugin, yUndoPlugin } from 'y-prosemirror'
import type { ProseMirrorExtension } from '../state'
2022-10-07 19:35:53 +00:00
import type { PeerData } from '../context'
2022-09-09 11:53:35 +00:00
2022-10-07 19:35:53 +00:00
export const cursorBuilder = (user: {
name: string
foreground: string
background: string
}): HTMLElement => {
2022-09-09 11:53:35 +00:00
const cursor = document.createElement('span')
2022-10-07 19:35:53 +00:00
const userDiv = document.createElement('span')
2022-09-09 11:53:35 +00:00
cursor.classList.add('ProseMirror-yjs-cursor')
cursor.setAttribute('style', `border-color: ${user.background}`)
userDiv.setAttribute('style', `background-color: ${user.background}; color: ${user.foreground}`)
userDiv.textContent = user.name
cursor.append(userDiv)
return cursor
}
2022-10-07 19:35:53 +00:00
export default (y: PeerData): ProseMirrorExtension => ({
2022-09-09 11:53:35 +00:00
plugins: (prev) =>
y
? [
...prev,
2022-10-07 19:35:53 +00:00
ySyncPlugin(y.payload),
2022-09-09 11:53:35 +00:00
yCursorPlugin(y.provider.awareness, { cursorBuilder }),
yUndoPlugin()
]
: prev
})