@portabletext/editor
Version:
Portable Text Editor made in React
54 lines (49 loc) • 1.49 kB
text/typescript
import {isChangingRemotely} from '../../internal-utils/withChanges'
import {isRedoing, isUndoing} from '../../internal-utils/withUndoRedo'
import type {PortableTextSlateEditor} from '../../types/editor'
import type {EditorActor} from '../editor-machine'
/**
* This plugin makes sure that the PTE maxBlocks prop is respected
*
*/
export function createWithMaxBlocks(editorActor: EditorActor) {
return function withMaxBlocks(
editor: PortableTextSlateEditor,
): PortableTextSlateEditor {
const {apply} = editor
editor.apply = (operation) => {
if (editorActor.getSnapshot().matches({'edit mode': 'read only'})) {
apply(operation)
return
}
/**
* We don't want to run any side effects when the editor is processing
* remote changes.
*/
if (isChangingRemotely(editor)) {
apply(operation)
return
}
/**
* We don't want to run any side effects when the editor is undoing or
* redoing operations.
*/
if (isUndoing(editor) || isRedoing(editor)) {
apply(operation)
return
}
const rows = editorActor.getSnapshot().context.maxBlocks ?? -1
if (rows > 0 && editor.children.length >= rows) {
if (
(operation.type === 'insert_node' ||
operation.type === 'split_node') &&
operation.path.length === 1
) {
return
}
}
apply(operation)
}
return editor
}
}