diff --git a/packages/tiptap-commands/src/commands/replaceText.js b/packages/tiptap-commands/src/commands/replaceText.js index 2df8b171..d7209cca 100644 --- a/packages/tiptap-commands/src/commands/replaceText.js +++ b/packages/tiptap-commands/src/commands/replaceText.js @@ -1,4 +1,4 @@ -export default function (range = null, type, attrs = {}) { +export default function (range = null, type, content = []) { return (state, dispatch) => { const { $from, $to } = state.selection const index = $from.index() @@ -10,7 +10,7 @@ export default function (range = null, type, attrs = {}) { } if (dispatch) { - dispatch(state.tr.replaceWith(from, to, type.create(attrs))) + dispatch(state.tr.replaceWith(from, to, content)) } return true diff --git a/packages/tiptap-extensions/src/nodes/Mention.js b/packages/tiptap-extensions/src/nodes/Mention.js index 380af809..25cd2b72 100644 --- a/packages/tiptap-extensions/src/nodes/Mention.js +++ b/packages/tiptap-extensions/src/nodes/Mention.js @@ -25,6 +25,16 @@ export default class Mention extends Node { return dom.innerText.split(this.options.matcher.char).join('') } + createFragment(schema, label) { + return Fragment.fromJSON(schema, [{ type: 'text', text: `${this.options.matcher.char}${label}` }]) + } + + insertMention(range, attrs, schema) { + const nodeType = schema.nodes[this.name] + const content = nodeType.create(attrs, this.createFragment(schema, attrs.label)) + return replaceText(range, nodeType, content) + } + get schema() { return { attrs: { @@ -54,10 +64,7 @@ export default class Mention extends Node { }, getContent: (dom, schema) => { const label = this.getLabel(dom) - return Fragment.fromJSON(schema, [{ - type: 'text', - text: `${this.options.matcher.char}${label}`, - }]) + return this.createFragment(schema, label) }, }, ], @@ -65,13 +72,13 @@ export default class Mention extends Node { } commands({ schema }) { - return attrs => replaceText(null, schema.nodes[this.name], attrs) + return attrs => this.insertMention(null, attrs, schema) } get plugins() { return [ SuggestionsPlugin({ - command: ({ range, attrs, schema }) => replaceText(range, schema.nodes[this.name], attrs), + command: ({ range, attrs, schema }) => this.insertMention(range, attrs, schema), appendText: ' ', matcher: this.options.matcher, items: this.options.items,