Files: 0e0a093a37c300b42c555fadd15a899a1c917149 / modules / profile / obs / contact.js
2974 bytesRaw
1 | var computed = require('mutant/computed') |
2 | var nest = require('depnest') |
3 | |
4 | exports.needs = nest({ |
5 | 'keys.sync.id': 'first', |
6 | 'contact.obs': { |
7 | followers: 'first', |
8 | following: 'first', |
9 | blockers: 'first' |
10 | } |
11 | }) |
12 | |
13 | exports.gives = nest('profile.obs.contact') |
14 | |
15 | exports.create = function (api) { |
16 | return nest('profile.obs.contact', function (id) { |
17 | var yourId = api.keys.sync.id() |
18 | var yourFollowing = api.contact.obs.following(yourId) |
19 | var yourFollowers = api.contact.obs.followers(yourId) |
20 | |
21 | var followers = api.contact.obs.followers(id) |
22 | var following = api.contact.obs.following(id) |
23 | var sync = computed([followers.sync, following.sync], (...x) => x.every(Boolean)) |
24 | |
25 | var blockers = api.contact.obs.blockers(id) |
26 | var youBlock = computed(blockers, function (blockers) { |
27 | return blockers.includes(yourId) |
28 | }) |
29 | |
30 | var youFollow = computed([yourFollowing], function (yourFollowing) { |
31 | return yourFollowing.includes(id) |
32 | }) |
33 | |
34 | var yourFriends = computed([yourFollowers, yourFollowing], inAllSets) |
35 | |
36 | var blockingFriends = computed([yourFollowers, yourFollowing, blockers], inAllSets) |
37 | var mutualFriends = computed([yourFollowers, yourFollowing, followers, following], inAllSets) |
38 | var outgoingVia = computed([yourFollowers, following], inAllSets) |
39 | var incomingVia = computed([yourFollowing, followers], inAllSets) |
40 | |
41 | var hasOutgoing = computed([yourFollowers, following], (a, b) => { |
42 | return a.some((id) => b.includes(id)) |
43 | }) |
44 | var hasIncoming = computed([followers, yourFollowing], (a, b) => { |
45 | return a.some((id) => b.includes(id)) |
46 | }) |
47 | |
48 | var isYou = computed([yourId, id], (a, b) => a === b) |
49 | |
50 | var isNotFollowingAnybody = computed([following, following.sync], (following, sync) => { |
51 | return sync && (!following || !following.length) |
52 | }) |
53 | |
54 | var hasNoFollowers = computed([followers, followers.sync], (followers, sync) => { |
55 | return sync && (!followers || !followers.length) |
56 | }) |
57 | |
58 | return { |
59 | followers, |
60 | following, |
61 | blockers, |
62 | blockingFriends, |
63 | blockingFriendsCount: count(blockingFriends), |
64 | mutualFriends, |
65 | mutualFriendsCount: count(mutualFriends), |
66 | outgoingVia, |
67 | outgoingViaCount: count(outgoingVia), |
68 | incomingVia, |
69 | incomingViaCount: count(incomingVia), |
70 | hasOutgoing, |
71 | isNotFollowingAnybody, |
72 | hasNoFollowers, |
73 | noOutgoing: not(hasOutgoing, isYou), |
74 | hasIncoming, |
75 | noIncoming: not(hasIncoming, isYou), |
76 | yourId, |
77 | yourFollowing, |
78 | yourFollowers, |
79 | yourFriends, |
80 | youFollow, |
81 | youBlock, |
82 | isYou, |
83 | notFollowing: not(youFollow, isYou), |
84 | sync |
85 | } |
86 | }) |
87 | } |
88 | |
89 | function inAllSets (first, ...rest) { |
90 | return first.filter(value => rest.every((collection) => collection.includes(value))) |
91 | } |
92 | |
93 | function not (obs, isFalse) { |
94 | return computed([obs, isFalse], (x, isFalse) => isFalse ? false : !x) |
95 | } |
96 | |
97 | function count (obs) { |
98 | return computed(obs, (x) => x.length) |
99 | } |
100 |
Built with git-ssb-web