forked from mystiq/hydrogen-web
if shape is update and item should be different view, recreate the tile
This commit is contained in:
parent
77dca5dd55
commit
c9efee77f2
2 changed files with 46 additions and 7 deletions
|
@ -144,6 +144,21 @@ export class ListView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recreateItem(index, value) {
|
||||||
|
if (this._childInstances) {
|
||||||
|
const child = this._childCreator(value);
|
||||||
|
let oldChild;
|
||||||
|
if (child) {
|
||||||
|
oldChild = this._childInstances.splice(index, 1, child)[0];
|
||||||
|
this._root.replaceChild(child.mount(this._mountArgs), oldChild.root());
|
||||||
|
} else {
|
||||||
|
oldChild = this._childInstances.splice(index, 1)[0];
|
||||||
|
oldChild.root().remove();
|
||||||
|
}
|
||||||
|
oldChild.unmount();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onBeforeListChanged() {}
|
onBeforeListChanged() {}
|
||||||
onListChanged() {}
|
onListChanged() {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,17 @@ import {TextMessageView} from "./timeline/TextMessageView.js";
|
||||||
import {ImageView} from "./timeline/ImageView.js";
|
import {ImageView} from "./timeline/ImageView.js";
|
||||||
import {AnnouncementView} from "./timeline/AnnouncementView.js";
|
import {AnnouncementView} from "./timeline/AnnouncementView.js";
|
||||||
|
|
||||||
|
function viewClassForEntry(entry) {
|
||||||
|
switch (entry.shape) {
|
||||||
|
case "gap": return GapView;
|
||||||
|
case "announcement": return AnnouncementView;
|
||||||
|
case "message":
|
||||||
|
case "message-status":
|
||||||
|
return TextMessageView;
|
||||||
|
case "image": return ImageView;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class TimelineList extends ListView {
|
export class TimelineList extends ListView {
|
||||||
constructor(viewModel) {
|
constructor(viewModel) {
|
||||||
const options = {
|
const options = {
|
||||||
|
@ -27,13 +38,9 @@ export class TimelineList extends ListView {
|
||||||
list: viewModel.tiles,
|
list: viewModel.tiles,
|
||||||
}
|
}
|
||||||
super(options, entry => {
|
super(options, entry => {
|
||||||
switch (entry.shape) {
|
const View = viewClassForEntry(entry);
|
||||||
case "gap": return new GapView(entry);
|
if (View) {
|
||||||
case "announcement": return new AnnouncementView(entry);
|
return new View(entry);
|
||||||
case "message":
|
|
||||||
case "message-status":
|
|
||||||
return new TextMessageView(entry);
|
|
||||||
case "image": return new ImageView(entry);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this._atBottom = false;
|
this._atBottom = false;
|
||||||
|
@ -127,4 +134,21 @@ export class TimelineList extends ListView {
|
||||||
root.scrollTop = root.scrollHeight;
|
root.scrollTop = root.scrollHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onUpdate(index, value, param) {
|
||||||
|
if (param === "shape") {
|
||||||
|
if (this._childInstances) {
|
||||||
|
const ExpectedClass = viewClassForEntry(value);
|
||||||
|
const child = this._childInstances[index];
|
||||||
|
if (!ExpectedClass || !(child instanceof ExpectedClass)) {
|
||||||
|
// shape was updated, so we need to recreate the tile view,
|
||||||
|
// the shape parameter is set in EncryptedEventTile.updateEntry
|
||||||
|
// (and perhaps elsewhere by the time you read this)
|
||||||
|
super.recreateItem(index, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.onUpdate(index, value, param);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue