git ssb

0+

ev / 0qc



Tree: d6b80ccf3b7cdf17831fe84ad7e1811bd6a6cbd5

Files: d6b80ccf3b7cdf17831fe84ad7e1811bd6a6cbd5 / render.js

12986 bytesRaw
1var h = require('hyperscript')
2var pull = require('pull-stream')
3var human = require('human-time')
4
5var sbot = require('./scuttlebot')
6var composer = require('./compose')
7var tools = require('./tools')
8var ref = require('ssb-ref')
9
10var config = require('./config')()
11var id = require('./keys').id
12var avatar = require('./avatar')
13var ssbAvatar = require('ssb-avatar')
14
15var ssbKeys = require('ssb-keys')
16var keys = require('./keys')
17
18var diff = require('diff')
19
20function hash () {
21 return window.location.hash.substring(1)
22}
23
24module.exports.render = function (msg) {
25
26
27 var messageExists = (document.getElementById(msg.key.substring(0, 44)) !== null);
28
29 if (!messageExists) {
30 var message = h('div.message#' + msg.key.substring(0, 44))
31 //console.log(msg)
32 var messageContent = h('div.messageContent')
33 message.appendChild(messageContent)
34
35 pull(
36 sbot.backlinks({
37 query: [{$filter: {dest: msg.key}}],
38 live: true,
39 reverse: false,
40 index: 'DTA'
41 }),
42 pull.drain(function (data) {
43 if (data.sync) {
44 } else {
45 if (data.value.content.type == 'vote') {
46 var subMessageExists = (document.getElementById(data.key.substring(0, 44)) !== null)
47 if (msg.key == data.value.content.vote.link) {
48 if (data.value.content.vote.value == 1) {
49 var link = h('span', ' ', h('img.emoji', {src: config.emojiUrl + 'star.png'}), ' ', h('a', {href: '#' + data.value.content.vote.link}, tools.messageLink(data.value.content.vote.link)))
50 if (!subMessageExists) {
51 message.appendChild(h('div.submessage', h('div.messageContent', tools.mini(data, link))))
52 }
53 if (data.value.author == id) {
54 var gotIt = document.getElementById('votebutton:' + msg.key.substring(0,44))
55 if (gotIt != null) {
56 gotIt.parentNode.appendChild(tools.unstar(msg))
57 gotIt.parentNode.removeChild(gotIt)
58 }
59 }
60 } else if (data.value.content.vote.value == -1) {
61 var link = h('span', ' ', h('img.emoji', {src: config.emojiUrl + 'stars.png'}), ' ', h('a', {href: '#' + data.value.content.vote.link}, tools.messageLink(data.value.content.vote.link)))
62 if (!subMessageExists) {
63 message.appendChild(h('div.submessage', h('div.messageContent', tools.mini(data, link))))
64 }
65 if (data.value.author == id) {
66 var gotIt = document.getElementById('votebutton:' + msg.key.substring(0,44))
67 if (gotIt != null) {
68 gotIt.parentNode.appendChild(tools.star(msg))
69 gotIt.parentNode.removeChild(gotIt)
70 }
71 }
72 }
73 }
74 }
75 else if (!subMessageExists) {
76 if (data.value.content.type == 'post') {
77 if (
78 (msg.key == data.value.content.root) ||
79 (msg.value.content.root == data.value.content.root)
80 ) {
81 message.appendChild(h('div.submessage', (exports.render(data))))
82 }
83 } else {
84 var link = h('span', ' backlinked from ', tools.messageLink(data.key))
85 message.appendChild(h('div.submessage', h('div.messageContent', tools.mini(data, link))))
86 }
87 } else { //console.log('message already rendered')
88 }
89 }
90 })
91 )
92
93 if (msg.value.content.type == 'post') {
94
95 var opts = {
96 type: 'post',
97 branch: msg.key
98 }
99 var fallback = {}
100
101 if (msg.value.content.root)
102 opts.root = msg.value.content.root
103 else
104 opts.root = msg.key
105
106 messageContent.appendChild(tools.header(msg))
107
108 if (msg.value.content.root) {
109 messageContent.appendChild(h('span', 're: ', tools.messageLink(msg.value.content.root)))
110 }
111
112 messageContent.appendChild(h('div.message__body', tools.markdown(msg.value.content.text)))
113
114 var name = avatar.name(msg.value.author)
115
116
117 var buttons = h('div.buttons')
118
119 buttons.appendChild(h('button.btn', 'Reply', {
120 onclick: function () {
121 opts.type = 'post'
122 opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
123 if (msg.value.content.recps) {
124 opts.recps = msg.value.content.recps
125 }
126 var r = messageContent.childNodes.length - 1
127 delete opts.updated
128 delete opts.original
129 delete fallback.messageText
130 fallback.buttons = messageContent.childNodes[r]
131 var compose = h('div.submessage#re:' + msg.key.substring(0, 44), h('div.messageContent', composer(opts, fallback)))
132 messageContent.removeChild(messageContent.childNodes[r])
133 message.parentNode.insertBefore(compose, message.nextSibling)
134 }
135 }))
136
137 buttons.appendChild(h('button.btn', 'Edit', {
138 onclick: function () {
139 opts.type = 'edit'
140 if (!fallback.messageText)
141 fallback.messageText = msg.value.content.text
142
143 if (!opts.updated)
144 opts.updated = msg.key
145 opts.original = msg.key
146
147 var r = messageContent.childNodes.length - 1
148 fallback.buttons = messageContent.childNodes[r]
149 messageContent.removeChild(messageContent.childNodes[r])
150 var compose = h('div#edit:' + msg.key.substring(0, 44), composer(opts, fallback))
151 messageContent.replaceChild(compose, messageContent.lastElementChild)
152 }
153 }))
154
155 buttons.appendChild(h('button.btn', 'Boost', {
156 onclick: function () {
157 opts.type = 'post'
158 opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
159 if (msg.value.content.recps) {
160 opts.recps = msg.value.content.recps
161 }
162 var r = messageContent.childNodes.length - 1
163 delete opts.updated
164 delete opts.original
165 delete fallback.messageText
166 opts.boostContent = msg.value.content.text
167 opts.boostKey = msg.key
168 opts.boostAuthor = msg.value.author
169 fallback.buttons = messageContent.childNodes[r]
170 var compose = h('div.submessage#re:' + msg.key.substring(0, 44), h('div.messageContent', composer(opts, fallback)))
171 messageContent.removeChild(messageContent.childNodes[r])
172 message.parentNode.insertBefore(compose, message.nextSibling)
173 }
174 }))
175
176
177
178 buttons.appendChild(tools.star(msg))
179
180 messageContent.appendChild(buttons)
181 return message
182 }
183
184 if (msg.value.content.type == 'vote') {
185 if (msg.value.content.vote.value == 1)
186 var link = h('span', ' ', h('img.emoji', {src: config.emojiUrl + 'star.png'}), ' ', h('a', {href: '#' + msg.value.content.vote.link}, tools.messageLink(msg.value.content.vote.link)))
187 else if (msg.value.content.vote.value == -1)
188 var link = h('span', ' ', h('img.emoji', {src: config.emojiUrl + 'stars.png'}), ' ', h('a', {href: '#' + msg.value.content.vote.link}, tools.messageLink(msg.value.content.vote.link)))
189 messageContent.appendChild(tools.mini(msg, link))
190 return message
191 }
192
193 if (msg.value.content.type == 'about') {
194 if (msg.value.content.image) {
195 if (ref.isBlob(msg.value.content.image.link)) {
196 var image = h('img', {src: config.blobsUrl + msg.value.content.image.link})
197 } else if (ref.isBlob(msg.value.content.image)) {
198 var image = h('img', {src: config.blobsUrl + msg.value.content.image})
199 } else { console.log('Not a valid image')}
200 var content = h('span.avatar--small',
201 ' identified ',
202 h('a', {href: '#' + msg.value.content.about}, avatar.cachedName(msg.value.content.about)),
203 ' as ',
204 image
205 )
206 messageContent.appendChild(tools.mini(msg, content))
207 return message
208 }
209 if (msg.value.content.name) {
210 var name = h('span',
211 ' identified ',
212 h('a', {href: '#' + msg.value.content.about}, avatar.cachedName(msg.value.content.about)),
213 ' as ', msg.value.content.name
214 )
215 messageContent.appendChild(tools.mini(msg, name))
216 return message
217 }
218 }
219
220 if (msg.value.content.type == 'label'){
221 var content = h('span', ' labeled ', tools.messageLink(msg.value.content.link), ' as ', h('mark', h('a', {href: '#label/' + msg.value.content.label}, msg.value.content.label)))
222 messageContent.appendChild(tools.mini(msg, content))
223 return message
224 }
225
226 if (msg.value.content.type == 'queue') {
227 if (msg.value.content.queue == true) {
228 var content = h('span', ' added ', tools.messageLink(msg.value.content.message), ' to their ', h('a', {href: '#queue'}, 'queue'))
229 messageContent.appendChild(tools.mini(msg, content))
230 }
231 if (msg.value.content.queue == false) {
232 var content = h('span', ' removed ', tools.messageLink(msg.value.content.message), ' from their ', h('a', {href: '#queue'}, 'queue'))
233 messageContent.appendChild(tools.mini(msg, content))
234
235 }
236 return message
237 }
238
239 if (msg.value.content.type == 'scat_message') {
240 var src = hash()
241 if (src != 'backchannel') {
242 messageContent.appendChild(h('button.btn.right', h('a', {href: '#backchannel'}, 'Chat')))
243 }
244 messageContent.appendChild(tools.mini(msg, ' ' + msg.value.content.text))
245 return message
246 }
247
248 else if (msg.value.content.type == 'contact') {
249 if (msg.value.content.contact) {
250 var contact = h('a', {href: '#' + msg.value.content.contact}, avatar.name(msg.value.content.contact))
251 } else { var contact = h('p', 'no contact named')}
252
253 if (msg.value.content.following == true) {
254 var following = h('span', ' follows ', contact)
255 messageContent.appendChild(tools.mini(msg, following))
256 }
257 if (msg.value.content.following == false) {
258 var unfollowing = h('span', ' unfollows ', contact)
259 messageContent.appendChild(tools.mini(msg, unfollowing))
260 }
261 if (msg.value.content.blocking == true) {
262 var blocking = h('span', ' blocks ', contact)
263 messageContent.appendChild(tools.mini(msg, blocking))
264 }
265 if (msg.value.content.blocking == false) {
266 var unblocking = h('span', ' unblocks ', contact)
267 messageContent.appendChild(tools.mini(msg, unblocking))
268 }
269 return message
270
271 }
272
273
274 if (msg.value.content.type == 'git-update') {
275
276 messageContent.appendChild(tools.header(msg))
277
278 var reponame = h('p', 'pushed to ', h('a', {href: '#' + msg.value.content.repo}, msg.value.content.repo))
279
280 var cloneurl = h('pre', 'git clone ssb://' + msg.value.content.repo)
281
282 messageContent.appendChild(reponame)
283
284 ssbAvatar(sbot, id, msg.value.content.repo, function (err, data) {
285 if (data) {
286 var actualname = h('p', 'pushed to ', h('a', {href: '#' + msg.value.content.repo}, '%' + data.name))
287 reponame.parentNode.replaceChild(actualname, reponame)
288 }
289 })
290
291 messageContent.appendChild(cloneurl)
292
293 var commits = h('ul')
294 if (msg.value.content.commits) {
295 msg.value.content.commits.map(function (commit) {
296 commits.appendChild(h('li', h('code', commit.sha1), ' - ', commit.title))
297 })
298 }
299
300 messageContent.appendChild(commits)
301
302 return message
303 }
304
305 if (msg.value.content.type == 'git-repo') {
306 messageContent.appendChild(tools.header(msg))
307
308 var reponame = h('p', 'git-ssb repo ', h('a', {href: '#' + msg.key}, msg.key))
309
310 messageContent.appendChild(reponame)
311
312 ssbAvatar(sbot, id, msg.key, function (err, data) {
313 if (data)
314 var actualname = h('p', 'git-ssb repo ', h('a', {href: '#' + msg.key}, '%' + data.name))
315 reponame.parentNode.replaceChild(actualname, reponame)
316 })
317
318 var cloneurl = h('pre', 'git clone ssb://' + msg.key)
319 messageContent.appendChild(cloneurl)
320 return message
321 }
322
323 if (typeof msg.value.content === 'string') {
324 var unboxed = ssbKeys.unbox(msg.value.content, keys)
325 if (unboxed) {
326 msg.value.content = unboxed
327 msg.value.private = true
328 return exports.render(msg)
329 } else {
330 var privateMsg = h('span', ' sent a private message.')
331 messageContent.appendChild(tools.mini(msg, privateMsg))
332 return message
333 }
334 }
335
336 else {
337 //FULL FALLBACK
338 //message.appendChild(tools.header(msg))
339 messageContent.appendChild(tools.header(msg))
340 messageContent.appendChild(h('pre', tools.rawJSON(msg.value)))
341
342 //MINI FALLBACK
343 //var fallback = h('span', ' ' + msg.value.content.type)
344 //message.appendChild(tools.mini(msg, fallback))
345 return message
346 }
347 }
348}
349

Built with git-ssb-web