git ssb

0+

ev / 0qc



Tree: 3fd43b43c3b954ff0c298a7fd570c4d12ba97d72

Files: 3fd43b43c3b954ff0c298a7fd570c4d12ba97d72 / render.js

13132 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 if (data.value.content.type == 'git-update') {
84 message.appendChild(h('div.submessage', (exports.render(data))))
85
86 } else {
87 var link = h('span', ' backlinked from ', tools.messageLink(data.key))
88 message.appendChild(h('div.submessage', h('div.messageContent', tools.mini(data, link))))
89 }
90 } else { //console.log('message already rendered')
91 }
92 }
93 })
94 )
95
96 if (msg.value.content.type == 'post') {
97
98 var opts = {
99 type: 'post',
100 branch: msg.key
101 }
102 var fallback = {}
103
104 if (msg.value.content.root)
105 opts.root = msg.value.content.root
106 else
107 opts.root = msg.key
108
109 messageContent.appendChild(tools.header(msg))
110
111 if (msg.value.content.root) {
112 messageContent.appendChild(h('span', 're: ', tools.messageLink(msg.value.content.root)))
113 }
114
115 messageContent.appendChild(h('div.message__body', tools.markdown(msg.value.content.text)))
116
117 var name = avatar.name(msg.value.author)
118
119
120 var buttons = h('div.buttons')
121
122 buttons.appendChild(h('button.btn', 'Reply', {
123 onclick: function () {
124 opts.type = 'post'
125 opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
126 if (msg.value.content.recps) {
127 opts.recps = msg.value.content.recps
128 }
129 var r = messageContent.childNodes.length - 1
130 delete opts.updated
131 delete opts.original
132 delete fallback.messageText
133 fallback.buttons = messageContent.childNodes[r]
134 var compose = h('div.submessage#re:' + msg.key.substring(0, 44), h('div.messageContent', composer(opts, fallback)))
135 messageContent.removeChild(messageContent.childNodes[r])
136 message.parentNode.insertBefore(compose, message.nextSibling)
137 }
138 }))
139
140 buttons.appendChild(h('button.btn', 'Edit', {
141 onclick: function () {
142 opts.type = 'edit'
143 if (!fallback.messageText)
144 fallback.messageText = msg.value.content.text
145
146 if (!opts.updated)
147 opts.updated = msg.key
148 opts.original = msg.key
149
150 var r = messageContent.childNodes.length - 1
151 fallback.buttons = messageContent.childNodes[r]
152 messageContent.removeChild(messageContent.childNodes[r])
153 var compose = h('div#edit:' + msg.key.substring(0, 44), composer(opts, fallback))
154 messageContent.replaceChild(compose, messageContent.lastElementChild)
155 }
156 }))
157
158 buttons.appendChild(h('button.btn', 'Boost', {
159 onclick: function () {
160 opts.type = 'post'
161 opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
162 if (msg.value.content.recps) {
163 opts.recps = msg.value.content.recps
164 }
165 var r = messageContent.childNodes.length - 1
166 delete opts.updated
167 delete opts.original
168 delete fallback.messageText
169 opts.boostContent = msg.value.content.text
170 opts.boostKey = msg.key
171 opts.boostAuthor = msg.value.author
172 fallback.buttons = messageContent.childNodes[r]
173 var compose = h('div.submessage#re:' + msg.key.substring(0, 44), h('div.messageContent', composer(opts, fallback)))
174 messageContent.removeChild(messageContent.childNodes[r])
175 message.parentNode.insertBefore(compose, message.nextSibling)
176 }
177 }))
178
179
180
181 buttons.appendChild(tools.star(msg))
182
183 messageContent.appendChild(buttons)
184 return message
185 }
186
187 if (msg.value.content.type == 'vote') {
188 if (msg.value.content.vote.value == 1)
189 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)))
190 else if (msg.value.content.vote.value == -1)
191 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)))
192 messageContent.appendChild(tools.mini(msg, link))
193 return message
194 }
195
196 if (msg.value.content.type == 'about') {
197 if (msg.value.content.image) {
198 if (ref.isBlob(msg.value.content.image.link)) {
199 var image = h('img', {src: config.blobsUrl + msg.value.content.image.link})
200 } else if (ref.isBlob(msg.value.content.image)) {
201 var image = h('img', {src: config.blobsUrl + msg.value.content.image})
202 } else { console.log('Not a valid image')}
203 var content = h('span.avatar--small',
204 ' identified ',
205 h('a', {href: '#' + msg.value.content.about}, avatar.cachedName(msg.value.content.about)),
206 ' as ',
207 image
208 )
209 messageContent.appendChild(tools.mini(msg, content))
210 return message
211 }
212 if (msg.value.content.name) {
213 var name = h('span',
214 ' identified ',
215 h('a', {href: '#' + msg.value.content.about}, avatar.cachedName(msg.value.content.about)),
216 ' as ', msg.value.content.name
217 )
218 messageContent.appendChild(tools.mini(msg, name))
219 return message
220 }
221 }
222
223 if (msg.value.content.type == 'label'){
224 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)))
225 messageContent.appendChild(tools.mini(msg, content))
226 return message
227 }
228
229 if (msg.value.content.type == 'queue') {
230 if (msg.value.content.queue == true) {
231 var content = h('span', ' added ', tools.messageLink(msg.value.content.message), ' to their ', h('a', {href: '#queue'}, 'queue'))
232 messageContent.appendChild(tools.mini(msg, content))
233 }
234 if (msg.value.content.queue == false) {
235 var content = h('span', ' removed ', tools.messageLink(msg.value.content.message), ' from their ', h('a', {href: '#queue'}, 'queue'))
236 messageContent.appendChild(tools.mini(msg, content))
237
238 }
239 return message
240 }
241
242 if (msg.value.content.type == 'scat_message') {
243 var src = hash()
244 if (src != 'backchannel') {
245 messageContent.appendChild(h('button.btn.right', h('a', {href: '#backchannel'}, 'Chat')))
246 }
247 messageContent.appendChild(tools.mini(msg, ' ' + msg.value.content.text))
248 return message
249 }
250
251 else if (msg.value.content.type == 'contact') {
252 if (msg.value.content.contact) {
253 var contact = h('a', {href: '#' + msg.value.content.contact}, avatar.name(msg.value.content.contact))
254 } else { var contact = h('p', 'no contact named')}
255
256 if (msg.value.content.following == true) {
257 var following = h('span', ' follows ', contact)
258 messageContent.appendChild(tools.mini(msg, following))
259 }
260 if (msg.value.content.following == false) {
261 var unfollowing = h('span', ' unfollows ', contact)
262 messageContent.appendChild(tools.mini(msg, unfollowing))
263 }
264 if (msg.value.content.blocking == true) {
265 var blocking = h('span', ' blocks ', contact)
266 messageContent.appendChild(tools.mini(msg, blocking))
267 }
268 if (msg.value.content.blocking == false) {
269 var unblocking = h('span', ' unblocks ', contact)
270 messageContent.appendChild(tools.mini(msg, unblocking))
271 }
272 return message
273
274 }
275
276
277 if (msg.value.content.type == 'git-update') {
278
279 messageContent.appendChild(tools.header(msg))
280
281 var reponame = h('p', 'pushed to ', h('a', {href: '#' + msg.value.content.repo}, msg.value.content.repo))
282
283 var cloneurl = h('pre', 'git clone ssb://' + msg.value.content.repo)
284
285 messageContent.appendChild(reponame)
286
287 ssbAvatar(sbot, id, msg.value.content.repo, function (err, data) {
288 if (data) {
289 var actualname = h('p', 'pushed to ', h('a', {href: '#' + msg.value.content.repo}, '%' + data.name))
290 reponame.parentNode.replaceChild(actualname, reponame)
291 }
292 })
293
294 messageContent.appendChild(cloneurl)
295
296 var commits = h('ul')
297 if (msg.value.content.commits) {
298 msg.value.content.commits.map(function (commit) {
299 commits.appendChild(h('li', h('code', commit.sha1), ' - ', commit.title))
300 })
301 }
302
303 messageContent.appendChild(commits)
304
305 return message
306 }
307
308 if (msg.value.content.type == 'git-repo') {
309 messageContent.appendChild(tools.header(msg))
310
311 var reponame = h('p', 'git-ssb repo ', h('a', {href: '#' + msg.key}, msg.key))
312
313 messageContent.appendChild(reponame)
314
315 ssbAvatar(sbot, id, msg.key, function (err, data) {
316 if (data)
317 var actualname = h('p', 'git-ssb repo ', h('a', {href: '#' + msg.key}, '%' + data.name))
318 reponame.parentNode.replaceChild(actualname, reponame)
319 })
320
321 var cloneurl = h('pre', 'git clone ssb://' + msg.key)
322 messageContent.appendChild(cloneurl)
323 return message
324 }
325
326 if (typeof msg.value.content === 'string') {
327 var unboxed = ssbKeys.unbox(msg.value.content, keys)
328 if (unboxed) {
329 msg.value.content = unboxed
330 msg.value.private = true
331 return exports.render(msg)
332 } else {
333 var privateMsg = h('span', ' sent a private message.')
334 messageContent.appendChild(tools.mini(msg, privateMsg))
335 return message
336 }
337 }
338
339 else {
340 //FULL FALLBACK
341 //message.appendChild(tools.header(msg))
342 messageContent.appendChild(tools.header(msg))
343 messageContent.appendChild(h('pre', tools.rawJSON(msg.value)))
344
345 //MINI FALLBACK
346 //var fallback = h('span', ' ' + msg.value.content.type)
347 //message.appendChild(tools.mini(msg, fallback))
348 return message
349 }
350 }
351}
352

Built with git-ssb-web