forked from matrix/element-web
PushRules settings: coding: separate UI and data management
This commit is contained in:
parent
7412fc7f97
commit
c3469b5b51
|
@ -79,14 +79,138 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
onNotifStateButtonClicked: function(event) {
|
||||
var self = this;
|
||||
var cli = MatrixClientPeg.get();
|
||||
var vectorRuleId = event.target.className.split("-")[0];
|
||||
var newPushRuleVectorState = event.target.className.split("-")[1];
|
||||
|
||||
if ("keywords" === vectorRuleId
|
||||
&& this.state.vectorContentRules.vectorState !== newPushRuleVectorState
|
||||
&& this.state.vectorContentRules.rules.length) {
|
||||
if ("keywords" === vectorRuleId) {
|
||||
this._changeKeywordsPushRuleVectorState(newPushRuleVectorState)
|
||||
}
|
||||
else {
|
||||
var rule = this.getRule(vectorRuleId);
|
||||
if (rule) {
|
||||
this._changePushRuleVectorState(rule, newPushRuleVectorState);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
onKeywordsClicked: function(event) {
|
||||
var self = this;
|
||||
|
||||
// Compute the keywords list to display
|
||||
var keywords = [];
|
||||
for (var i in this.state.vectorContentRules.rules) {
|
||||
var rule = this.state.vectorContentRules.rules[i];
|
||||
keywords.push(rule.pattern);
|
||||
}
|
||||
if (keywords.length) {
|
||||
// As keeping the order of per-word push rules hs side is a bit tricky to code,
|
||||
// display the keywords in alphabetical order to the user
|
||||
keywords.sort();
|
||||
|
||||
keywords = keywords.join(", ");
|
||||
}
|
||||
else {
|
||||
keywords = "";
|
||||
}
|
||||
|
||||
var TextInputDialog = sdk.getComponent("dialogs.TextInputDialog");
|
||||
Modal.createDialog(TextInputDialog, {
|
||||
title: "Keywords",
|
||||
description: "Enter keywords separated by a comma:",
|
||||
value: keywords,
|
||||
onFinished: function onFinished(should_leave, newValue) {
|
||||
|
||||
if (should_leave && newValue !== keywords) {
|
||||
var newKeywords = newValue.split(',');
|
||||
for (var i in newKeywords) {
|
||||
newKeywords[i] = newKeywords[i].trim();
|
||||
}
|
||||
|
||||
// Remove duplicates and empty
|
||||
newKeywords = newKeywords.reduce(function(array, keyword){
|
||||
if (keyword !== "" && array.indexOf(keyword) < 0) {
|
||||
array.push(keyword);
|
||||
}
|
||||
return array;
|
||||
},[]);
|
||||
|
||||
self._updateKeywords(newKeywords);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
getRule: function(vectorRuleId) {
|
||||
for (var i in this.state.vectorPushRules) {
|
||||
var rule = this.state.vectorPushRules[i];
|
||||
if (rule.vectorRuleId === vectorRuleId) {
|
||||
return rule;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_actionsFor: function(pushRuleVectorState) {
|
||||
if (pushRuleVectorState === PushRuleVectorState.ON) {
|
||||
return ['notify'];
|
||||
}
|
||||
else if (pushRuleVectorState === PushRuleVectorState.LOUD) {
|
||||
return ['notify',
|
||||
{'set_tweak': 'sound', 'value': 'default'},
|
||||
{'set_tweak': 'highlight', 'value': 'true'}
|
||||
];;
|
||||
}
|
||||
},
|
||||
|
||||
// Determine whether a rule is in the PushRuleVectorState.ON category or in PushRuleVectorState.LOUD
|
||||
// regardless of its enabled state.
|
||||
_pushRuleVectorStateKind: function(rule) {
|
||||
var stateKind;
|
||||
|
||||
// Count tweaks to determine if it is a ON or LOUD rule
|
||||
var tweaks = 0;
|
||||
for (var j in rule.actions) {
|
||||
var action = rule.actions[j];
|
||||
if (action.set_tweak === 'sound' ||
|
||||
(action.set_tweak === 'highlight' && action.value)) {
|
||||
tweaks++;
|
||||
}
|
||||
}
|
||||
switch (tweaks) {
|
||||
case 0:
|
||||
stateKind = PushRuleVectorState.ON;
|
||||
break;
|
||||
case 2:
|
||||
stateKind = PushRuleVectorState.LOUD;
|
||||
break;
|
||||
}
|
||||
return stateKind;
|
||||
},
|
||||
|
||||
_changePushRuleVectorState: function(rule, newPushRuleVectorState) {
|
||||
// For now, we support only enabled/disabled for hs default rules
|
||||
// Translate ON, LOUD, OFF to one of the 2.
|
||||
if (rule && rule.vectorState !== newPushRuleVectorState) {
|
||||
|
||||
this.setState({
|
||||
phase: this.phases.LOADING
|
||||
});
|
||||
|
||||
var self = this;
|
||||
MatrixClientPeg.get().setPushRuleEnabled('global', rule.rule.kind, rule.rule.rule_id, (newPushRuleVectorState !== PushRuleVectorState.OFF)).done(function() {
|
||||
self._refreshFromServer();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
_changeKeywordsPushRuleVectorState: function(newPushRuleVectorState) {
|
||||
// Is there really a change?
|
||||
if (this.state.vectorContentRules.vectorState === newPushRuleVectorState
|
||||
|| this.state.vectorContentRules.rules.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
var self = this;
|
||||
var cli = MatrixClientPeg.get();
|
||||
|
||||
this.setState({
|
||||
phase: this.phases.LOADING
|
||||
|
@ -145,73 +269,17 @@ module.exports = React.createClass({
|
|||
onFinished: self._refreshFromServer
|
||||
});
|
||||
});
|
||||
}
|
||||
else {
|
||||
var rule = this.getRule(vectorRuleId);
|
||||
|
||||
// For now, we support only enabled/disabled for hs default rules
|
||||
// Translate ON, LOUD, OFF to one of the 2.
|
||||
if (rule && rule.vectorState !== newPushRuleVectorState) {
|
||||
},
|
||||
|
||||
_updateKeywords: function(newKeywords) {
|
||||
this.setState({
|
||||
phase: this.phases.LOADING
|
||||
});
|
||||
|
||||
cli.setPushRuleEnabled('global', rule.rule.kind, rule.rule.rule_id, (newPushRuleVectorState !== PushRuleVectorState.OFF)).done(function() {
|
||||
self._refreshFromServer();
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
onKeywordsClicked: function(event) {
|
||||
var self = this;
|
||||
|
||||
// Compute the keywords list to display
|
||||
var keywords = [];
|
||||
for (var i in this.state.vectorContentRules.rules) {
|
||||
var rule = this.state.vectorContentRules.rules[i];
|
||||
keywords.push(rule.pattern);
|
||||
}
|
||||
if (keywords.length) {
|
||||
// As keeping the order of per-word push rules hs side is a bit tricky to code,
|
||||
// display the keywords in alphabetical order to the user
|
||||
keywords.sort();
|
||||
|
||||
keywords = keywords.join(", ");
|
||||
}
|
||||
else {
|
||||
keywords = "";
|
||||
}
|
||||
|
||||
var TextInputDialog = sdk.getComponent("dialogs.TextInputDialog");
|
||||
Modal.createDialog(TextInputDialog, {
|
||||
title: "Keywords",
|
||||
description: "Enter keywords separated by a comma:",
|
||||
value: keywords,
|
||||
onFinished: function onFinished(should_leave, newValue) {
|
||||
|
||||
if (should_leave && newValue !== keywords) {
|
||||
var cli = MatrixClientPeg.get();
|
||||
var removeDeferreds = [];
|
||||
|
||||
var newKeywords = newValue.split(',');
|
||||
for (var i in newKeywords) {
|
||||
newKeywords[i] = newKeywords[i].trim();
|
||||
}
|
||||
|
||||
// Remove duplicates and empty
|
||||
newKeywords = newKeywords.reduce(function(array, keyword){
|
||||
if (keyword !== "" && array.indexOf(keyword) < 0) {
|
||||
array.push(keyword);
|
||||
}
|
||||
return array;
|
||||
},[]);
|
||||
|
||||
self.setState({
|
||||
phase: self.phases.LOADING
|
||||
});
|
||||
|
||||
// Remove per-word push rules of keywords that are no more in the list
|
||||
var vectorContentRulesPatterns = [];
|
||||
for (var i in self.state.vectorContentRules.rules) {
|
||||
|
@ -276,55 +344,6 @@ module.exports = React.createClass({
|
|||
self._refreshFromServer();
|
||||
}, onError);
|
||||
}, onError);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
getRule: function(vectorRuleId) {
|
||||
for (var i in this.state.vectorPushRules) {
|
||||
var rule = this.state.vectorPushRules[i];
|
||||
if (rule.vectorRuleId === vectorRuleId) {
|
||||
return rule;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_actionsFor: function(pushRuleVectorState) {
|
||||
if (pushRuleVectorState === PushRuleVectorState.ON) {
|
||||
return ['notify'];
|
||||
}
|
||||
else if (pushRuleVectorState === PushRuleVectorState.LOUD) {
|
||||
return ['notify',
|
||||
{'set_tweak': 'sound', 'value': 'default'},
|
||||
{'set_tweak': 'highlight', 'value': 'true'}
|
||||
];;
|
||||
}
|
||||
},
|
||||
|
||||
// Determine whether a rule is in the PushRuleVectorState.ON category or in PushRuleVectorState.LOUD
|
||||
// regardless of its enabled state.
|
||||
_pushRuleVectorStateKind: function(rule) {
|
||||
var stateKind;
|
||||
|
||||
// Count tweaks to determine if it is a ON or LOUD rule
|
||||
var tweaks = 0;
|
||||
for (var j in rule.actions) {
|
||||
var action = rule.actions[j];
|
||||
if (action.set_tweak === 'sound' ||
|
||||
(action.set_tweak === 'highlight' && action.value)) {
|
||||
tweaks++;
|
||||
}
|
||||
}
|
||||
switch (tweaks) {
|
||||
case 0:
|
||||
stateKind = PushRuleVectorState.ON;
|
||||
break;
|
||||
case 2:
|
||||
stateKind = PushRuleVectorState.LOUD;
|
||||
break;
|
||||
}
|
||||
return stateKind;
|
||||
},
|
||||
|
||||
_refreshFromServer: function() {
|
||||
|
|
Loading…
Reference in New Issue