@portabletext/editor
Version:
Portable Text Editor made in React
47 lines (39 loc) • 1.17 kB
text/typescript
import {applyOperationToPortableText} from '../../internal-utils/apply-operation-to-portable-text'
import {buildIndexMaps} from '../../internal-utils/build-index-maps'
import type {PortableTextSlateEditor} from '../../types/editor'
import type {EditorContext} from '../editor-snapshot'
export function pluginUpdateValue(
context: Pick<EditorContext, 'keyGenerator' | 'schema'>,
editor: PortableTextSlateEditor,
) {
const {apply} = editor
editor.apply = (operation) => {
if (operation.type === 'set_selection') {
apply(operation)
return
}
editor.value = applyOperationToPortableText(
context,
editor.value,
operation,
)
if (operation.type === 'insert_text' || operation.type === 'remove_text') {
// Inserting and removing text has no effect on index maps so there is
// no need to rebuild those.
apply(operation)
return
}
buildIndexMaps(
{
schema: context.schema,
value: editor.value,
},
{
blockIndexMap: editor.blockIndexMap,
listIndexMap: editor.listIndexMap,
},
)
apply(operation)
}
return editor
}