Toggle room mute when changed from other client
Signed-off-by: Ajay Bura <ajbura@gmail.com>
This commit is contained in:
parent
9da7f2d1cd
commit
bc9006f2c0
4 changed files with 57 additions and 8 deletions
|
@ -33,9 +33,11 @@ function Directs() {
|
||||||
|
|
||||||
navigation.on(cons.events.navigation.ROOM_SELECTED, selectorChanged);
|
navigation.on(cons.events.navigation.ROOM_SELECTED, selectorChanged);
|
||||||
notifications.on(cons.events.notifications.NOTI_CHANGED, notiChanged);
|
notifications.on(cons.events.notifications.NOTI_CHANGED, notiChanged);
|
||||||
|
notifications.on(cons.events.notifications.MUTE_TOGGLED, notiChanged);
|
||||||
return () => {
|
return () => {
|
||||||
navigation.removeListener(cons.events.navigation.ROOM_SELECTED, selectorChanged);
|
navigation.removeListener(cons.events.navigation.ROOM_SELECTED, selectorChanged);
|
||||||
notifications.removeListener(cons.events.notifications.NOTI_CHANGED, notiChanged);
|
notifications.removeListener(cons.events.notifications.NOTI_CHANGED, notiChanged);
|
||||||
|
notifications.removeListener(cons.events.notifications.MUTE_TOGGLED, notiChanged);
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
|
@ -62,9 +62,11 @@ function Home({ spaceId }) {
|
||||||
|
|
||||||
navigation.on(cons.events.navigation.ROOM_SELECTED, selectorChanged);
|
navigation.on(cons.events.navigation.ROOM_SELECTED, selectorChanged);
|
||||||
notifications.on(cons.events.notifications.NOTI_CHANGED, notiChanged);
|
notifications.on(cons.events.notifications.NOTI_CHANGED, notiChanged);
|
||||||
|
notifications.on(cons.events.notifications.MUTE_TOGGLED, notiChanged);
|
||||||
return () => {
|
return () => {
|
||||||
navigation.removeListener(cons.events.navigation.ROOM_SELECTED, selectorChanged);
|
navigation.removeListener(cons.events.navigation.ROOM_SELECTED, selectorChanged);
|
||||||
notifications.removeListener(cons.events.notifications.NOTI_CHANGED, notiChanged);
|
notifications.removeListener(cons.events.notifications.NOTI_CHANGED, notiChanged);
|
||||||
|
notifications.removeListener(cons.events.notifications.MUTE_TOGGLED, notiChanged);
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,17 @@ function isNotifEvent(mEvent) {
|
||||||
return true;
|
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 {
|
class Notifications extends EventEmitter {
|
||||||
constructor(roomList) {
|
constructor(roomList) {
|
||||||
super();
|
super();
|
||||||
|
@ -72,16 +83,12 @@ class Notifications extends EventEmitter {
|
||||||
const pushRule = mx.getRoomPushRule('global', roomId);
|
const pushRule = mx.getRoomPushRule('global', roomId);
|
||||||
|
|
||||||
if (pushRule === undefined) {
|
if (pushRule === undefined) {
|
||||||
const overridePushRules = mx.getAccountData('m.push_rules')?.getContent()?.global?.override;
|
const overrideRules = mx.getAccountData('m.push_rules')?.getContent()?.global?.override;
|
||||||
if (overridePushRules === undefined) return cons.notifs.DEFAULT;
|
if (overrideRules === undefined) return cons.notifs.DEFAULT;
|
||||||
|
|
||||||
const isMuteOverride = overridePushRules.find((rule) => (
|
const isMuted = findMutedRule(overrideRules, roomId);
|
||||||
rule.rule_id === roomId
|
|
||||||
&& rule.actions[0] === 'dont_notify'
|
|
||||||
&& rule.conditions[0].kind === 'event_match'
|
|
||||||
));
|
|
||||||
|
|
||||||
return isMuteOverride ? cons.notifs.MUTE : cons.notifs.DEFAULT;
|
return isMuted ? cons.notifs.MUTE : cons.notifs.DEFAULT;
|
||||||
}
|
}
|
||||||
if (pushRule.actions[0] === 'notify') return cons.notifs.ALL_MESSAGES;
|
if (pushRule.actions[0] === 'notify') return cons.notifs.ALL_MESSAGES;
|
||||||
return cons.notifs.MENTIONS_AND_KEYWORDS;
|
return cons.notifs.MENTIONS_AND_KEYWORDS;
|
||||||
|
@ -239,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) => {
|
this.matrixClient.on('Room.receipt', (mEvent, room) => {
|
||||||
if (mEvent.getType() === 'm.receipt') {
|
if (mEvent.getType() === 'm.receipt') {
|
||||||
if (room.isSpaceRoom()) return;
|
if (room.isSpaceRoom()) return;
|
||||||
|
|
|
@ -107,6 +107,7 @@ const cons = {
|
||||||
notifications: {
|
notifications: {
|
||||||
NOTI_CHANGED: 'NOTI_CHANGED',
|
NOTI_CHANGED: 'NOTI_CHANGED',
|
||||||
FULL_READ: 'FULL_READ',
|
FULL_READ: 'FULL_READ',
|
||||||
|
MUTE_TOGGLED: 'MUTE_TOGGLED',
|
||||||
},
|
},
|
||||||
roomTimeline: {
|
roomTimeline: {
|
||||||
READY: 'READY',
|
READY: 'READY',
|
||||||
|
|
Loading…
Reference in a new issue