1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-12-04 05:02:41 +03:00

Share room state events with thread's timelines

This commit is contained in:
Germain Souquet
2021-09-22 11:19:08 +01:00
parent b1d239b292
commit 1359c0574e
3 changed files with 30 additions and 8 deletions

View File

@@ -27,6 +27,7 @@ import { Relations } from './relations';
import { Room } from "./room"; import { Room } from "./room";
import { Filter } from "../filter"; import { Filter } from "../filter";
import { EventType, RelationType } from "../@types/event"; import { EventType, RelationType } from "../@types/event";
import { RoomState } from "./room-state";
// var DEBUG = false; // var DEBUG = false;
const DEBUG = true; const DEBUG = true;
@@ -45,6 +46,11 @@ interface IOpts {
unstableClientRelationAggregation?: boolean; unstableClientRelationAggregation?: boolean;
} }
export enum DuplicateStrategy {
Ignore = "ignore",
Replace = "replace",
}
export class EventTimelineSet extends EventEmitter { export class EventTimelineSet extends EventEmitter {
private readonly timelineSupport: boolean; private readonly timelineSupport: boolean;
private unstableClientRelationAggregation: boolean; private unstableClientRelationAggregation: boolean;
@@ -509,8 +515,14 @@ export class EventTimelineSet extends EventEmitter {
* @param {MatrixEvent} event Event to be added * @param {MatrixEvent} event Event to be added
* @param {string?} duplicateStrategy 'ignore' or 'replace' * @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
* @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) { if (this.filter) {
const events = this.filter.filterRoomTimeline([event]); const events = this.filter.filterRoomTimeline([event]);
if (!events.length) { if (!events.length) {
@@ -527,9 +539,12 @@ export class EventTimelineSet extends EventEmitter {
for (let j = 0; j < tlEvents.length; j++) { for (let j = 0; j < tlEvents.length; j++) {
if (tlEvents[j].getId() === event.getId()) { if (tlEvents[j].getId() === event.getId()) {
// still need to set the right metadata on this event // still need to set the right metadata on this event
if (!roomState) {
timeline.getState(EventTimeline.FORWARDS);
}
EventTimeline.setEventMetadata( EventTimeline.setEventMetadata(
event, event,
timeline.getState(EventTimeline.FORWARDS), roomState,
false, false,
); );
tlEvents[j] = event; tlEvents[j] = event;
@@ -545,7 +560,7 @@ export class EventTimelineSet extends EventEmitter {
return; 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, timeline: EventTimeline,
toStartOfTimeline: boolean, toStartOfTimeline: boolean,
fromCache = false, fromCache = false,
roomState?: RoomState,
) { ) {
const eventId = event.getId(); const eventId = event.getId();
timeline.addEvent(event, toStartOfTimeline); timeline.addEvent(event, toStartOfTimeline, roomState);
this._eventIdToTimeline[eventId] = timeline; this._eventIdToTimeline[eventId] = timeline;
this.setRelationsTarget(event); this.setRelationsTarget(event);

View File

@@ -347,8 +347,11 @@ export class EventTimeline {
* @param {MatrixEvent} event new event * @param {MatrixEvent} event new event
* @param {boolean} atStart true to insert new event at the start * @param {boolean} atStart true to insert new event at the start
*/ */
public addEvent(event: MatrixEvent, atStart: boolean): void { public addEvent(event: MatrixEvent, atStart: boolean, stateContext?: RoomState): void {
const stateContext = atStart ? this.startState : this.endState; if (!stateContext) {
stateContext = atStart ? this.startState : this.endState;
}
const timelineSet = this.getTimelineSet(); const timelineSet = this.getTimelineSet();
if (timelineSet.room) { if (timelineSet.room) {

View File

@@ -17,7 +17,8 @@ limitations under the License.
import { EventEmitter } from "events"; import { EventEmitter } from "events";
import { MatrixClient } from "../matrix"; import { MatrixClient } from "../matrix";
import { MatrixEvent } from "./event"; 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'; import { Room } from './room';
export enum ThreadEvent { export enum ThreadEvent {
@@ -72,8 +73,10 @@ export class Thread extends EventEmitter {
this.root = event.getId(); this.root = event.getId();
} }
const roomState = this.room.getLiveTimeline().getState(EventTimeline.FORWARDS);
event.setThread(this); event.setThread(this);
this.timelineSet.addLiveEvent(event); this.timelineSet.addLiveEvent(event, DuplicateStrategy.Ignore, false, roomState);
if (this.ready) { if (this.ready) {
this.client.decryptEventIfNeeded(event, {}); this.client.decryptEventIfNeeded(event, {});