-
Notifications
You must be signed in to change notification settings - Fork 75
/
store.js
64 lines (52 loc) · 1.41 KB
/
store.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import _ from 'lodash';
import * as remx from 'remx';
const MAX_TOPICS_SELECTED = 3;
const state = remx.state({
loading: true,
topicsByUrl: {},
selectedTopicUrls: [],
finishedTopicsSelection: false
});
export const setters = remx.setters({
setTopics(topics) {
state.topicsByUrl = _.keyBy(topics, (t) => t.url);
state.loading = false;
},
toggleTopic(topicUrl) {
if (getters.isTopicSelected(topicUrl)) {
state.selectedTopicUrls = _.without(state.selectedTopicUrls, topicUrl);
} else {
state.selectedTopicUrls.push(topicUrl);
state.selectedTopicUrls = _.takeRight(state.selectedTopicUrls, MAX_TOPICS_SELECTED);
}
},
finishTopicsSelection() {
state.finishedTopicsSelection = true;
}
});
export const getters = remx.getters({
isLoading() {
return state.loading;
},
getAllTopicsByUrl() {
return state.topicsByUrl;
},
getAllTopicsUrls() {
return _.keys(state.topicsByUrl);
},
isTopicSelected(topicUrl) {
return _.includes(state.selectedTopicUrls, topicUrl);
},
getSelectedTopicUrls() {
return state.selectedTopicUrls;
},
getSelectedTopicsByUrl() {
return _.mapValues(_.keyBy(state.selectedTopicUrls), (url) => state.topicsByUrl[url]);
},
canFinishTopicsSelection() {
return _.size(state.selectedTopicUrls) === MAX_TOPICS_SELECTED;
},
isFinishedTopicsSelection() {
return state.finishedTopicsSelection;
}
});