git ssb

0+

ev / gitmx



Tree: b3bdb4f23168852c91700c8b3e7a474dc7b7eb2c

Files: b3bdb4f23168852c91700c8b3e7a474dc7b7eb2c / render.js

13761 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')
8
9var config = require('./config')()
10var id = require('./keys').id
11var avatar = require('./avatar')
12var ssbAvatar = require('ssb-avatar')
13
14var ssbKeys = require('ssb-keys')
15var keys = require('./keys')
16
17var diff = require('diff')
18
19function hash () {
20 return window.location.hash.substring(1)
21}
22
23module.exports = function (msg) {
24 var message = h('div.message#' + msg.key.substring(0, 44))
25
26 if (!localStorage[msg.value.author])
27 var cache = {mute: false}
28 else
29 var cache = JSON.parse(localStorage[msg.value.author])
30
31 if (cache.mute == true) {
32 var muted = h('span', ' muted')
33 message.appendChild(tools.mini(msg, muted))
34 return message
35 }
36
37 else if (msg.value.content.type == 'label'){
38 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)))
39 message.appendChild(tools.mini(msg, content))
40 return message
41 }
42
43 else if (msg.value.content.type == 'queue') {
44 if (msg.value.content.queue == true) {
45 var content = h('span', ' added ', tools.messageLink(msg.value.content.message), ' to their ', h('a', {href: '#queue'}, 'queue'))
46 message.appendChild(tools.mini(msg, content))
47 }
48 if (msg.value.content.queue == false) {
49 var content = h('span', ' removed ', tools.messageLink(msg.value.content.message), ' from their ', h('a', {href: '#queue'}, 'queue'))
50 message.appendChild(tools.mini(msg, content))
51
52 }
53 return message
54 }
55
56 else if (msg.value.content.type == 'edit') {
57 message.appendChild(tools.header(msg))
58 if (msg.value.content.text) {
59 var current = msg.value.content.text
60 sbot.get(msg.value.content.updated, function (err, updated) {
61 if (updated) {
62 // quick fix, need to decrypt messages if they're private
63 if (updated.content.text) {
64 fragment = document.createDocumentFragment()
65 var previous = updated.content.text
66 var ready = diff.diffWords(previous, current)
67 ready.forEach(function (part) {
68 if (part.added === true) {
69 color = 'blue'
70 } else if (part.removed === true) {
71 color = 'gray'
72 } else {color = '#333'}
73 var span = h('span')
74 span.style.color = color
75 if (part.removed === true) {
76 span.appendChild(h('del', document.createTextNode(part.value)))
77 } else {
78 span.appendChild(document.createTextNode(part.value))
79 }
80 fragment.appendChild(span)
81 })
82 message.appendChild(h('code', fragment))
83 }
84 }
85 })
86 }
87 return message
88 }
89
90 else if (msg.value.content.type == 'scat_message') {
91 var src = hash()
92 if (src.substring(0, 11) != 'backchannel') {
93 message.appendChild(h('button.btn.right', h('a', {href: '#backchannel'}, 'Backchannel')))
94 }
95 message.appendChild(tools.mini(msg, ' ' + msg.value.content.text))
96 return message
97 }
98
99
100 else if (msg.value.content.type == 'contact') {
101 if (msg.value.content.contact) {
102 var contact = h('a', {href: '#' + msg.value.content.contact}, avatar.name(msg.value.content.contact))
103 } else { var contact = h('p', 'no contact named')}
104
105 if (msg.value.content.following == true) {
106 var following = h('span', ' follows ', contact)
107 message.appendChild(tools.mini(msg, following))
108 }
109 if (msg.value.content.following == false) {
110 var unfollowing = h('span', ' unfollows ', contact)
111 message.appendChild(tools.mini(msg, unfollowing))
112 }
113 if (msg.value.content.blocking == true) {
114 var blocking = h('span', ' blocks ', contact)
115 message.appendChild(tools.mini(msg, blocking))
116 }
117 if (msg.value.content.blocking == false) {
118 var unblocking = h('span', ' unblocks ', contact)
119 message.appendChild(tools.mini(msg, unblocking))
120 }
121 return message
122
123 }
124
125 else if (msg.value.content.type == 'git-update') {
126
127 var reponame = h('span', ' pushed to ', h('a', {href: '#' + msg.value.content.repo}, msg.value.content.repo))
128
129 message.appendChild(tools.mini(msg, reponame))
130
131 ssbAvatar(sbot, id, msg.value.content.repo, function (err, data) {
132 if (data) {
133 var actualname = h('span', ' pushed to ', h('a', {href: '#' + msg.value.content.repo}, '%' + data.name))
134 reponame.parentNode.replaceChild(actualname, reponame)
135 }
136 })
137
138 var commits = h('ul')
139
140 if (msg.value.content.commits) {
141 msg.value.content.commits.map(function (commit) {
142 commits.appendChild(h('li', h('code', commit.sha1), ' - ', commit.title))
143 })
144 }
145
146 message.appendChild(commits)
147
148 var buttons = h('div.buttons')
149
150 buttons.appendChild(tools.star(msg))
151 buttons.appendChild(tools.labeler(msg))
152 message.appendChild(tools.getLabels(msg))
153 message.appendChild(buttons)
154
155 return message
156
157 }
158 else if (msg.value.content.type == 'git-repo') {
159 var reponame = h('span', ' created a git-ssb repo ', h('a', {href: '#' + msg.key}, msg.key))
160
161 message.appendChild(tools.mini(msg, reponame))
162
163 ssbAvatar(sbot, id, msg.key, function (err, data) {
164 if (data)
165 var actualname = h('span', ' created a git-ssb repo ', h('a', {href: '#' + msg.key}, '%' + data.name))
166 reponame.parentNode.replaceChild(actualname, reponame)
167 })
168
169 var cloneurl = h('pre', 'git clone ssb://' + msg.key)
170 message.appendChild(cloneurl)
171
172 var name = avatar.name(msg.value.author)
173
174 var buttons = h('div.buttons')
175 buttons.appendChild(h('a', {href: '#backchannel/' + msg.key}, h('button.btn', 'Backchannel')))
176 var opts = {}
177 var fallback = {}
178
179 if (msg.value.content.root)
180 opts.root = msg.value.content.root
181 else
182 opts.root = msg.key
183
184 buttons.appendChild(h('button.btn', 'New issue', {
185 onclick: function () {
186 opts.type = 'post'
187 opts.branch = msg.key
188 opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
189 if (msg.value.content.recps) {
190 opts.recps = msg.value.content.recps
191 }
192 var r = message.childNodes.length - 1
193 delete opts.updated
194 delete opts.original
195 delete fallback.messageText
196 fallback.buttons = message.childNodes[r]
197 var compose = h('div.message#re:' + msg.key.substring(0, 44), composer(opts, fallback))
198 message.removeChild(message.childNodes[r])
199 message.parentNode.insertBefore(compose, message.nextSibling)
200 }
201 }))
202
203 buttons.appendChild(tools.star(msg))
204 buttons.appendChild(tools.labeler(msg))
205 message.appendChild(tools.getLabels(msg))
206
207 message.appendChild(buttons)
208
209 return message
210 }
211
212 else if (msg.value.content.type == 'wiki') {
213 var fallback = {}
214
215 var opts = {
216 type: 'wiki',
217 branch: msg.key
218 }
219
220 if (msg.value.content.root)
221 opts.root = msg.value.content.root
222 else
223 opts.root = msg.key
224
225 message.appendChild(tools.header(msg))
226
227 message.appendChild(h('div.message__body', tools.markdown(msg.value.content.text)))
228
229 pull(
230 sbot.query({query: [{$filter: {value: {content: {type: 'edit', original: msg.key}}}}], limit: 100}),
231 pull.drain(function (update) {
232 if (update.sync) {
233 } else {
234 var newMessage = h('div', tools.markdown(update.value.content.text))
235 var latest = h('div.message__body',
236 tools.timestamp(update, {edited: true}),
237 newMessage
238 )
239 message.replaceChild(latest, message.childNodes[message.childNodes.length - 2])
240 fallback.messageText = update.value.content.text
241 opts.updated = update.key
242 opts.original = msg.key
243 }
244 })
245 )
246
247 var buttons = h('div.buttons')
248
249 buttons.appendChild(h('button.btn', 'Edit wiki', {
250 onclick: function () {
251 opts.type = 'edit'
252 if (!fallback.messageText)
253 fallback.messageText = msg.value.content.text
254
255 if (!opts.updated)
256 opts.updated = msg.key
257 opts.original = msg.key
258
259 var r = message.childNodes.length - 1
260 fallback.buttons = message.childNodes[r]
261 message.removeChild(message.childNodes[r])
262 var compose = h('div#edit:' + msg.key.substring(0, 44), composer(opts, fallback))
263 message.replaceChild(compose, message.lastElementChild)
264 }
265 }))
266
267 buttons.appendChild(tools.star(msg))
268 message.appendChild(buttons)
269 return message
270
271 } else if (msg.value.content.type == 'post') {
272 var opts = {
273 type: 'post',
274 branch: msg.key
275 }
276 var fallback = {}
277
278
279 if (msg.value.content.root)
280 opts.root = msg.value.content.root
281 else
282 opts.root = msg.key
283
284 message.appendChild(tools.header(msg))
285
286 if (msg.value.content.root)
287 message.appendChild(h('span', 're: ', tools.messageLink(msg.value.content.root)))
288
289 message.appendChild(h('div.message__body', tools.markdown(msg.value.content.text)))
290
291 pull(
292 sbot.query({query: [{$filter: {value: {content: {type: 'edit', original: msg.key}}}}], limit: 100}),
293 pull.drain(function (update) {
294 if (update.sync) {
295 } else {
296 var newMessage = h('div', tools.markdown(update.value.content.text))
297 var latest = h('div.message__body',
298 tools.timestamp(update, {edited: true}),
299 newMessage
300 )
301 message.replaceChild(latest, message.childNodes[message.childNodes.length - 2])
302 fallback.messageText = update.value.content.text
303 opts.updated = update.key
304 opts.original = msg.key
305 }
306 })
307 )
308
309 var name = avatar.name(msg.value.author)
310
311 var buttons = h('div.buttons')
312
313 buttons.appendChild(h('button.btn', 'Reply', {
314 onclick: function () {
315 opts.type = 'post'
316 opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
317 if (msg.value.content.recps) {
318 opts.recps = msg.value.content.recps
319 }
320 var r = message.childNodes.length - 1
321 delete opts.updated
322 delete opts.original
323 delete fallback.messageText
324 fallback.buttons = message.childNodes[r]
325 var compose = h('div.message#re:' + msg.key.substring(0, 44), composer(opts, fallback))
326 message.removeChild(message.childNodes[r])
327 message.parentNode.insertBefore(compose, message.nextSibling)
328 }
329 }))
330
331 buttons.appendChild(h('button.btn', 'Boost', {
332 onclick: function () {
333 opts.type = 'post'
334 opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
335 if (msg.value.content.recps) {
336 opts.recps = msg.value.content.recps
337 }
338 var r = message.childNodes.length - 1
339 delete opts.updated
340 delete opts.original
341 delete fallback.messageText
342 opts.boostContent = msg.value.content.text
343 opts.boostKey = msg.key
344 opts.boostAuthor = msg.value.author
345 fallback.buttons = message.childNodes[r]
346 var compose = h('div.message#re:' + msg.key.substring(0, 44), composer(opts, fallback))
347 message.removeChild(message.childNodes[r])
348 message.parentNode.insertBefore(compose, message.nextSibling)
349 }
350 }))
351
352
353 if (msg.value.author == id)
354 buttons.appendChild(h('button.btn', 'Edit', {
355 onclick: function () {
356 opts.type = 'edit'
357 if (!fallback.messageText)
358 fallback.messageText = msg.value.content.text
359
360 if (!opts.updated)
361 opts.updated = msg.key
362 opts.original = msg.key
363
364 var r = message.childNodes.length - 1
365 fallback.buttons = message.childNodes[r]
366 message.removeChild(message.childNodes[r])
367 var compose = h('div#edit:' + msg.key.substring(0, 44), composer(opts, fallback))
368 message.replaceChild(compose, message.lastElementChild)
369 }
370 }))
371
372
373 buttons.appendChild(tools.queueButton(msg))
374 buttons.appendChild(tools.star(msg))
375 buttons.appendChild(tools.labeler(msg))
376 message.appendChild(tools.getLabels(msg))
377
378 message.appendChild(buttons)
379 return message
380
381 } else if (msg.value.content.type == 'vote') {
382 if (msg.value.content.vote.value == 1)
383 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)))
384 else if (msg.value.content.vote.value == -1)
385 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)))
386 message.appendChild(tools.mini(msg, link))
387 return message
388 } else if (typeof msg.value.content === 'string') {
389 var unboxed = ssbKeys.unbox(msg.value.content, keys)
390 if (unboxed) {
391 msg.value.content = unboxed
392 msg.value.private = true
393 return module.exports(msg)
394 } else {
395 var privateMsg = h('span', ' sent a private message.')
396 message.appendChild(tools.mini(msg, privateMsg))
397 return message
398 }
399 } else {
400
401 //FULL FALLBACK
402 message.appendChild(tools.header(msg))
403 message.appendChild(h('pre', tools.rawJSON(msg.value)))
404
405 //MINI FALLBACK
406 //var fallback = h('span', ' ' + msg.value.content.type)
407 //message.appendChild(tools.mini(msg, fallback))
408 return h('div', message)
409 }
410}
411

Built with git-ssb-web