Merge pull request #6385 from matrix-org/t3chguy/fix/18008
commit
5f2fab02e7
|
@ -328,7 +328,7 @@ export const Notifier = {
|
||||||
|
|
||||||
onEvent: function(ev: MatrixEvent) {
|
onEvent: function(ev: MatrixEvent) {
|
||||||
if (!this.isSyncing) return; // don't alert for any messages initially
|
if (!this.isSyncing) return; // don't alert for any messages initially
|
||||||
if (ev.sender && ev.sender.userId === MatrixClientPeg.get().credentials.userId) return;
|
if (ev.getSender() === MatrixClientPeg.get().credentials.userId) return;
|
||||||
|
|
||||||
MatrixClientPeg.get().decryptEventIfNeeded(ev);
|
MatrixClientPeg.get().decryptEventIfNeeded(ev);
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ import { haveTileForEvent } from "./components/views/rooms/EventTile";
|
||||||
* @returns {boolean} True if the given event should affect the unread message count
|
* @returns {boolean} True if the given event should affect the unread message count
|
||||||
*/
|
*/
|
||||||
export function eventTriggersUnreadCount(ev: MatrixEvent): boolean {
|
export function eventTriggersUnreadCount(ev: MatrixEvent): boolean {
|
||||||
if (ev.sender && ev.sender.userId == MatrixClientPeg.get().credentials.userId) {
|
if (ev.getSender() === MatrixClientPeg.get().credentials.userId) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,9 +63,7 @@ export function doesRoomHaveUnreadMessages(room: Room): boolean {
|
||||||
// https://github.com/vector-im/element-web/issues/2427
|
// https://github.com/vector-im/element-web/issues/2427
|
||||||
// ...and possibly some of the others at
|
// ...and possibly some of the others at
|
||||||
// https://github.com/vector-im/element-web/issues/3363
|
// https://github.com/vector-im/element-web/issues/3363
|
||||||
if (room.timeline.length &&
|
if (room.timeline.length && room.timeline[room.timeline.length - 1].getSender() === myUserId) {
|
||||||
room.timeline[room.timeline.length - 1].sender &&
|
|
||||||
room.timeline[room.timeline.length - 1].sender.userId === myUserId) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -401,7 +401,7 @@ export default class MessagePanel extends React.Component<IProps, IState> {
|
||||||
|
|
||||||
// TODO: Implement granular (per-room) hide options
|
// TODO: Implement granular (per-room) hide options
|
||||||
public shouldShowEvent(mxEv: MatrixEvent): boolean {
|
public shouldShowEvent(mxEv: MatrixEvent): boolean {
|
||||||
if (mxEv.sender && MatrixClientPeg.get().isUserIgnored(mxEv.sender.userId)) {
|
if (MatrixClientPeg.get().isUserIgnored(mxEv.getSender())) {
|
||||||
return false; // ignored = no show (only happens if the ignore happens after an event was received)
|
return false; // ignored = no show (only happens if the ignore happens after an event was received)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -253,7 +253,6 @@ export default class RoomView extends React.Component<IProps, IState> {
|
||||||
this.context.on("userTrustStatusChanged", this.onUserVerificationChanged);
|
this.context.on("userTrustStatusChanged", this.onUserVerificationChanged);
|
||||||
this.context.on("crossSigning.keysChanged", this.onCrossSigningKeysChanged);
|
this.context.on("crossSigning.keysChanged", this.onCrossSigningKeysChanged);
|
||||||
this.context.on("Event.decrypted", this.onEventDecrypted);
|
this.context.on("Event.decrypted", this.onEventDecrypted);
|
||||||
this.context.on("event", this.onEvent);
|
|
||||||
// Start listening for RoomViewStore updates
|
// Start listening for RoomViewStore updates
|
||||||
this.roomStoreToken = RoomViewStore.addListener(this.onRoomViewStoreUpdate);
|
this.roomStoreToken = RoomViewStore.addListener(this.onRoomViewStoreUpdate);
|
||||||
this.rightPanelStoreToken = RightPanelStore.getSharedInstance().addListener(this.onRightPanelStoreUpdate);
|
this.rightPanelStoreToken = RightPanelStore.getSharedInstance().addListener(this.onRightPanelStoreUpdate);
|
||||||
|
@ -637,7 +636,6 @@ export default class RoomView extends React.Component<IProps, IState> {
|
||||||
this.context.removeListener("userTrustStatusChanged", this.onUserVerificationChanged);
|
this.context.removeListener("userTrustStatusChanged", this.onUserVerificationChanged);
|
||||||
this.context.removeListener("crossSigning.keysChanged", this.onCrossSigningKeysChanged);
|
this.context.removeListener("crossSigning.keysChanged", this.onCrossSigningKeysChanged);
|
||||||
this.context.removeListener("Event.decrypted", this.onEventDecrypted);
|
this.context.removeListener("Event.decrypted", this.onEventDecrypted);
|
||||||
this.context.removeListener("event", this.onEvent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
window.removeEventListener('beforeunload', this.onPageUnload);
|
window.removeEventListener('beforeunload', this.onPageUnload);
|
||||||
|
@ -837,8 +835,7 @@ export default class RoomView extends React.Component<IProps, IState> {
|
||||||
if (this.unmounted) return;
|
if (this.unmounted) return;
|
||||||
|
|
||||||
// ignore events for other rooms
|
// ignore events for other rooms
|
||||||
if (!room) return;
|
if (!room || room.roomId !== this.state.room?.roomId) return;
|
||||||
if (!this.state.room || room.roomId != this.state.room.roomId) return;
|
|
||||||
|
|
||||||
// ignore events from filtered timelines
|
// ignore events from filtered timelines
|
||||||
if (data.timeline.getTimelineSet() !== room.getUnfilteredTimelineSet()) return;
|
if (data.timeline.getTimelineSet() !== room.getUnfilteredTimelineSet()) return;
|
||||||
|
@ -859,6 +856,10 @@ export default class RoomView extends React.Component<IProps, IState> {
|
||||||
// we'll only be showing a spinner.
|
// we'll only be showing a spinner.
|
||||||
if (this.state.joining) return;
|
if (this.state.joining) return;
|
||||||
|
|
||||||
|
if (!ev.isBeingDecrypted() && !ev.isDecryptionFailure()) {
|
||||||
|
this.handleEffects(ev);
|
||||||
|
}
|
||||||
|
|
||||||
if (ev.getSender() !== this.context.credentials.userId) {
|
if (ev.getSender() !== this.context.credentials.userId) {
|
||||||
// update unread count when scrolled up
|
// update unread count when scrolled up
|
||||||
if (!this.state.searchResults && this.state.atEndOfLiveTimeline) {
|
if (!this.state.searchResults && this.state.atEndOfLiveTimeline) {
|
||||||
|
@ -871,20 +872,14 @@ export default class RoomView extends React.Component<IProps, IState> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private onEventDecrypted = (ev) => {
|
private onEventDecrypted = (ev: MatrixEvent) => {
|
||||||
|
if (!this.state.room || !this.state.matrixClientIsReady) return; // not ready at all
|
||||||
|
if (ev.getRoomId() !== this.state.room.roomId) return; // not for us
|
||||||
if (ev.isDecryptionFailure()) return;
|
if (ev.isDecryptionFailure()) return;
|
||||||
this.handleEffects(ev);
|
this.handleEffects(ev);
|
||||||
};
|
};
|
||||||
|
|
||||||
private onEvent = (ev) => {
|
private handleEffects = (ev: MatrixEvent) => {
|
||||||
if (ev.isBeingDecrypted() || ev.isDecryptionFailure()) return;
|
|
||||||
this.handleEffects(ev);
|
|
||||||
};
|
|
||||||
|
|
||||||
private handleEffects = (ev) => {
|
|
||||||
if (!this.state.room || !this.state.matrixClientIsReady) return; // not ready at all
|
|
||||||
if (ev.getRoomId() !== this.state.room.roomId) return; // not for us
|
|
||||||
|
|
||||||
const notifState = RoomNotificationStateStore.instance.getRoomState(this.state.room);
|
const notifState = RoomNotificationStateStore.instance.getRoomState(this.state.room);
|
||||||
if (!notifState.isUnread) return;
|
if (!notifState.isUnread) return;
|
||||||
|
|
||||||
|
|
|
@ -555,9 +555,8 @@ class TimelinePanel extends React.Component<IProps, IState> {
|
||||||
// more than the timeout on userActiveRecently.
|
// more than the timeout on userActiveRecently.
|
||||||
//
|
//
|
||||||
const myUserId = MatrixClientPeg.get().credentials.userId;
|
const myUserId = MatrixClientPeg.get().credentials.userId;
|
||||||
const sender = ev.sender ? ev.sender.userId : null;
|
|
||||||
callRMUpdated = false;
|
callRMUpdated = false;
|
||||||
if (sender != myUserId && !UserActivity.sharedInstance().userActiveRecently()) {
|
if (ev.getSender() !== myUserId && !UserActivity.sharedInstance().userActiveRecently()) {
|
||||||
updatedState.readMarkerVisible = true;
|
updatedState.readMarkerVisible = true;
|
||||||
} else if (lastLiveEvent && this.getReadMarkerPosition() === 0) {
|
} else if (lastLiveEvent && this.getReadMarkerPosition() === 0) {
|
||||||
// we know we're stuckAtBottom, so we can advance the RM
|
// we know we're stuckAtBottom, so we can advance the RM
|
||||||
|
@ -863,7 +862,7 @@ class TimelinePanel extends React.Component<IProps, IState> {
|
||||||
const myUserId = MatrixClientPeg.get().credentials.userId;
|
const myUserId = MatrixClientPeg.get().credentials.userId;
|
||||||
for (i++; i < events.length; i++) {
|
for (i++; i < events.length; i++) {
|
||||||
const ev = events[i];
|
const ev = events[i];
|
||||||
if (!ev.sender || ev.sender.userId != myUserId) {
|
if (ev.getSender() !== myUserId) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1337,7 +1336,7 @@ class TimelinePanel extends React.Component<IProps, IState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
const shouldIgnore = !!ev.status || // local echo
|
const shouldIgnore = !!ev.status || // local echo
|
||||||
(ignoreOwn && ev.sender && ev.sender.userId == myUserId); // own message
|
(ignoreOwn && ev.getSender() === myUserId); // own message
|
||||||
const isWithoutTile = !haveTileForEvent(ev) || shouldHideEvent(ev, this.context);
|
const isWithoutTile = !haveTileForEvent(ev) || shouldHideEvent(ev, this.context);
|
||||||
|
|
||||||
if (isWithoutTile || !node) {
|
if (isWithoutTile || !node) {
|
||||||
|
|
|
@ -67,7 +67,6 @@ export default class EventIndex extends EventEmitter {
|
||||||
|
|
||||||
client.on('sync', this.onSync);
|
client.on('sync', this.onSync);
|
||||||
client.on('Room.timeline', this.onRoomTimeline);
|
client.on('Room.timeline', this.onRoomTimeline);
|
||||||
client.on('Event.decrypted', this.onEventDecrypted);
|
|
||||||
client.on('Room.timelineReset', this.onTimelineReset);
|
client.on('Room.timelineReset', this.onTimelineReset);
|
||||||
client.on('Room.redaction', this.onRedaction);
|
client.on('Room.redaction', this.onRedaction);
|
||||||
client.on('RoomState.events', this.onRoomStateEvent);
|
client.on('RoomState.events', this.onRoomStateEvent);
|
||||||
|
@ -82,7 +81,6 @@ export default class EventIndex extends EventEmitter {
|
||||||
|
|
||||||
client.removeListener('sync', this.onSync);
|
client.removeListener('sync', this.onSync);
|
||||||
client.removeListener('Room.timeline', this.onRoomTimeline);
|
client.removeListener('Room.timeline', this.onRoomTimeline);
|
||||||
client.removeListener('Event.decrypted', this.onEventDecrypted);
|
|
||||||
client.removeListener('Room.timelineReset', this.onTimelineReset);
|
client.removeListener('Room.timelineReset', this.onTimelineReset);
|
||||||
client.removeListener('Room.redaction', this.onRedaction);
|
client.removeListener('Room.redaction', this.onRedaction);
|
||||||
client.removeListener('RoomState.events', this.onRoomStateEvent);
|
client.removeListener('RoomState.events', this.onRoomStateEvent);
|
||||||
|
@ -221,18 +219,6 @@ export default class EventIndex extends EventEmitter {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* The Event.decrypted listener.
|
|
||||||
*
|
|
||||||
* Checks if the event was marked for addition in the Room.timeline
|
|
||||||
* listener, if so queues it up to be added to the index.
|
|
||||||
*/
|
|
||||||
private onEventDecrypted = async (ev: MatrixEvent, err: Error) => {
|
|
||||||
// If the event isn't in our live event set, ignore it.
|
|
||||||
if (err) return;
|
|
||||||
await this.addLiveEventToIndex(ev);
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The Room.redaction listener.
|
* The Room.redaction listener.
|
||||||
*
|
*
|
||||||
|
|
|
@ -96,6 +96,7 @@ export function createTestClient() {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
decryptEventIfNeeded: () => Promise.resolve(),
|
decryptEventIfNeeded: () => Promise.resolve(),
|
||||||
|
isUserIgnored: jest.fn().mockReturnValue(false),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue