git ssb

2+

ev / mvd



Tree: fd5b5ec859326033c364c31f5df00f867216815f

Files: fd5b5ec859326033c364c31f5df00f867216815f / render.js

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

Built with git-ssb-web