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

40 lines
991 B
TypeScript
Raw Normal View History

2023-02-10 01:19:20 +00:00
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
2022-09-09 11:53:35 +00:00
import { Plugin } from 'prosemirror-state'
2022-10-21 10:17:38 +00:00
import type { EditorView } from 'prosemirror-view'
import type { ProseMirrorExtension } from '../helpers'
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)
})