Read all 4 different notif states

Can't yet set loud / mute
This commit is contained in:
David Baker 2016-08-12 15:19:34 +01:00
parent 0afdf5d8e4
commit a17df609f3
2 changed files with 76 additions and 22 deletions

View File

@ -21,6 +21,7 @@ var React = require('react');
var classNames = require('classnames'); var classNames = require('classnames');
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg'); var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var dis = require('matrix-react-sdk/lib/dispatcher'); var dis = require('matrix-react-sdk/lib/dispatcher');
var RoomNotifs = require('../../../notifications/RoomNotifs');
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'NotificationStateContextMenu', displayName: 'NotificationStateContextMenu',
@ -31,23 +32,6 @@ module.exports = React.createClass({
onFinished: React.PropTypes.func, onFinished: React.PropTypes.func,
}, },
getInitialState: function() {
var areNotifsMuted = false;
var cli = MatrixClientPeg.get();
if (!cli.isGuest()) {
var roomPushRule = cli.getRoomPushRule("global", this.props.room.roomId);
if (roomPushRule) {
if (0 <= roomPushRule.actions.indexOf("dont_notify")) {
areNotifsMuted = true;
}
}
}
return {
areNotifsMuted: areNotifsMuted,
};
},
_save: function( areNotifsMuted ) { _save: function( areNotifsMuted ) {
var self = this; var self = this;
const roomId = this.props.room.roomId; const roomId = this.props.room.roomId;
@ -100,26 +84,26 @@ module.exports = React.createClass({
}, },
render: function() { render: function() {
var cli = MatrixClientPeg.get(); const vectorRoomNotifState = RoomNotifs.getVectorRoomNotifsState(this.props.room.roomId);
var alertMeClasses = classNames({ var alertMeClasses = classNames({
'mx_NotificationStateContextMenu_field': true, 'mx_NotificationStateContextMenu_field': true,
'mx_NotificationStateContextMenu_fieldDisabled': true, 'mx_NotificationStateContextMenu_fieldSet': vectorRoomNotifState == 'all_messages_loud',
}); });
var allNotifsClasses = classNames({ var allNotifsClasses = classNames({
'mx_NotificationStateContextMenu_field': true, 'mx_NotificationStateContextMenu_field': true,
'mx_NotificationStateContextMenu_fieldSet': !this.state.areNotifsMuted, 'mx_NotificationStateContextMenu_fieldSet': vectorRoomNotifState == 'all_messages',
}); });
var mentionsClasses = classNames({ var mentionsClasses = classNames({
'mx_NotificationStateContextMenu_field': true, 'mx_NotificationStateContextMenu_field': true,
'mx_NotificationStateContextMenu_fieldSet': this.state.areNotifsMuted, 'mx_NotificationStateContextMenu_fieldSet': vectorRoomNotifState == 'mentions_only',
}); });
var muteNotifsClasses = classNames({ var muteNotifsClasses = classNames({
'mx_NotificationStateContextMenu_field': true, 'mx_NotificationStateContextMenu_field': true,
'mx_NotificationStateContextMenu_fieldDisabled': true, 'mx_NotificationStateContextMenu_fieldDisabled': vectorRoomNotifState == 'mute',
}); });
return ( return (

View File

@ -0,0 +1,70 @@
/*
Copyright 2016 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import PushProcessor from 'matrix-js-sdk/lib/pushprocessor';
export function getVectorRoomNotifsState(roomId) {
// look through the override rules for a rule affecting this room:
// if one exists, it will take precedence.
for (const rule of MatrixClientPeg.get().pushRules['global'].override) {
if (isRuleForRoom(roomId, rule)) {
if (isMuteRule(rule)) {
return 'mute';
}
}
}
// for everything else, look at the room rule.
const roomRule = MatrixClientPeg.get().getRoomPushRule('global', roomId);
// XXX: We have to assume the default is to notify for all messages
// (in particular this will be 'wrong' for one to one rooms because
// they will notify loudly for all messages)
if (!roomRule) return 'all_messages';
// a mute at the room level will still allow mentions
// to notify
if (isMuteRule(roomRule)) return 'mentions_only';
const actionsObject = PushProcessor.actionListToActionsObject(roomRule.actions);
if (actionsObject.tweaks.sound) return 'all_messages_loud';
return null;
}
function isRuleForRoom(roomId, rule) {
if (rule.conditions.length !== 1) {
return false;
}
const cond = rule.conditions[0];
if (
cond.kind == 'event_match' &&
cond.key == 'room_id' &&
cond.pattern == roomId
) {
return true;
}
return false;
}
function isMuteRule(rule) {
return (
rule.actions.length == 1 &&
rule.actions[0] == 'dont_notify'
);
}