Commit 452ca9b83a7f4a1dc4fd6398dd62555e98c8fe5b
markdown: add "-pending" class to image blobs that haven't yet pulled
Matt McKegg committed on 6/12/2017, 5:00:23 AMParent: a3f728451ea4f496b80c42138d030295e43de153
Files changed
message/html/markdown.js | changed |
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