Commit 2cf06eb4b4d0e4ac4b6f5dced90ef5da82a0a8fd
Merge pull request #147 from ticktackim/blogs_in_order
Blogs in order on blogIndex pagemix irving authored on 5/28/2018, 4:23:49 AM
GitHub committed on 5/28/2018, 4:23:49 AM
Parent: 67583b0e9605f9e2c2a95ff125a23e8a1cca8953
Parent: 804b24d8cddfc3e10bfebea176fdb4109178fcd6
Files changed
app/page/blogIndex.js | changed |
blog/sync/isBlog.js | changed |
package-lock.json | changed |
package.json | changed |
app/page/blogIndex.js | |||
---|---|---|---|
@@ -1,18 +1,22 @@ | |||
1 | 1 … | const nest = require('depnest') | |
2 | -const { h, Value, Array: MutantArray, resolve } = require('mutant') | ||
2 … | +const { h, Array: MutantArray, resolve } = require('mutant') | ||
3 … | +const Scroller = require('mutant-scroll') | ||
3 | 4 … | const pull = require('pull-stream') | |
4 | 5 … | ||
6 … | +const Next = require('pull-next') | ||
7 … | +const get = require('lodash/get') | ||
8 … | +const clone = require('lodash/cloneDeep') | ||
9 … | + | ||
5 | 10 … | exports.gives = nest('app.page.blogIndex') | |
6 | 11 … | ||
7 | 12 … | exports.needs = nest({ | |
8 | 13 … | 'app.html.blogCard': 'first', | |
9 | 14 … | 'app.html.topNav': 'first', | |
10 | - 'app.html.scroller': 'first', | ||
11 | 15 … | 'app.html.sideNav': 'first', | |
12 | 16 … | 'blog.sync.isBlog': 'first', | |
13 | - 'feed.pull.public': 'first', | ||
14 | - 'feed.pull.type': 'first', | ||
17 … | + 'sbot.pull.stream': 'first', | ||
18 … | + 'sbot.obs.connection': 'first', | ||
15 | 19 … | 'history.sync.push': 'first', | |
16 | 20 … | 'keys.sync.id': 'first', | |
17 | 21 … | 'message.sync.isBlocked': 'first', | |
18 | 22 … | 'translations.sync.strings': 'first', | |
@@ -26,23 +30,16 @@ | |||
26 | 30 … | // location here can expected to be: { page: 'blogIndex'} | |
27 | 31 … | ||
28 | 32 … | var strings = api.translations.sync.strings() | |
29 | 33 … | ||
30 | - var blogs = api.app.html.scroller({ | ||
34 … | + var blogs = Scroller({ | ||
31 | 35 … | classList: ['content'], | |
32 | 36 … | prepend: api.app.html.topNav(location), | |
33 | - // stream: api.feed.pull.public, | ||
34 | - stream: api.feed.pull.type('blog'), | ||
35 | - filter: () => pull( | ||
36 | - // pull.filter(api.blog.sync.isBlog), | ||
37 | - pull.filter(msg => !msg.value.content.root), // show only root messages | ||
38 | - pull.filter(msg => !api.message.sync.isBlocked(msg)) | ||
39 | - ), | ||
40 | - // FUTURE : if we need better perf, we can add a persistent cache. At the moment this page is fast enough though. | ||
41 | - // See implementation of app.html.sideNav for example | ||
42 | - store: blogsCache, | ||
37 … | + streamToTop: Source({ reverse: false, live: true, old: false, limit: 20 }), | ||
38 … | + streamToBottom: Source({ reverse: true, live: false, limit: 20 }), | ||
43 | 39 … | updateTop: update, | |
44 | 40 … | updateBottom: update, | |
41 … | + store: blogsCache, | ||
45 | 42 … | render | |
46 | 43 … | }) | |
47 | 44 … | ||
48 | 45 … | return h('Page -blogIndex', {title: strings.home}, [ | |
@@ -50,25 +47,43 @@ | |||
50 | 47 … | blogs | |
51 | 48 … | ]) | |
52 | 49 … | }) | |
53 | 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), // isBlog or Plog? | ||
71 … | + // pull.filter(msg => !msg.value.content.root), // show only root messages | ||
72 … | + pull.filter(msg => !api.message.sync.isBlocked(msg)) // this is already in feed.pull.type | ||
73 … | + ) | ||
74 … | + } | ||
75 … | + | ||
54 | 76 … | function update (soFar, newBlog) { | |
55 | 77 … | soFar.transaction(() => { | |
56 | - const { timestamp } = newBlog.value | ||
57 | - | ||
58 | 78 … | var object = newBlog // Value(newBlog) | |
59 | 79 … | ||
60 | 80 … | const index = indexOf(soFar, (blog) => newBlog.key === resolve(blog).key) | |
61 | 81 … | // if blog already in cache, not needed again | |
62 | 82 … | if (index >= 0) return | |
63 | 83 … | ||
64 | - // Orders by: time received | ||
65 | - const justOlderPosition = indexOf(soFar, (msg) => newBlog.timestamp > resolve(msg).timestamp) | ||
84 … | + const justOlderPosition = indexOf(soFar, (msg) => newBlog.value.timestamp > resolve(msg).value.timestamp) | ||
66 | 85 … | ||
67 | - // Orders by: time published BUT the messagesByType stream streams _by time received_ | ||
68 | - // TODO - we need an index of all blogs otherwise the scroller doesn't work... | ||
69 | - // const justOlderPosition = indexOf(soFar, (msg) => timestamp > resolve(msg).value.timestamp) | ||
70 | - | ||
71 | 86 … | if (justOlderPosition > -1) { | |
72 | 87 … | soFar.insert(object, justOlderPosition) | |
73 | 88 … | } else { | |
74 | 89 … | soFar.push(object) | |
@@ -91,4 +106,51 @@ | |||
91 | 106 … | } | |
92 | 107 … | } | |
93 | 108 … | return -1 | |
94 | 109 … | } | |
110 … | + | ||
111 … | +// this is needed because muxrpc doesn't do back-pressure yet | ||
112 … | +// this is a modified pull-next-step for ssb-query | ||
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 … | + // mix: not sure which case this ends stream for | ||
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 … | + // retry on errors... | ||
146 … | + if (err) { | ||
147 … | + count = -1 | ||
148 … | + return count | ||
149 … | + } | ||
150 … | + // end stream if there were no results | ||
151 … | + if (last == null) last = {} | ||
152 … | + } | ||
153 … | + ) | ||
154 … | + ) | ||
155 … | + }) | ||
156 … | +} |
blog/sync/isBlog.js | ||
---|---|---|
@@ -2,9 +2,9 @@ | ||
2 | 2 … | const get = require('lodash/get') |
3 | 3 … | const isBlog = require('scuttle-blog/isBlog') |
4 | 4 … | |
5 | 5 … | exports.gives = nest({ |
6 | - 'blog.sync.isBlog': true, | |
6 … | + 'blog.sync.isBlog': true | |
7 | 7 … | }) |
8 | 8 … | |
9 | 9 … | const MIN_LENGTH_FOR_BLOG_POST = 800 |
10 | 10 … | |
@@ -13,12 +13,16 @@ | ||
13 | 13 … | 'blog.sync.isBlog': isBloggy |
14 | 14 … | }) |
15 | 15 … | |
16 | 16 … | function isBloggy (msg) { |
17 … | + // if (!isBlog(msg)) { | |
18 … | + // console.log(isBlog.errors) | |
19 … | + // console.log(JSON.stringify(msg.value.content, null, 2)) | |
20 … | + // console.log('') | |
21 … | + // } | |
17 | 22 … | if (isBlog(msg)) return true |
18 | 23 … | |
19 | 24 … | const type = msg.value.content.type |
20 | 25 … | if (type === 'post' && get(msg, 'value.content.text', '').length > MIN_LENGTH_FOR_BLOG_POST) return true |
21 | 26 … | return false |
22 | 27 … | } |
23 | 28 … | } |
24 | - |
package-lock.json | ||
---|---|---|
The diff is too large to show. Use a local git client to view these changes. Old file size: 289783 bytes New file size: 282870 bytes |
package.json | ||
---|---|---|
@@ -47,9 +47,9 @@ | ||
47 | 47 … | "patch-history": "^1.0.0", |
48 | 48 … | "patch-profile": "^1.0.4", |
49 | 49 … | "patch-settings": "^1.1.2", |
50 | 50 … | "patch-suggest": "^1.1.0", |
51 | - "patchcore": "^1.23.3", | |
51 … | + "patchcore": "^1.26.1", | |
52 | 52 … | "pull-defer": "^0.2.2", |
53 | 53 … | "pull-next": "^1.0.1", |
54 | 54 … | "pull-next-step": "^1.0.0", |
55 | 55 … | "pull-obv": "^1.3.0", |
@@ -70,9 +70,9 @@ | ||
70 | 70 … | "ssb-keys": "^7.0.10", |
71 | 71 … | "ssb-markdown": "^3.3.0", |
72 | 72 … | "ssb-mentions": "^0.4.0", |
73 | 73 … | "ssb-private": "^0.1.2", |
74 | - "ssb-query": "^0.1.2", | |
74 … | + "ssb-query": "^2.1.0", | |
75 | 75 … | "ssb-reduce-stream": "^1.0.2", |
76 | 76 … | "ssb-ref": "^2.7.1", |
77 | 77 … | "ssb-server-channel": "^1.1.1", |
78 | 78 … | "ssb-ws": "^1.0.3", |
Built with git-ssb-web