vector-im-hydrogen-web/src/matrix/room/timeline/Timeline.js

72 lines
2.3 KiB
JavaScript
Raw Normal View History

import {SortedArray, MappedList, ConcatList} from "../../../observable/index.js";
import {Direction} from "./Direction.js";
import {TimelineReader} from "./persistence/TimelineReader.js";
import {PendingEventEntry} from "./entries/PendingEventEntry.js";
export class Timeline {
2020-03-21 23:40:40 +01:00
constructor({roomId, storage, closeCallback, fragmentIdComparer, pendingEvents, user}) {
this._roomId = roomId;
this._storage = storage;
this._closeCallback = closeCallback;
this._fragmentIdComparer = fragmentIdComparer;
this._remoteEntries = new SortedArray((a, b) => a.compare(b));
2019-05-19 20:49:46 +02:00
this._timelineReader = new TimelineReader({
roomId: this._roomId,
storage: this._storage,
fragmentIdComparer: this._fragmentIdComparer
});
const localEntries = new MappedList(pendingEvents, pe => {
return new PendingEventEntry({pendingEvent: pe, user});
}, (pee, params) => {
pee.notifyUpdate(params);
});
this._allEntries = new ConcatList(this._remoteEntries, localEntries);
}
/** @package */
async load() {
2019-06-16 17:29:33 +02:00
const entries = await this._timelineReader.readFromEnd(50);
this._remoteEntries.setManySorted(entries);
}
2020-05-07 19:14:53 +02:00
// TODO: should we rather have generic methods for
// - adding new entries
// - updating existing entries (redaction, relations)
/** @package */
appendLiveEntries(newEntries) {
this._remoteEntries.setManySorted(newEntries);
}
2020-03-21 23:40:40 +01:00
/** @package */
addGapEntries(newEntries) {
this._remoteEntries.setManySorted(newEntries);
2019-03-09 00:41:06 +01:00
}
2020-03-21 23:40:40 +01:00
// tries to prepend `amount` entries to the `entries` list.
2019-03-09 00:41:06 +01:00
async loadAtTop(amount) {
const firstEventEntry = this._remoteEntries.array.find(e => !!e.eventType);
2019-06-16 17:29:33 +02:00
if (!firstEventEntry) {
return;
2019-03-09 00:41:06 +01:00
}
const entries = await this._timelineReader.readFrom(
2019-06-16 17:29:33 +02:00
firstEventEntry.asEventKey(),
Direction.Backward,
amount
);
this._remoteEntries.setManySorted(entries);
}
/** @public */
get entries() {
return this._allEntries;
}
/** @public */
close() {
2020-05-04 22:21:56 +02:00
if (this._closeCallback) {
this._closeCallback();
this._closeCallback = null;
}
}
}