app/page/blogIndex.jsView |
---|
1 | 1 … | const nest = require('depnest') |
2 | | -const { h, Value, Array: MutantArray, resolve } = require('mutant') |
| 2 … | +const { h, Array: MutantArray, resolve } = require('mutant') |
3 | 3 … | const Scroller = require('mutant-scroll') |
4 | 4 … | const pull = require('pull-stream') |
| 5 … | + |
5 | 6 … | const Next = require('pull-next') |
| 7 … | +const get = require('lodash/get') |
| 8 … | +const clone = require('lodash/cloneDeep') |
6 | 9 … | |
7 | 10 … | exports.gives = nest('app.page.blogIndex') |
8 | 11 … | |
9 | 12 … | exports.needs = nest({ |
10 | 13 … | 'app.html.blogCard': 'first', |
11 | 14 … | 'app.html.topNav': 'first', |
12 | | - |
13 | 15 … | 'app.html.sideNav': 'first', |
14 | 16 … | 'blog.sync.isBlog': 'first', |
15 | | - 'feed.pull.public': 'first', |
16 | | - 'feed.pull.type': 'first', |
| 17 … | + 'sbot.pull.stream': 'first', |
| 18 … | + 'sbot.obs.connection': 'first', |
17 | 19 … | 'history.sync.push': 'first', |
18 | 20 … | 'keys.sync.id': 'first', |
19 | 21 … | 'message.sync.isBlocked': 'first', |
20 | 22 … | 'translations.sync.strings': 'first', |
28 | 30 … | |
29 | 31 … | |
30 | 32 … | var strings = api.translations.sync.strings() |
31 | 33 … | |
32 | | - |
33 | | - |
34 | | - |
35 | | - |
36 | | - |
37 | | - |
38 | | - |
39 | | - |
40 | | - const streamToTop = pull( |
41 | | - |
42 | | - api.feed.pull.type('blog')({ live: true, reverse: false, old: false }), |
43 | | - |
44 | | - ) |
45 | | - |
46 | | - |
47 | | - const streamToBottom = pull( |
48 | | - Next |
49 | | - api.feed.pull.type('blog')({ live: false, reverse: true }), |
50 | | - |
51 | | - |
52 | | - ) |
53 | | - |
54 | 34 … | var blogs = Scroller({ |
55 | 35 … | classList: ['content'], |
56 | 36 … | prepend: api.app.html.topNav(location), |
57 | | - streamToTop, |
58 | | - streamToBottom, |
| 37 … | + streamToTop: Source({ reverse: false, live: true, old: false, limit: 20 }), |
| 38 … | + streamToBottom: Source({ reverse: true, live: false, limit: 20 }), |
59 | 39 … | updateTop: update, |
60 | 40 … | updateBottom: update, |
61 | 41 … | store: blogsCache, |
62 | 42 … | render |
67 | 47 … | blogs |
68 | 48 … | ]) |
69 | 49 … | }) |
70 | 50 … | |
| 51 … | + function Source (opts) { |
| 52 … | + const commonOpts = { |
| 53 … | + query: [{ |
| 54 … | + $filter: { |
| 55 … | + value: { |
| 56 … | + content: { |
| 57 … | + type: 'blog' |
| 58 … | + }, |
| 59 … | + timestamp: { $gt: 0, $lt: undefined } |
| 60 … | + } |
| 61 … | + } |
| 62 … | + }] |
| 63 … | + } |
| 64 … | + |
| 65 … | + return pull( |
| 66 … | + StepperStream( |
| 67 … | + (options) => api.sbot.pull.stream(sbot => sbot.query.read(options)), |
| 68 … | + Object.assign(commonOpts, opts) |
| 69 … | + ), |
| 70 … | + pull.filter(api.blog.sync.isBlog), |
| 71 … | + |
| 72 … | + pull.filter(msg => !api.message.sync.isBlocked(msg)) |
| 73 … | + ) |
| 74 … | + } |
| 75 … | + |
71 | 76 … | function update (soFar, newBlog) { |
72 | 77 … | soFar.transaction(() => { |
73 | 78 … | var object = newBlog |
74 | 79 … | |
75 | 80 … | const index = indexOf(soFar, (blog) => newBlog.key === resolve(blog).key) |
76 | 81 … | |
77 | 82 … | if (index >= 0) return |
78 | 83 … | |
79 | | - |
80 | | - const justOlderPosition = indexOf(soFar, (msg) => newBlog.timestamp > resolve(msg).timestamp) |
| 84 … | + const justOlderPosition = indexOf(soFar, (msg) => newBlog.value.timestamp > resolve(msg).value.timestamp) |
81 | 85 … | |
82 | | - |
83 | | - |
84 | | - |
85 | | - |
86 | 86 … | if (justOlderPosition > -1) { |
87 | 87 … | soFar.insert(object, justOlderPosition) |
88 | 88 … | } else { |
89 | 89 … | soFar.push(object) |
106 | 106 … | } |
107 | 107 … | } |
108 | 108 … | return -1 |
109 | 109 … | } |
| 110 … | + |
| 111 … | + |
| 112 … | + |
| 113 … | +function StepperStream (createStream, _opts) { |
| 114 … | + var opts = clone(_opts) |
| 115 … | + var last = null |
| 116 … | + var count = -1 |
| 117 … | + |
| 118 … | + return Next(() => { |
| 119 … | + if (last) { |
| 120 … | + if (count === 0) return |
| 121 … | + |
| 122 … | + |
| 123 … | + |
| 124 … | + var value = get(last, ['value', 'timestamp']) |
| 125 … | + if (value == null) return |
| 126 … | + |
| 127 … | + if (opts.reverse) { |
| 128 … | + opts.query[0].$filter.value.timestamp.$lt = value |
| 129 … | + } else { |
| 130 … | + opts.query[0].$filter.value.timestamp.$gt = value |
| 131 … | + } |
| 132 … | + last = null |
| 133 … | + } |
| 134 … | + |
| 135 … | + return pull( |
| 136 … | + createStream(clone(opts)), |
| 137 … | + pull.through( |
| 138 … | + (msg) => { |
| 139 … | + count++ |
| 140 … | + if (!msg.sync) { |
| 141 … | + last = msg |
| 142 … | + } |
| 143 … | + }, |
| 144 … | + (err) => { |
| 145 … | + |
| 146 … | + if (err) { |
| 147 … | + count = -1 |
| 148 … | + return count |
| 149 … | + } |
| 150 … | + |
| 151 … | + if (last == null) last = {} |
| 152 … | + } |
| 153 … | + ) |
| 154 … | + ) |
| 155 … | + }) |
| 156 … | +} |