1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- // 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);
|