app/html/filter.jsView |
---|
3 | 3 … | const Abort = require('pull-abortable') |
4 | 4 … | const pull = require('pull-stream') |
5 | 5 … | const addSuggest = require('suggest-box') |
6 | 6 … | const { isFeed } = require('ssb-ref') |
7 | | -const some = require('lodash/some') |
8 | 7 … | const get = require('lodash/get') |
9 | 8 … | const isEqual = require('lodash/isEqual') |
10 | 9 … | |
11 | 10 … | exports.gives = nest('app.html.filter') |
12 | 11 … | |
13 | 12 … | exports.needs = nest({ |
| 13 … | + 'about.async.suggest': 'first', |
14 | 14 … | 'channel.async.suggest': 'first', |
15 | 15 … | 'contact.obs.following': 'first', |
16 | 16 … | 'keys.sync.id': 'first', |
17 | 17 … | 'settings.obs.get': 'first', |
28 | 28 … | |
29 | 29 … | const myId = api.keys.sync.id() |
30 | 30 … | const peopleIFollow = api.contact.obs.following(myId) |
31 | 31 … | |
32 | | - const { set } = api.settings.sync |
33 | | - |
34 | 32 … | const filterSettings = api.settings.obs.get('filter', {exclude: {}}) |
35 | 33 … | |
36 | | - const channelInput = h('input', |
37 | | - { value: filterSettings().exclude.channels, |
38 | | - 'ev-keyup': (ev) => { |
39 | | - var text = ev.target.value |
40 | | - if (text.length == 0 || ev.which == 13) { |
41 | | - api.settings.sync.set({ |
42 | | - filter: { |
43 | | - exclude: { |
44 | | - channels: text |
45 | | - } |
| 34 … | + const channelInput = h('input', { |
| 35 … | + value: filterSettings().exclude.channels, |
| 36 … | + 'ev-keyup': (ev) => { |
| 37 … | + var text = ev.target.value |
| 38 … | + if (text.length === 0 || ev.which === 13) { |
| 39 … | + api.settings.sync.set({ |
| 40 … | + filter: { |
| 41 … | + exclude: { |
| 42 … | + channels: text |
46 | 43 … | } |
47 | | - }) |
48 | | - draw() |
49 | | - } |
| 44 … | + } |
| 45 … | + }) |
| 46 … | + draw() |
50 | 47 … | } |
51 | 48 … | } |
52 | | - ) |
| 49 … | + }) |
53 | 50 … | |
| 51 … | + const userInput = h('input') |
|
| 52 … | + |
54 | 53 … | const isFiltered = computed(filterSettings, (filterSettings) => { |
55 | 54 … | const _settings = Object.assign({}, filterSettings) |
56 | 55 … | delete _settings.defaults |
57 | 56 … | |
70 | 69 … | 'Filter', |
71 | 70 … | h('i.fa.fa-filter') |
72 | 71 … | ]), |
73 | 72 … | h('section', [ |
| 73 … | + h('div.users', [ |
| 74 … | + toggle({ type: 'peopleIFollow', filterGroup: 'only', label: 'Only people I follow' }), |
| 75 … | + h('div.user-filter', [ |
| 76 … | + h('label', 'Only this user (temporary filter):'), |
| 77 … | + userInput |
| 78 … | + ]) |
| 79 … | + ]), |
74 | 80 … | h('div.channels', [ |
75 | 81 … | h('label', 'Exclude channels'), |
76 | 82 … | channelInput |
77 | 83 … | ]), |
78 | | - toggle({ type: 'peopleIFollow', filterGroup: 'only', label: 'Only people I follow' }), |
79 | 84 … | h('div.message-types', [ |
80 | 85 … | h('header', 'Show messages'), |
81 | 86 … | toggle({ type: 'post' }), |
82 | 87 … | toggle({ type: 'like' }), |
84 | 89 … | toggle({ type: 'contact' }), |
85 | 90 … | toggle({ type: 'channel' }), |
86 | 91 … | toggle({ type: 'pub' }), |
87 | 92 … | toggle({ type: 'chess' }) |
| 93 … | + ]), |
| 94 … | + h('div.root-messages', [ |
| 95 … | + toggle({ type: 'rootMessages', filterGroup: 'only', label: 'Root messages only' }) |
88 | 96 … | ]) |
89 | 97 … | ]) |
90 | 98 … | ]) |
91 | 99 … | ]) |
129 | 137 … | |
130 | 138 … | draw() |
131 | 139 … | }) |
132 | 140 … | |
| 141 … | + var userId |
| 142 … | + const getAboutSuggestions = api.about.async.suggest() |
| 143 … | + addSuggest(userInput, (inputText, cb) => { |
| 144 … | + inputText = inputText.replace(/^@/, '') |
| 145 … | + cb(null, getAboutSuggestions(inputText.slice(1))) |
| 146 … | + }, {cls: 'PatchSuggest'}) |
| 147 … | + userInput.addEventListener('suggestselect', ev => { |
| 148 … | + userId = ev.detail.id |
| 149 … | + userInput.value = userId |
| 150 … | + |
| 151 … | + draw() |
| 152 … | + }) |
| 153 … | + |
133 | 154 … | function followFilter (msg) { |
134 | 155 … | if (!filterSettings().only.peopleIFollow) return true |
135 | 156 … | |
136 | 157 … | return Array.from(peopleIFollow()).concat(myId).includes(msg.value.author) |
137 | 158 … | } |
138 | 159 … | |
| 160 … | + function userFilter (msg) { |
| 161 … | + if (!userId) return true |
| 162 … | + |
| 163 … | + return msg.value.author === userId |
| 164 … | + } |
| 165 … | + |
| 166 … | + function rootFilter (msg) { |
| 167 … | + if (!filterSettings().only.rootMessages) return true |
| 168 … | + |
| 169 … | + return !msg.value.content.root |
| 170 … | + } |
| 171 … | + |
139 | 172 … | function channelFilter (msg) { |
140 | 173 … | var filters = filterSettings().exclude.channels |
141 | 174 … | if (!filters) return true |
142 | 175 … | filters = filters.split(' ').map(c => c.slice(1)) |
158 | 191 … | function filterDownThrough () { |
159 | 192 … | return pull( |
160 | 193 … | downScrollAborter, |
161 | 194 … | pull.filter(followFilter), |
| 195 … | + pull.filter(userFilter), |
| 196 … | + pull.filter(rootFilter), |
162 | 197 … | pull.filter(channelFilter), |
163 | 198 … | pull.filter(messageFilter) |
164 | 199 … | ) |
165 | 200 … | } |
169 | 204 … | function filterUpThrough () { |
170 | 205 … | return pull( |
171 | 206 … | upScrollAborter, |
172 | 207 … | pull.filter(followFilter), |
| 208 … | + pull.filter(userFilter), |
| 209 … | + pull.filter(rootFilter), |
173 | 210 … | pull.filter(channelFilter), |
174 | 211 … | pull.filter(messageFilter) |
175 | 212 … | ) |
176 | 213 … | } |