You've already forked matrix-js-sdk
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:
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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, {});
|
||||||
|
|||||||
Reference in New Issue
Block a user