mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-11-06 23:30:28 +03:00
Fix muted room show unread indicator (#386)
* Move getNotifType function Signed-off-by: Ajay Bura <ajbura@gmail.com> * Fix bug in getNotiType Signed-off-by: Ajay Bura <ajbura@gmail.com> * Add isMuted prop in room selector Signed-off-by: Ajay Bura <ajbura@gmail.com> * Fix muted room show unread indicator Signed-off-by: Ajay Bura <ajbura@gmail.com> * Fix muted room notification visible in space Signed-off-by: Ajay Bura <ajbura@gmail.com> * Fix space shows muted room notification on load Signed-off-by: Ajay Bura <ajbura@gmail.com> * Toggle room mute when changed from other client Signed-off-by: Ajay Bura <ajbura@gmail.com>
This commit is contained in:
parent
92a3a8d6fa
commit
70ffd7ded8
9 changed files with 106 additions and 30 deletions
|
|
@ -17,6 +17,17 @@ function isNotifEvent(mEvent) {
|
|||
return true;
|
||||
}
|
||||
|
||||
function isMutedRule(rule) {
|
||||
return rule.actions[0] === 'dont_notify' && rule.conditions[0].kind === 'event_match';
|
||||
}
|
||||
|
||||
function findMutedRule(overrideRules, roomId) {
|
||||
return overrideRules.find((rule) => (
|
||||
rule.rule_id === roomId
|
||||
&& isMutedRule(rule)
|
||||
));
|
||||
}
|
||||
|
||||
class Notifications extends EventEmitter {
|
||||
constructor(roomList) {
|
||||
super();
|
||||
|
|
@ -39,7 +50,9 @@ class Notifications extends EventEmitter {
|
|||
_initNoti() {
|
||||
const addNoti = (roomId) => {
|
||||
const room = this.matrixClient.getRoom(roomId);
|
||||
if (this.getNotiType(room.roomId) === cons.notifs.MUTE) return;
|
||||
if (this.doesRoomHaveUnread(room) === false) return;
|
||||
|
||||
const total = room.getUnreadNotificationCount('total');
|
||||
const highlight = room.getUnreadNotificationCount('highlight');
|
||||
this._setNoti(room.roomId, total ?? 0, highlight ?? 0);
|
||||
|
|
@ -65,6 +78,22 @@ class Notifications extends EventEmitter {
|
|||
return true;
|
||||
}
|
||||
|
||||
getNotiType(roomId) {
|
||||
const mx = this.matrixClient;
|
||||
const pushRule = mx.getRoomPushRule('global', roomId);
|
||||
|
||||
if (pushRule === undefined) {
|
||||
const overrideRules = mx.getAccountData('m.push_rules')?.getContent()?.global?.override;
|
||||
if (overrideRules === undefined) return cons.notifs.DEFAULT;
|
||||
|
||||
const isMuted = findMutedRule(overrideRules, roomId);
|
||||
|
||||
return isMuted ? cons.notifs.MUTE : cons.notifs.DEFAULT;
|
||||
}
|
||||
if (pushRule.actions[0] === 'notify') return cons.notifs.ALL_MESSAGES;
|
||||
return cons.notifs.MENTIONS_AND_KEYWORDS;
|
||||
}
|
||||
|
||||
getNoti(roomId) {
|
||||
return this.roomIdToNoti.get(roomId) || { total: 0, highlight: 0, from: null };
|
||||
}
|
||||
|
|
@ -195,6 +224,7 @@ class Notifications extends EventEmitter {
|
|||
this.matrixClient.on('Room.timeline', (mEvent, room) => {
|
||||
if (room.isSpaceRoom()) return;
|
||||
if (!isNotifEvent(mEvent)) return;
|
||||
|
||||
const liveEvents = room.getLiveTimeline().getEvents();
|
||||
|
||||
const lastTimelineEvent = liveEvents[liveEvents.length - 1];
|
||||
|
|
@ -204,6 +234,11 @@ class Notifications extends EventEmitter {
|
|||
const total = room.getUnreadNotificationCount('total');
|
||||
const highlight = room.getUnreadNotificationCount('highlight');
|
||||
|
||||
if (this.getNotiType(room.roomId) === cons.notifs.MUTE) {
|
||||
this.deleteNoti(room.roomId, total ?? 0, highlight ?? 0);
|
||||
return;
|
||||
}
|
||||
|
||||
this._setNoti(room.roomId, total ?? 0, highlight ?? 0);
|
||||
|
||||
if (this.matrixClient.getSyncState() === 'SYNCING') {
|
||||
|
|
@ -211,6 +246,43 @@ class Notifications extends EventEmitter {
|
|||
}
|
||||
});
|
||||
|
||||
this.matrixClient.on('accountData', (mEvent, oldMEvent) => {
|
||||
if (mEvent.getType() === 'm.push_rules') {
|
||||
const override = mEvent?.getContent()?.global?.override;
|
||||
const oldOverride = oldMEvent?.getContent()?.global?.override;
|
||||
if (!override || !oldOverride) return;
|
||||
|
||||
const isMuteToggled = (rule, otherOverride) => {
|
||||
const roomId = rule.rule_id;
|
||||
const room = this.matrixClient.getRoom(roomId);
|
||||
if (room === null) return false;
|
||||
if (room.isSpaceRoom()) return false;
|
||||
|
||||
const isMuted = isMutedRule(rule);
|
||||
if (!isMuted) return false;
|
||||
const isOtherMuted = findMutedRule(otherOverride, roomId);
|
||||
if (isOtherMuted) return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
const mutedRules = override.filter((rule) => isMuteToggled(rule, oldOverride));
|
||||
const unMutedRules = oldOverride.filter((rule) => isMuteToggled(rule, override));
|
||||
|
||||
mutedRules.forEach((rule) => {
|
||||
this.emit(cons.events.notifications.MUTE_TOGGLED, rule.rule_id, true);
|
||||
this.deleteNoti(rule.rule_id);
|
||||
});
|
||||
unMutedRules.forEach((rule) => {
|
||||
this.emit(cons.events.notifications.MUTE_TOGGLED, rule.rule_id, false);
|
||||
const room = this.matrixClient.getRoom(rule.rule_id);
|
||||
if (!this.doesRoomHaveUnread(room)) return;
|
||||
const total = room.getUnreadNotificationCount('total');
|
||||
const highlight = room.getUnreadNotificationCount('highlight');
|
||||
this._setNoti(room.roomId, total ?? 0, highlight ?? 0);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
this.matrixClient.on('Room.receipt', (mEvent, room) => {
|
||||
if (mEvent.getType() === 'm.receipt') {
|
||||
if (room.isSpaceRoom()) return;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue