make options for extensions reactive
changing options will call the update method off the extension.
This commit is contained in:
@@ -67,6 +67,10 @@ export default class Editor {
|
|||||||
view: this.view,
|
view: this.view,
|
||||||
state: this.state,
|
state: this.state,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// give extension manager access to our view and state
|
||||||
|
this.extensions.state = this.state
|
||||||
|
this.extensions.view = this.view
|
||||||
}
|
}
|
||||||
|
|
||||||
setOptions(options) {
|
setOptions(options) {
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ export default class Extension {
|
|||||||
return 'extension'
|
return 'extension'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get update() {
|
||||||
|
return () => {}
|
||||||
|
}
|
||||||
|
|
||||||
get defaultOptions() {
|
get defaultOptions() {
|
||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
get marks() {
|
||||||
return this.extensions
|
return this.extensions
|
||||||
.filter(extension => extension.type === 'mark')
|
.filter(extension => extension.type === 'mark')
|
||||||
|
|||||||
Reference in New Issue
Block a user