From cf0af775e3b6fcaa6201dc68f94c32c49e946b3a Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 17 Aug 2020 15:11:39 +0200 Subject: [PATCH] make SimpleTile inherit from ViewModel to use same update mechanism and have viewmodel infra available for tile --- src/domain/ViewModel.js | 4 ++++ src/domain/session/room/timeline/tiles/GapTile.js | 6 +++--- .../session/room/timeline/tiles/MessageTile.js | 2 +- .../session/room/timeline/tiles/SimpleTile.js | 13 ++++--------- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/domain/ViewModel.js b/src/domain/ViewModel.js index 4f73702a..bc35fabd 100644 --- a/src/domain/ViewModel.js +++ b/src/domain/ViewModel.js @@ -70,6 +70,10 @@ export class ViewModel extends EventEmitter { return result; } + updateOptions(options) { + this._options = Object.assign(this._options, options); + } + emitChange(changedProps) { if (this._options.emitChange) { this._options.emitChange(changedProps); diff --git a/src/domain/session/room/timeline/tiles/GapTile.js b/src/domain/session/room/timeline/tiles/GapTile.js index 3c868a64..e3ab04b1 100644 --- a/src/domain/session/room/timeline/tiles/GapTile.js +++ b/src/domain/session/room/timeline/tiles/GapTile.js @@ -29,16 +29,16 @@ export class GapTile extends SimpleTile { // prevent doing this twice if (!this._loading) { this._loading = true; - this.emitUpdate("isLoading"); + this.emitChange("isLoading"); try { await this._timeline.fillGap(this._entry, 10); } catch (err) { console.error(`timeline.fillGap(): ${err.message}:\n${err.stack}`); this._error = err; - this.emitUpdate("error"); + this.emitChange("error"); } finally { this._loading = false; - this.emitUpdate("isLoading"); + this.emitChange("isLoading"); } } } diff --git a/src/domain/session/room/timeline/tiles/MessageTile.js b/src/domain/session/room/timeline/tiles/MessageTile.js index 802918d7..74ba202c 100644 --- a/src/domain/session/room/timeline/tiles/MessageTile.js +++ b/src/domain/session/room/timeline/tiles/MessageTile.js @@ -62,7 +62,7 @@ export class MessageTile extends SimpleTile { const isContinuation = prev && prev instanceof MessageTile && prev.sender === this.sender; if (isContinuation !== this._isContinuation) { this._isContinuation = isContinuation; - this.emitUpdate("isContinuation"); + this.emitChange("isContinuation"); } } } diff --git a/src/domain/session/room/timeline/tiles/SimpleTile.js b/src/domain/session/room/timeline/tiles/SimpleTile.js index 04ba27d6..2ccb1d17 100644 --- a/src/domain/session/room/timeline/tiles/SimpleTile.js +++ b/src/domain/session/room/timeline/tiles/SimpleTile.js @@ -15,11 +15,12 @@ limitations under the License. */ import {UpdateAction} from "../UpdateAction.js"; +import {ViewModel} from "../../../../ViewModel.js"; -export class SimpleTile { +export class SimpleTile extends ViewModel { constructor({entry}) { + super(); this._entry = entry; - this._emitUpdate = null; } // view model props for all subclasses // hmmm, could also do instanceof ... ? @@ -38,12 +39,6 @@ export class SimpleTile { return false; } - emitUpdate(paramName) { - if (this._emitUpdate) { - this._emitUpdate(this, paramName); - } - } - get internalId() { return this._entry.asEventKey().toString(); } @@ -53,7 +48,7 @@ export class SimpleTile { } // TilesCollection contract below setUpdateEmit(emitUpdate) { - this._emitUpdate = emitUpdate; + this.updateOptions({emitChange: paramName => emitUpdate(this, paramName)}); } get upperEntry() {