about/async/suggest.jsView |
---|
10 | 10 … | 'about.obs.groupedValues': 'first', |
11 | 11 … | 'about.obs.name': 'first', |
12 | 12 … | 'about.obs.imageUrl': 'first', |
13 | 13 … | 'contact.obs.following': 'first', |
14 | | - 'contact.obs.followers': 'first', |
15 | 14 … | 'feed.obs.recent': 'first', |
16 | 15 … | 'keys.sync.id': 'first' |
17 | 16 … | }) |
18 | 17 … | |
19 | 18 … | exports.create = function (api) { |
| 19 … | + var recentSuggestions = null |
20 | 20 … | var suggestions = null |
21 | | - var recentSuggestions = null |
22 | 21 … | |
23 | 22 … | return nest('about.async.suggest', suggestedProfile) |
24 | 23 … | |
25 | 24 … | function suggestedProfile () { |
26 | 25 … | loadSuggestions() |
27 | 26 … | |
28 | | - return function (word) { |
29 | | - if (!word) return recentSuggestions() |
| 27 … | + return function (word, extraIds = []) { |
| 28 … | + var moreSuggestions = buildSuggestions(extraIds) |
30 | 29 … | |
| 30 … | + if (!word && extraIds.length) return resolve(moreSuggestions) |
| 31 … | + if (!word) return resolve(recentSuggestions) |
| 32 … | + |
31 | 33 … | var wordNormed = normalise(word) |
| 34 … | + |
32 | 35 … | return suggestions() |
| 36 … | + .concat(resolve(moreSuggestions)) |
33 | 37 … | .filter(item => ~normalise(item.title).indexOf(wordNormed)) |
34 | 38 … | .sort((a, b) => { |
35 | 39 … | |
36 | 40 … | if (a.title === word) return -1 |
37 | 41 … | if (b.title === word) return +1 |
38 | 42 … | |
| 43 … | + |
|
39 | 44 … | const normedATitle = normalise(a.title) |
40 | 45 … | const normedBTitle = normalise(b.title) |
41 | 46 … | |
42 | 47 … | |
65 | 70 … | }) |
66 | 71 … | } |
67 | 72 … | } |
68 | 73 … | |
| 74 … | + |
| 75 … | + |
| 76 … | + |
69 | 77 … | function loadSuggestions () { |
70 | 78 … | if (suggestions) return |
71 | 79 … | |
72 | 80 … | var myId = api.keys.sync.id() |
73 | 81 … | var following = api.contact.obs.following(myId) |
74 | | - var followers = api.contact.obs.followers(myId) |
75 | 82 … | var recentlyUpdated = api.feed.obs.recent() |
76 | | - var contacts = computed([following, followers, recentlyUpdated], (a, b, c) => { |
77 | | - var result = new Set(a) |
78 | | - b.forEach(item => result.add(item)) |
79 | | - c.forEach(item => result.add(item)) |
80 | 83 … | |
81 | | - return Array.from(result) |
82 | | - }) |
83 | | - |
84 | 84 … | recentSuggestions = map( |
85 | 85 … | computed(recentlyUpdated, (items) => Array.from(items).slice(0, 10)), |
86 | 86 … | buildSuggestion, |
87 | 87 … | {idle: true} |
88 | 88 … | ) |
| 89 … | + watch(recentSuggestions) |
89 | 90 … | |
| 91 … | + var contacts = computed([following, recentlyUpdated], (a, b) => { |
| 92 … | + var result = new Set(a) |
| 93 … | + b.forEach(item => result.add(item)) |
| 94 … | + |
| 95 … | + return Array.from(result) |
| 96 … | + }) |
90 | 97 … | const suggestionsRecord = lookup(contacts, contact => { |
91 | 98 … | return [contact, keys(api.about.obs.groupedValues(contact, 'name'))] |
92 | 99 … | }) |
93 | | - |
94 | 100 … | suggestions = concat( |
95 | | - map(dictToCollection(suggestionsRecord), pluralSuggestions, {idle: true}) |
| 101 … | + map( |
| 102 … | + dictToCollection(suggestionsRecord), |
| 103 … | + pluralSuggestions, |
| 104 … | + {idle: true} |
| 105 … | + ) |
96 | 106 … | ) |
97 | | - |
98 | | - watch(recentSuggestions) |
99 | 107 … | watch(suggestions) |
100 | 108 … | } |
101 | 109 … | |
102 | 110 … | function pluralSuggestions (item) { |
128 | 136 … | }) |
129 | 137 … | }) |
130 | 138 … | } |
131 | 139 … | |
| 140 … | + function buildSuggestions (idsObs) { |
| 141 … | + return concat([ |
| 142 … | + computed([idsObs], ids => { |
| 143 … | + return ids |
| 144 … | + .filter(isFeed) |
| 145 … | + .reduce((sofar, feedId) => { |
| 146 … | + if (sofar.includes(feedId)) return sofar |
| 147 … | + return [...sofar, feedId] |
| 148 … | + }, []) |
| 149 … | + .map(buildSuggestion) |
| 150 … | + }) |
| 151 … | + ]) |
| 152 … | + } |
| 153 … | + |
132 | 154 … | |
133 | 155 … | function buildSuggestion (id) { |
134 | 156 … | var name = api.about.obs.name(id) |
135 | 157 … | return Struct({ |
| 158 … | + |
136 | 159 … | id, |
137 | 160 … | title: name, |
138 | 161 … | subtitle: h('div.key', id.substring(0, KEY_SAMPLE_LENGTH)), |
139 | 162 … | value: computed([name, id], mention), |
143 | 166 … | } |
144 | 167 … | } |
145 | 168 … | |
146 | 169 … | function normalise (word) { |
147 | | - return word.toLowerCase().replace(/(\s|-)/g, '') |
| 170 … | + |
| 171 … | + |
| 172 … | + return resolve(word).toLowerCase().replace(/(\s|-)/g, '') |
148 | 173 … | } |
149 | 174 … | |
150 | 175 … | function mention (name, id) { |
151 | 176 … | return `[@${name}](${id})` |