Fix read receipt handling in the new room list

Fixes https://github.com/vector-im/riot-web/issues/14064
Fixes https://github.com/vector-im/riot-web/issues/14082

Turns out the event doesn't reference a room, so we need to use the accompanied room reference instead.
This commit is contained in:
Travis Ralston 2020-06-22 15:12:30 -06:00
parent 3c88f6ed81
commit fc5ee64fce
2 changed files with 12 additions and 5 deletions

View file

@ -28,6 +28,7 @@ import { arrayDiff } from "../../../utils/arrays";
import { IDestroyable } from "../../../utils/IDestroyable"; import { IDestroyable } from "../../../utils/IDestroyable";
import SettingsStore from "../../../settings/SettingsStore"; import SettingsStore from "../../../settings/SettingsStore";
import { DefaultTagID, TagID } from "../../../stores/room-list/models"; import { DefaultTagID, TagID } from "../../../stores/room-list/models";
import { readReceiptChangeIsFor } from "../../../utils/read-receipts";
export const NOTIFICATION_STATE_UPDATE = "update"; export const NOTIFICATION_STATE_UPDATE = "update";
@ -147,7 +148,7 @@ export class RoomNotificationState extends EventEmitter implements IDestroyable,
constructor(private room: Room) { constructor(private room: Room) {
super(); super();
this.room.on("Room.receipt", this.handleRoomEventUpdate); this.room.on("Room.receipt", this.handleReadReceipt);
this.room.on("Room.timeline", this.handleRoomEventUpdate); this.room.on("Room.timeline", this.handleRoomEventUpdate);
this.room.on("Room.redaction", this.handleRoomEventUpdate); this.room.on("Room.redaction", this.handleRoomEventUpdate);
MatrixClientPeg.get().on("Event.decrypted", this.handleRoomEventUpdate); MatrixClientPeg.get().on("Event.decrypted", this.handleRoomEventUpdate);
@ -171,7 +172,7 @@ export class RoomNotificationState extends EventEmitter implements IDestroyable,
} }
public destroy(): void { public destroy(): void {
this.room.removeListener("Room.receipt", this.handleRoomEventUpdate); this.room.removeListener("Room.receipt", this.handleReadReceipt);
this.room.removeListener("Room.timeline", this.handleRoomEventUpdate); this.room.removeListener("Room.timeline", this.handleRoomEventUpdate);
this.room.removeListener("Room.redaction", this.handleRoomEventUpdate); this.room.removeListener("Room.redaction", this.handleRoomEventUpdate);
if (MatrixClientPeg.get()) { if (MatrixClientPeg.get()) {
@ -179,6 +180,12 @@ export class RoomNotificationState extends EventEmitter implements IDestroyable,
} }
} }
private handleReadReceipt = (event: MatrixEvent, room: Room) => {
if (!readReceiptChangeIsFor(event, MatrixClientPeg.get())) return; // not our own - ignore
if (room.roomId !== this.room.roomId) return; // not for us - ignore
this.updateNotificationState();
};
private handleRoomEventUpdate = (event: MatrixEvent) => { private handleRoomEventUpdate = (event: MatrixEvent) => {
const roomId = event.getRoomId(); const roomId = event.getRoomId();

View file

@ -158,12 +158,12 @@ export class RoomListStore2 extends AsyncStore<ActionPayload> {
// First see if the receipt event is for our own user. If it was, trigger // First see if the receipt event is for our own user. If it was, trigger
// a room update (we probably read the room on a different device). // a room update (we probably read the room on a different device).
if (readReceiptChangeIsFor(payload.event, this.matrixClient)) { if (readReceiptChangeIsFor(payload.event, this.matrixClient)) {
console.log(`[RoomListDebug] Got own read receipt in ${payload.event.roomId}`); const room = payload.room;
const room = this.matrixClient.getRoom(payload.event.roomId);
if (!room) { if (!room) {
console.warn(`Own read receipt was in unknown room ${payload.event.roomId}`); console.warn(`Own read receipt was in unknown room ${room.roomId}`);
return; return;
} }
console.log(`[RoomListDebug] Got own read receipt in ${room.roomId}`);
await this.handleRoomUpdate(room, RoomUpdateCause.ReadReceipt); await this.handleRoomUpdate(room, RoomUpdateCause.ReadReceipt);
return; return;
} }