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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
// simple version, only toggle watch / unwatch
const simpleWatchable = collection => {
collection.attachSchema({
watchers: {
type: [String],
optional: true,
},
});
collection.helpers({
getWatchLevels() {
return [true, false];
},
watcherIndex(userId) {
return this.watchers.indexOf(userId);
},
findWatcher(userId) {
return _.contains(this.watchers, userId);
},
});
collection.mutations({
setWatcher(userId, level) {
// if level undefined or null or false, then remove
if (!level) return { $pull: { watchers: userId } };
return { $addToSet: { watchers: userId } };
},
});
};
// more complex version of same interface, with 3 watching levels
const complexWatchOptions = ['watching', 'tracking', 'muted'];
const complexWatchDefault = 'muted';
const complexWatchable = collection => {
collection.attachSchema({
'watchers.$.userId': {
type: String,
},
'watchers.$.level': {
type: String,
allowedValues: complexWatchOptions,
},
});
collection.helpers({
getWatchOptions() {
return complexWatchOptions;
},
getWatchDefault() {
return complexWatchDefault;
},
watcherIndex(userId) {
return _.pluck(this.watchers, 'userId').indexOf(userId);
},
findWatcher(userId) {
return _.findWhere(this.watchers, { userId });
},
getWatchLevel(userId) {
const watcher = this.findWatcher(userId);
return watcher ? watcher.level : complexWatchDefault;
},
});
collection.mutations({
setWatcher(userId, level) {
// if level undefined or null or false, then remove
if (level === complexWatchDefault) level = null;
if (!level) return { $pull: { watchers: { userId } } };
const index = this.watcherIndex(userId);
if (index < 0) return { $push: { watchers: { userId, level } } };
return {
$set: {
[`watchers.${index}.level`]: level,
},
};
},
});
};
complexWatchable(Boards);
simpleWatchable(Lists);
simpleWatchable(Cards);
|