UNPKG

@portabletext/editor

Version:

Portable Text Editor made in React

85 lines (78 loc) 2.87 kB
import type {BaseOperation, Editor, Node, NodeEntry} from 'slate' import type {PortableTextSlateEditor} from '../../types/editor' import type {EditorActor} from '../editor-machine' import type {RelayActor} from '../relay-machine' import {createWithEventListeners} from './create-with-event-listeners' import {createWithMaxBlocks} from './createWithMaxBlocks' import {createWithObjectKeys} from './createWithObjectKeys' import {createWithPatches} from './createWithPatches' import {createWithPlaceholderBlock} from './createWithPlaceholderBlock' import {createWithPortableTextMarkModel} from './createWithPortableTextMarkModel' import {createWithSchemaTypes} from './createWithSchemaTypes' import {createWithUndoRedo} from './createWithUndoRedo' import {createWithUtils} from './createWithUtils' import {pluginUpdateSelection} from './slate-plugin.update-selection' import {pluginUpdateValue} from './slate-plugin.update-value' export interface OriginalEditorFunctions { apply: (operation: BaseOperation) => void onChange: () => void normalizeNode: (entry: NodeEntry<Node>) => void } type PluginsOptions = { editorActor: EditorActor relayActor: RelayActor subscriptions: Array<() => () => void> } export const withPlugins = <T extends Editor>( editor: T, options: PluginsOptions, ): PortableTextSlateEditor => { const e = editor as T & PortableTextSlateEditor const {editorActor, relayActor} = options const withObjectKeys = createWithObjectKeys(editorActor) const withSchemaTypes = createWithSchemaTypes({ editorActor, }) const withPatches = createWithPatches({ editorActor, relayActor, subscriptions: options.subscriptions, }) const withMaxBlocks = createWithMaxBlocks(editorActor) const withUndoRedo = createWithUndoRedo({ editorActor, subscriptions: options.subscriptions, }) const withPortableTextMarkModel = createWithPortableTextMarkModel(editorActor) const withPlaceholderBlock = createWithPlaceholderBlock(editorActor) const withUtils = createWithUtils({ editorActor, }) const withEventListeners = createWithEventListeners(editorActor) // Ordering is important here, selection dealing last, data manipulation in the middle and core model stuff first. return withEventListeners( withSchemaTypes( withObjectKeys( withPortableTextMarkModel( withPlaceholderBlock( withUtils( withMaxBlocks( withUndoRedo( withPatches( pluginUpdateValue( editorActor.getSnapshot().context, pluginUpdateSelection({ editorActor, editor: e, }), ), ), ), ), ), ), ), ), ), ) }