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

38 lines
921 B
TypeScript
Raw Normal View History

2022-09-09 11:53:35 +00:00
import { Plugin } from 'prosemirror-state'
import type { EditorView } from 'prosemirror-view'
2022-10-08 16:40:58 +00:00
import type { ProseMirrorExtension } from '../../store/state'
2022-09-09 11:53:35 +00:00
const scroll = (view: EditorView) => {
if (!view.state.selection.empty) return false
const pos = view.state.selection.$head.start()
const resolved = view.state.doc.resolve(pos)
if (resolved.parent.type.spec.code) return false
const dom = view.domAtPos(pos)
if (dom.node !== view.dom) {
scrollToElem(dom.node as Element)
}
}
const scrollToElem = (node: Element) => {
node.scrollIntoView({
block: 'center',
behavior: 'smooth'
})
}
const scrollIntoView = new Plugin({
props: {
handleDOMEvents: {
keyup: (view: EditorView) => {
scroll(view)
return false
}
}
}
})
export default (enabled: boolean): ProseMirrorExtension => ({
plugins: (prev) => (enabled ? [...prev, scrollIntoView] : prev)
})