nodebb-plugin-embed
Version:
Embed media and rich content in posts: youtube, vimeo, twitch etc. All embeds are based on the rules. You are encouraged to build your own rules to embed everything what is embeddable.
75 lines (60 loc) • 1.85 kB
JavaScript
/**
* Created by Nicolas on 10/21/15.
*/
import Actions from '../actions';
import alt from '../alt';
import objectAssign from 'object-assign';
class RulesStore {
constructor() {
this.bindAction(Actions.ruleDidDelete, this.ruleDidDelete);
this.bindAction(Actions.rulesDidUpdate, this.rulesDidUpdate);
this.bindAction(Actions.selectRule, this.ruleDidSelect);
this.bindAction(Actions.updateRule, this.ruleShouldUpdate);
this.state = {
rules : [],
selectedRule: null
};
}
gerRuleById(id, rules) {
let i = 0, len = rules.length, rule;
for (i; i < len; ++i) {
rule = rules[i];
if (rule.rid === id) {
return {index: i, rule: objectAssign({}, rule)};
}
}
return null;
}
ruleDidDelete(rule) {
if (this.state.selectedRule && this.state.selectedRule.name === rule.name) {
this.setState({
selectedRule: null
});
}
}
ruleDidSelect(rule) {
this.setState({
selectedRule: rule
});
}
rulesDidUpdate(rules) {
this.setState({
rules: rules
})
}
ruleShouldUpdate(payload) {
let rules = this.state.rules.slice();
let searchResult = this.gerRuleById(payload.rule.rid, rules);
let rule = searchResult.rule;
let update = {};
rule[payload.field] = payload.value;
rules[searchResult.index] = rule;
update.rules = rules;
// Update selection if needed
if (this.state.selectedRule && this.state.selectedRule.rid === rule.rid) {
update.selectedRule = rule;
}
this.setState(update);
}
}
export default alt.createStore(RulesStore, 'RulesStore');