Commit 196bfa929c905a10e03900db3ff77a5f05c35300
Merge branch 'master' into backlinks-index
Matt McKegg committed on 6/12/2017, 5:05:45 AMParent: b57e44a4c2db39bc5672f61e5a4fdc3c9abccab7
Parent: d5f37c13cd95a2e321a1e51db1e64eef746ee0ea
Files changed
blob/obs/has.js | added |
message/html/markdown.js | changed |
package.json | changed |
blob/obs/has.js | ||
---|---|---|
@@ -1,0 +1,57 @@ | ||
1 … | +var nest = require('depnest') | |
2 … | +var pull = require('pull-stream') | |
3 … | +var Value = require('mutant/value') | |
4 … | +var onceTrue = require('mutant/once-true') | |
5 … | +var defer = require('pull-defer') | |
6 … | + | |
7 … | +exports.needs = nest({ | |
8 … | + 'sbot.obs.connection': 'first' | |
9 … | +}) | |
10 … | + | |
11 … | +exports.gives = nest('blob.obs.has', true) | |
12 … | + | |
13 … | +exports.create = function (api) { | |
14 … | + var cbs = null | |
15 … | + | |
16 … | + return nest('blob.obs.has', function (id) { | |
17 … | + var value = Value() | |
18 … | + onceTrue(api.sbot.obs.connection, sbot => { | |
19 … | + sbot.blobs.has(id, (_, has) => { | |
20 … | + if (has) { | |
21 … | + value.set(true) | |
22 … | + } else { | |
23 … | + value.set(false) | |
24 … | + waitFor(id, () => value.set(true)) | |
25 … | + } | |
26 … | + }) | |
27 … | + }) | |
28 … | + return value | |
29 … | + }) | |
30 … | + | |
31 … | + function waitFor (id, cb) { | |
32 … | + if (!cbs) { | |
33 … | + cbs = {} | |
34 … | + pull( | |
35 … | + StreamWhenConnected(api.sbot.obs.connection, sbot => sbot.blobs.ls({old: false})), | |
36 … | + pull.drain(blob => { | |
37 … | + if (cbs[blob]) { | |
38 … | + while (cbs[blob].length) { | |
39 … | + cbs[blob].pop()() | |
40 … | + } | |
41 … | + delete cbs[blob] | |
42 … | + } | |
43 … | + }) | |
44 … | + ) | |
45 … | + } | |
46 … | + if (!cbs[id]) cbs[id] = [] | |
47 … | + cbs[id].push(cb) | |
48 … | + } | |
49 … | +} | |
50 … | + | |
51 … | +function StreamWhenConnected (connection, fn) { | |
52 … | + var stream = defer.source() | |
53 … | + onceTrue(connection, function (connection) { | |
54 … | + stream.resolve(fn(connection)) | |
55 … | + }) | |
56 … | + return stream | |
57 … | +} |
message/html/markdown.js | |||
---|---|---|---|
@@ -2,11 +2,13 @@ | |||
2 | 2 … | const h = require('mutant/h') | |
3 | 3 … | const ref = require('ssb-ref') | |
4 | 4 … | const nest = require('depnest') | |
5 | 5 … | var htmlEscape = require('html-escape') | |
6 … | +var watch = require('mutant/watch') | ||
6 | 7 … | ||
7 | 8 … | exports.needs = nest({ | |
8 | 9 … | 'blob.sync.url': 'first', | |
10 … | + 'blob.obs.has': 'first', | ||
9 | 11 … | 'emoji.sync.url': 'first' | |
10 | 12 … | }) | |
11 | 13 … | ||
12 | 14 … | exports.gives = nest('message.html.markdown') | |
@@ -27,24 +29,26 @@ | |||
27 | 29 … | } | |
28 | 30 … | }) | |
29 | 31 … | } | |
30 | 32 … | ||
31 | - var md = h('div', {className: 'Markdown'}) | ||
32 | - md.innerHTML = renderer.block(content.text, { | ||
33 | - emoji: (emoji) => { | ||
34 | - var url = emojiMentions[emoji] | ||
35 | - ? api.blob.sync.url(emojiMentions[emoji]) | ||
36 | - : api.emoji.sync.url(emoji) | ||
37 | - return renderEmoji(emoji, url) | ||
38 | - }, | ||
39 | - toUrl: (id) => { | ||
40 | - if (ref.isBlob(id)) return api.blob.sync.url(id) | ||
41 | - return mentions[id] || id | ||
42 | - }, | ||
43 | - imageLink: (id) => id | ||
33 … | + return h('Markdown', { | ||
34 … | + hooks: [ | ||
35 … | + LoadingBlobHook(api.blob.obs.has) | ||
36 … | + ], | ||
37 … | + innerHTML: renderer.block(content.text, { | ||
38 … | + emoji: (emoji) => { | ||
39 … | + var url = emojiMentions[emoji] | ||
40 … | + ? api.blob.sync.url(emojiMentions[emoji]) | ||
41 … | + : api.emoji.sync.url(emoji) | ||
42 … | + return renderEmoji(emoji, url) | ||
43 … | + }, | ||
44 … | + toUrl: (id) => { | ||
45 … | + if (ref.isBlob(id)) return api.blob.sync.url(id) | ||
46 … | + return mentions[id] || id | ||
47 … | + }, | ||
48 … | + imageLink: (id) => id | ||
49 … | + }) | ||
44 | 50 … | }) | |
45 | - | ||
46 | - return md | ||
47 | 51 … | } | |
48 | 52 … | ||
49 | 53 … | function renderEmoji (emoji, url) { | |
50 | 54 … | if (!url) return ':' + emoji + ':' | |
@@ -57,4 +61,27 @@ | |||
57 | 61 … | > | |
58 | 62 … | ` | |
59 | 63 … | } | |
60 | 64 … | } | |
65 … | + | ||
66 … | +function LoadingBlobHook (hasBlob) { | ||
67 … | + return function (element) { | ||
68 … | + var releases = [] | ||
69 … | + element.querySelectorAll('img').forEach(img => { | ||
70 … | + var id = ref.extract(img.src) | ||
71 … | + if (id) { | ||
72 … | + releases.push(watch(hasBlob(id), has => { | ||
73 … | + if (has === false) { | ||
74 … | + img.classList.add('-pending') | ||
75 … | + } else { | ||
76 … | + img.classList.remove('-pending') | ||
77 … | + } | ||
78 … | + })) | ||
79 … | + } | ||
80 … | + }) | ||
81 … | + return function () { | ||
82 … | + while (releases.length) { | ||
83 … | + releases.pop()() | ||
84 … | + } | ||
85 … | + } | ||
86 … | + } | ||
87 … | +} |
Built with git-ssb-web