diff --git a/src/models/event-timeline-set.ts b/src/models/event-timeline-set.ts index d24252516..aa4d307bc 100644 --- a/src/models/event-timeline-set.ts +++ b/src/models/event-timeline-set.ts @@ -27,6 +27,7 @@ import { Relations } from './relations'; import { Room } from "./room"; import { Filter } from "../filter"; import { EventType, RelationType } from "../@types/event"; +import { RoomState } from "./room-state"; // var DEBUG = false; const DEBUG = true; @@ -45,6 +46,11 @@ interface IOpts { unstableClientRelationAggregation?: boolean; } +export enum DuplicateStrategy { + Ignore = "ignore", + Replace = "replace", +} + export class EventTimelineSet extends EventEmitter { private readonly timelineSupport: boolean; private unstableClientRelationAggregation: boolean; @@ -509,8 +515,14 @@ export class EventTimelineSet extends EventEmitter { * @param {MatrixEvent} event Event to be added * @param {string?} duplicateStrategy 'ignore' or 'replace' * @param {boolean} fromCache whether the sync response came from cache + * @param {boolean} fromCache whether the sync response came from cache */ - public addLiveEvent(event: MatrixEvent, duplicateStrategy?: "ignore" | "replace", fromCache = false): void { + public addLiveEvent( + event: MatrixEvent, + duplicateStrategy: DuplicateStrategy = DuplicateStrategy.Ignore, + fromCache = false, + roomState?: RoomState, + ): void { if (this.filter) { const events = this.filter.filterRoomTimeline([event]); if (!events.length) { @@ -527,9 +539,12 @@ export class EventTimelineSet extends EventEmitter { for (let j = 0; j < tlEvents.length; j++) { if (tlEvents[j].getId() === event.getId()) { // still need to set the right metadata on this event + if (!roomState) { + timeline.getState(EventTimeline.FORWARDS); + } EventTimeline.setEventMetadata( event, - timeline.getState(EventTimeline.FORWARDS), + roomState, false, ); tlEvents[j] = event; @@ -545,7 +560,7 @@ export class EventTimelineSet extends EventEmitter { return; } - this.addEventToTimeline(event, this.liveTimeline, false, fromCache); + this.addEventToTimeline(event, this.liveTimeline, false, fromCache, roomState); } /** @@ -566,9 +581,10 @@ export class EventTimelineSet extends EventEmitter { timeline: EventTimeline, toStartOfTimeline: boolean, fromCache = false, + roomState?: RoomState, ) { const eventId = event.getId(); - timeline.addEvent(event, toStartOfTimeline); + timeline.addEvent(event, toStartOfTimeline, roomState); this._eventIdToTimeline[eventId] = timeline; this.setRelationsTarget(event); diff --git a/src/models/event-timeline.ts b/src/models/event-timeline.ts index 819469bcd..f755fb647 100644 --- a/src/models/event-timeline.ts +++ b/src/models/event-timeline.ts @@ -347,8 +347,11 @@ export class EventTimeline { * @param {MatrixEvent} event new event * @param {boolean} atStart true to insert new event at the start */ - public addEvent(event: MatrixEvent, atStart: boolean): void { - const stateContext = atStart ? this.startState : this.endState; + public addEvent(event: MatrixEvent, atStart: boolean, stateContext?: RoomState): void { + if (!stateContext) { + stateContext = atStart ? this.startState : this.endState; + } + const timelineSet = this.getTimelineSet(); if (timelineSet.room) { diff --git a/src/models/thread.ts b/src/models/thread.ts index 1428980bc..6ae789ee8 100644 --- a/src/models/thread.ts +++ b/src/models/thread.ts @@ -17,7 +17,8 @@ limitations under the License. import { EventEmitter } from "events"; import { MatrixClient } from "../matrix"; import { MatrixEvent } from "./event"; -import { EventTimelineSet } from './event-timeline-set'; +import { EventTimeline } from "./event-timeline"; +import { EventTimelineSet, DuplicateStrategy } from './event-timeline-set'; import { Room } from './room'; export enum ThreadEvent { @@ -72,8 +73,10 @@ export class Thread extends EventEmitter { this.root = event.getId(); } + const roomState = this.room.getLiveTimeline().getState(EventTimeline.FORWARDS); + event.setThread(this); - this.timelineSet.addLiveEvent(event); + this.timelineSet.addLiveEvent(event, DuplicateStrategy.Ignore, false, roomState); if (this.ready) { this.client.decryptEventIfNeeded(event, {});