You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-25 05:23:13 +03:00
use timeline set instead of an array of events
This commit is contained in:
@@ -146,7 +146,7 @@ export class Room extends EventEmitter {
|
|||||||
public oldState: RoomState;
|
public oldState: RoomState;
|
||||||
public currentState: RoomState;
|
public currentState: RoomState;
|
||||||
|
|
||||||
private threads = new Set<Thread>();
|
public threads = new Set<Thread>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new Room.
|
* Construct a new Room.
|
||||||
@@ -1052,12 +1052,6 @@ export class Room extends EventEmitter {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public findThreadByTailEvent(eventId: string): Thread {
|
|
||||||
return Array.from(this.threads.values()).find(thread => {
|
|
||||||
return thread.tail.has(eventId);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public addThread(thread: Thread): Set<Thread> {
|
public addThread(thread: Thread): Set<Thread> {
|
||||||
this.threads.add(thread);
|
this.threads.add(thread);
|
||||||
if (!thread.ready) {
|
if (!thread.ready) {
|
||||||
@@ -1068,6 +1062,12 @@ export class Room extends EventEmitter {
|
|||||||
return this.threads;
|
return this.threads;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getThread(eventId: string): Thread {
|
||||||
|
return this.getThreads().find(thread => {
|
||||||
|
return thread.id === eventId;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public getThreads(): Thread[] {
|
public getThreads(): Thread[] {
|
||||||
return Array.from(this.threads.values());
|
return Array.from(this.threads.values());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,18 +17,27 @@ 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 { Room } from './room';
|
||||||
|
|
||||||
export class Thread extends EventEmitter {
|
export class Thread extends EventEmitter {
|
||||||
private root: string;
|
private root: string;
|
||||||
public tail = new Set<string>();
|
public tail = new Set<string>();
|
||||||
private events = new Map<string, MatrixEvent>();
|
private events = new Map<string, MatrixEvent>();
|
||||||
|
private _timelineSet: EventTimelineSet;
|
||||||
|
|
||||||
private decrypted = false;
|
private decrypted = false;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
events: MatrixEvent[] = [],
|
events: MatrixEvent[] = [],
|
||||||
|
public readonly room: Room,
|
||||||
public readonly client: MatrixClient,
|
public readonly client: MatrixClient,
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
|
this._timelineSet = new EventTimelineSet(room, {
|
||||||
|
unstableClientRelationAggregation: true,
|
||||||
|
timelineSupport: true,
|
||||||
|
});
|
||||||
events.forEach(event => this.addEvent(event));
|
events.forEach(event => this.addEvent(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,7 +47,7 @@ export class Thread extends EventEmitter {
|
|||||||
* @param event The event to add
|
* @param event The event to add
|
||||||
*/
|
*/
|
||||||
public addEvent(event: MatrixEvent): void {
|
public addEvent(event: MatrixEvent): void {
|
||||||
if (this.events.has(event.getId())) {
|
if (this.events.has(event.getId()) || event.status !== null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,8 +60,14 @@ export class Thread extends EventEmitter {
|
|||||||
this.root = event.getId();
|
this.root = event.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.events.set(event.getId(), event);
|
|
||||||
event.setThread(this);
|
event.setThread(this);
|
||||||
|
this.events.set(event.getId(), event);
|
||||||
|
this._timelineSet.addEventToTimeline(
|
||||||
|
event,
|
||||||
|
this._timelineSet.getLiveTimeline(),
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
|
||||||
if (this.ready) {
|
if (this.ready) {
|
||||||
this.client.decryptEventIfNeeded(event, {});
|
this.client.decryptEventIfNeeded(event, {});
|
||||||
@@ -99,14 +114,6 @@ export class Thread extends EventEmitter {
|
|||||||
return this.rootEvent.replyEventId === undefined && this.decrypted;
|
return this.rootEvent.replyEventId === undefined && this.decrypted;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* A sorted list of events to display
|
|
||||||
*/
|
|
||||||
public get eventTimeline(): MatrixEvent[] {
|
|
||||||
return Array.from(this.events.values())
|
|
||||||
.sort((a, b) => a.getTs() - b.getTs());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The thread ID, which is the same as the root event ID
|
* The thread ID, which is the same as the root event ID
|
||||||
*/
|
*/
|
||||||
@@ -122,7 +129,7 @@ export class Thread extends EventEmitter {
|
|||||||
* The number of messages in the thread
|
* The number of messages in the thread
|
||||||
*/
|
*/
|
||||||
public get length(): number {
|
public get length(): number {
|
||||||
return this.eventTimeline.length;
|
return this._timelineSet.getLiveTimeline().getEvents().length;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -135,4 +142,13 @@ export class Thread extends EventEmitter {
|
|||||||
});
|
});
|
||||||
return participants;
|
return participants;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get timelineSet(): EventTimelineSet {
|
||||||
|
return this._timelineSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get replyToEvent(): MatrixEvent {
|
||||||
|
const events = this._timelineSet.getLiveTimeline().getEvents();
|
||||||
|
return events[events.length -1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1700,11 +1700,11 @@ export class SyncApi {
|
|||||||
|
|
||||||
private processThreadEvents(room: Room, threadedEvents: MatrixEvent[]): void {
|
private processThreadEvents(room: Room, threadedEvents: MatrixEvent[]): void {
|
||||||
threadedEvents.forEach(event => {
|
threadedEvents.forEach(event => {
|
||||||
let thread = room.findThreadByTailEvent(event.replyEventId);
|
let thread = room.findEventById(event.replyEventId).getThread();
|
||||||
if (thread) {
|
if (thread) {
|
||||||
thread.addEvent(event);
|
thread.addEvent(event);
|
||||||
} else {
|
} else {
|
||||||
thread = new Thread([event], this.client);
|
thread = new Thread([event], room, this.client);
|
||||||
room.addThread(thread);
|
room.addThread(thread);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user