add store "pipe" method to modify data

This commit is contained in:
hippoz 2022-09-28 16:54:37 +03:00
parent d14b0c4282
commit 4d336e4a26
No known key found for this signature in database
GPG key ID: 7C52899193467641

View file

@ -10,6 +10,7 @@ let storeCallbackQueue = [];
class Store { class Store {
constructor(value=null, name="[no name]") { constructor(value=null, name="[no name]") {
this._handlers = new Set(); this._handlers = new Set();
this._pipes = new Set();
this.value = value; this.value = value;
this.name = name; this.name = name;
this._isInBatch = false; this._isInBatch = false;
@ -42,6 +43,16 @@ class Store {
}; };
} }
pipe(handler) {
storeLog(`[Pipe] (${this.name})`, "handler:", handler);
this._pipes.add(handler);
return () => {
storeLog(`[Remove Pipe] (${this.name})`);
this._pipes.delete(handler);
};
}
set(value) { set(value) {
if (value === this.value) if (value === this.value)
return; return;
@ -87,6 +98,8 @@ class Store {
return; return;
} }
this.value = this._applyPipes(this.value);
storeLog(`[Update] (${this.name}) Will queue ${this._handlers.size} handlers`, "value:", this.value, "handlers:", this._handlers); storeLog(`[Update] (${this.name}) Will queue ${this._handlers.size} handlers`, "value:", this.value, "handlers:", this._handlers);
const isRootNode = storeCallbackQueue.length === 0; const isRootNode = storeCallbackQueue.length === 0;
@ -98,6 +111,13 @@ class Store {
this.flushCallbackQueue(); this.flushCallbackQueue();
} }
} }
_applyPipes(value) {
this._pipes.forEach(p => {
value = p(value);
});
return value;
}
} }
function createAction(name, handler) { function createAction(name, handler) {
@ -694,7 +714,9 @@ export const allStores = {
typingStore, typingStore,
presenceStore, presenceStore,
unreadStore, unreadStore,
pluginStore,
setMessageInputEvent, setMessageInputEvent,
sendMessageAction,
}; };
selectedChannel.on((newSelectedChannel) => { selectedChannel.on((newSelectedChannel) => {