From 45945e2c090be078f823e0dea37423c88e3caf5d Mon Sep 17 00:00:00 2001 From: Chrissi2812 Date: Mon, 25 Feb 2019 16:20:02 +0100 Subject: [PATCH] make options for extensions reactive changing options will call the update method off the extension. --- packages/tiptap/src/Editor.js | 4 ++++ packages/tiptap/src/Utils/Extension.js | 4 ++++ packages/tiptap/src/Utils/ExtensionManager.js | 22 +++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/packages/tiptap/src/Editor.js b/packages/tiptap/src/Editor.js index 36df54ab..053e3b24 100644 --- a/packages/tiptap/src/Editor.js +++ b/packages/tiptap/src/Editor.js @@ -67,6 +67,10 @@ export default class Editor { view: this.view, state: this.state, }) + + // give extension manager access to our view and state + this.extensions.state = this.state + this.extensions.view = this.view } setOptions(options) { diff --git a/packages/tiptap/src/Utils/Extension.js b/packages/tiptap/src/Utils/Extension.js index 92461dbe..d6579eef 100644 --- a/packages/tiptap/src/Utils/Extension.js +++ b/packages/tiptap/src/Utils/Extension.js @@ -15,6 +15,10 @@ export default class Extension { return 'extension' } + get update() { + return () => {} + } + get defaultOptions() { return {} } diff --git a/packages/tiptap/src/Utils/ExtensionManager.js b/packages/tiptap/src/Utils/ExtensionManager.js index 2ced93f4..b5cce07b 100644 --- a/packages/tiptap/src/Utils/ExtensionManager.js +++ b/packages/tiptap/src/Utils/ExtensionManager.js @@ -15,6 +15,28 @@ export default class ExtensionManager { }), {}) } + get options() { + const { state, view } = this + return this.extensions + // { name, options, update = () => {} } + .reduce((nodes, extension) => ({ + ...nodes, + [extension.name]: new Proxy(extension.options, { + set(obj, prop, value) { + const changed = (obj[prop] !== value) + + obj[prop] = value + + if (changed) { + extension.update({ state, view }) + } + + return true + }, + }), + }), {}) + } + get marks() { return this.extensions .filter(extension => extension.type === 'mark')