Commit 143963d78f350d2500b880b06019e46b743433b2
refactor calendar getter to remove duplications..?
mixmix committed on 10/31/2018, 8:44:06 AMParent: a601d157ddcecfcae2a4c1f3088109dbe87ed7e8
Files changed
app/page/calendar.js | changed |
app/page/calendar.js | ||
---|---|---|
@@ -2,8 +2,9 @@ | ||
2 | 2 … | const { h, Array: MutantArray, map, Struct, computed, watch, throttle, resolve } = require('mutant') |
3 | 3 … | const Month = require('marama') |
4 | 4 … | |
5 | 5 … | const pull = require('pull-stream') |
6 … | +const paraMap = require('pull-paramap') | |
6 | 7 … | const { isMsg } = require('ssb-ref') |
7 | 8 … | |
8 | 9 … | exports.gives = nest({ |
9 | 10 … | 'app.page.calendar': true, |
@@ -13,8 +14,9 @@ | ||
13 | 14 … | exports.needs = nest({ |
14 | 15 … | 'app.sync.goTo': 'first', |
15 | 16 … | 'keys.sync.id': 'first', |
16 | 17 … | 'message.html.render': 'first', |
18 … | + 'message.sync.unbox': 'first', | |
17 | 19 … | 'sbot.async.get': 'first', |
18 | 20 … | 'sbot.pull.stream': 'first' |
19 | 21 … | }) |
20 | 22 … | |
@@ -42,9 +44,9 @@ | ||
42 | 44 … | lt: endOfDay(d) |
43 | 45 … | }) |
44 | 46 … | }) |
45 | 47 … | |
46 | - watch(state.year, year => getGatherings(year, state.events, api)) | |
48 … | + watch(state.year, year => getGatherings(year, state.events, Query)) | |
47 | 49 … | watchAttending(state.attending, api) |
48 | 50 … | |
49 | 51 … | const page = h('CalendarPage', { title: '/calendar' }, [ |
50 | 52 … | Calendar(state), |
@@ -54,8 +56,12 @@ | ||
54 | 56 … | page.scroll = (i) => scroll(state.range, i) |
55 | 57 … | |
56 | 58 … | return page |
57 | 59 … | } |
60 … | + | |
61 … | + function Query (opts) { | |
62 … | + return api.sbot.pull.stream(server => server.query.read(opts)) | |
63 … | + } | |
58 | 64 … | } |
59 | 65 … | |
60 | 66 … | function scroll (range, i) { |
61 | 67 … | const { gte, lt } = resolve(range) |
@@ -102,9 +108,11 @@ | ||
102 | 108 … | pull.values(keys), |
103 | 109 … | pull.asyncMap((key, cb) => { |
104 | 110 … | api.sbot.async.get(key, (err, value) => { |
105 | 111 … | if (err) return cb(err) |
106 | - cb(null, {key, value}) | |
112 … | + | |
113 … | + if (typeof value.content === 'object') cb(null, {key, value}) | |
114 … | + else cb(null, api.message.sync.unbox({key, value})) | |
107 | 115 … | }) |
108 | 116 … | }), |
109 | 117 … | pull.drain(msg => gatherings.push(msg)) |
110 | 118 … | ) |
@@ -148,9 +156,10 @@ | ||
148 | 156 … | }) |
149 | 157 … | ) |
150 | 158 … | } |
151 | 159 … | |
152 | -function getGatherings (year, events, api) { | |
160 … | + | |
161 … | +function getGatherings (year, events, Query) { | |
153 | 162 … | // gatherings specify times with `about` messages which have a startDateTime |
154 | 163 … | // NOTE - this gets a window of about messages around the current year but does not gaurentee |
155 | 164 … | // that we got all events in this year (e.g. something booked 6 months agead would be missed) |
156 | 165 … | const query = [{ |
@@ -162,34 +171,39 @@ | ||
162 | 171 … | }, |
163 | 172 … | content: { |
164 | 173 … | type: 'about', |
165 | 174 … | startDateTime: { |
166 | - epoch: {$gt: 0} | |
175 … | + epoch: {$is: 'number'} | |
167 | 176 … | } |
168 | 177 … | } |
169 | 178 … | } |
170 | 179 … | } |
171 | 180 … | }, { |
172 | 181 … | $map: { |
173 | - key: ['value', 'content', 'about'], // gathering | |
174 | - date: ['value', 'content', 'startDateTime', 'epoch'] | |
182 … | + key: ['value', 'content', 'about'], | |
183 … | + date: ['value', 'content', 'startDateTime', 'epoch'], | |
184 … | + ts: ['value', 'timestamp'] | |
175 | 185 … | } |
176 | 186 … | }] |
177 | - | |
178 | 187 … | const opts = { reverse: false, live: true, query } |
179 | 188 … | |
189 … | + var target | |
180 | 190 … | pull( |
181 | - api.sbot.pull.stream(server => server.query.read(opts)), | |
191 … | + Query(opts), | |
182 | 192 … | pull.filter(m => !m.sync), |
183 | - pull.filter(r => isMsg(r.key) && Number.isInteger(r.date)), | |
184 | - pull.map(r => { | |
185 | - return { key: r.key, date: new Date(r.date) } | |
193 … | + pull.filter(m => m.date > 0 && Number.isInteger(m.date)), | |
194 … | + pull.map(m => { | |
195 … | + m.date = new Date(m.date) | |
196 … | + return m | |
186 | 197 … | }), |
187 | - pull.drain(({ key, date }) => { | |
188 | - var target = events.find(ev => ev.data.key === key) | |
189 | - if (target && target.date <= date) events.delete(target) | |
198 … | + pull.drain(({ key, date, ts }) => { | |
199 … | + target = events.find(ev => ev.data.key === key) | |
200 … | + if (target && target.data.ts <= ts) events.delete(target) | |
201 … | + // TODO causally sorted about messages | |
202 … | + // could do this with a backlinks query, paramap'd | |
190 | 203 … | |
191 | - events.push({ date, data: { key } }) | |
204 … | + | |
205 … | + events.push({ date, data: { key, ts } }) | |
192 | 206 … | }) |
193 | 207 … | ) |
194 | 208 … | } |
195 | 209 … |
Built with git-ssb-web