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