about/async/suggest.jsView |
---|
1 | 1 … | var nest = require('depnest') |
2 | | -var { Struct, map, concat, dictToCollection, computed, lookup, watch, keys, resolve } = require('mutant') |
| 2 … | +var { h, Struct, map, concat, dictToCollection, computed, lookup, watch, keys, resolve } = require('mutant') |
3 | 3 … | |
| 4 … | +var KEY_SAMPLE_LENGTH = 10 |
| 5 … | + |
4 | 6 … | exports.gives = nest('about.async.suggest') |
5 | 7 … | |
6 | 8 … | exports.needs = nest({ |
7 | 9 … | 'about.obs.groupedValues': 'first', |
8 | 10 … | 'about.obs.name': 'first', |
| 11 … | + 'about.obs.names': 'first', |
9 | 12 … | 'about.obs.imageUrl': 'first', |
10 | 13 … | 'contact.obs.following': 'first', |
11 | 14 … | 'feed.obs.recent': 'first', |
12 | 15 … | 'keys.sync.id': 'first' |
22 | 25 … | loadSuggestions() |
23 | 26 … | return function (word) { |
24 | 27 … | if (!word) return recentSuggestions() |
25 | 28 … | |
26 | | - return suggestions() |
27 | | - .filter(item => ~item.title.indexOf(word)) |
28 | | - .reverse() |
| 29 … | + wordLower = word.toLowerCase() |
| 30 … | + const nameMatches = suggestions() |
| 31 … | + .filter(item => { |
| 32 … | + |
| 33 … | + if (item._name) return ~item._name.toLowerCase().indexOf(wordLower) |
| 34 … | + return ~item.subtitle.toLowerCase().indexOf(wordLower) |
| 35 … | + }) |
| 36 … | + |
| 37 … | + |
| 38 … | + return nameMatches |
| 39 … | + .sort((a, b) => { |
| 40 … | + if (a._name.indexOf(word) === 0) return -1 |
| 41 … | + if (b._name.indexOf(word) === 0) return +1 |
| 42 … | + |
| 43 … | + if (a._name.toLowerCase().indexOf(word) === 0) return -1 |
| 44 … | + if (b._name.toLowerCase().indexOf(word) === 0) return +1 |
| 45 … | + }) |
| 46 … | + .sort((a, b) => { |
| 47 … | + if (a.id === b.id) return 0 |
| 48 … | + if (a.id > b.id) return -1 |
| 49 … | + if (a.id < b.id) return +1 |
| 50 … | + }) |
| 51 … | + .reduce((sofar, match) => { |
| 52 … | + |
| 53 … | + |
| 54 … | + if (sofar.find(el => el.id === match.id)) return sofar |
| 55 … | + |
| 56 … | + return [...sofar, match] |
| 57 … | + }, []) |
| 58 … | + |
| 59 … | + |
| 60 … | + |
| 61 … | + |
| 62 … | + |
29 | 63 … | } |
30 | 64 … | } |
31 | 65 … | |
32 | 66 … | function loadSuggestions () { |
61 | 95 … | } |
62 | 96 … | |
63 | 97 … | function pluralSuggestions (item) { |
64 | 98 … | const id = resolve(item.key) |
65 | | - return map(item.value, name => { |
66 | | - return Struct({ |
67 | | - id, |
68 | | - title: name, |
69 | | - subtitle: subtitle(id, name), |
70 | | - value: computed([name, id], mention), |
71 | | - image: api.about.obs.imageUrl(id), |
72 | | - showBoth: true |
| 99 … | + |
| 100 … | + return computed([api.about.obs.name(id)], myNameForThem => { |
| 101 … | + return map(item.value, name => { |
| 102 … | + const isTopAlias = name === myNameForThem |
| 103 … | + const names = item.value() |
| 104 … | + |
| 105 … | + const aliases = names |
| 106 … | + .filter(n => n != name) |
| 107 … | + .map(name => h('div.alias', |
| 108 … | + { className: name === myNameForThem ? '-bold' : '' }, |
| 109 … | + name |
| 110 … | + )) |
| 111 … | + |
| 112 … | + return Struct({ |
| 113 … | + id, |
| 114 … | + title: name, |
| 115 … | + subtitle: [ |
| 116 … | + h('div.aliases', aliases), |
| 117 … | + h('div.key', id.substring(0, KEY_SAMPLE_LENGTH)) |
| 118 … | + ], |
| 119 … | + value: mention(name, id), |
| 120 … | + image: api.about.obs.imageUrl(id), |
| 121 … | + showBoth: true, |
| 122 … | + _name: name |
| 123 … | + }) |
73 | 124 … | }) |
74 | 125 … | }) |
| 126 … | + |
75 | 127 … | } |
76 | 128 … | |
| 129 … | + |
77 | 130 … | function suggestion (id) { |
78 | 131 … | var name = api.about.obs.name(id) |
79 | 132 … | return Struct({ |
| 133 … | + id, |
80 | 134 … | title: name, |
81 | | - id, |
82 | | - subtitle: id.substring(0, 10), |
| 135 … | + subtitle: h('div.key', id.substring(0, KEY_SAMPLE_LENGTH)), |
83 | 136 … | value: computed([name, id], mention), |
84 | 137 … | image: api.about.obs.imageUrl(id), |
85 | 138 … | showBoth: true |
86 | 139 … | }) |
87 | 140 … | } |
88 | | - |
89 | | - function subtitle (id, name) { |
90 | | - return computed([api.about.obs.name(id)], commonName => { |
91 | | - return name.toLowerCase() === commonName.toLowerCase() |
92 | | - ? id.substring(0, 10) |
93 | | - : `${commonName} ${id.substring(0, 10)}` |
94 | | - }) |
95 | | - } |
96 | 141 … | } |
97 | 142 … | |
98 | 143 … | function mention (name, id) { |
99 | 144 … | return `[@${name}](${id})` |