git ssb

3+

ev / decent



Tree: c48495deffb713565529ee3c67854c4f6e739b35

Files: c48495deffb713565529ee3c67854c4f6e739b35 / render.js

9502 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 == 'edit') {
35 message.appendChild(tools.header(msg))
36 if (msg.value.content.text) {
37 var current = msg.value.content.text
38 sbot.get(msg.value.content.updated, function (err, updated) {
39 if (updated) {
40 // quick fix, need to decrypt messages if they're private
41 if (updated.content.text) {
42 fragment = document.createDocumentFragment()
43 var previous = updated.content.text
44 var ready = diff.diffWords(previous, current)
45 ready.forEach(function (part) {
46 if (part.added === true) {
47 color = 'blue'
48 } else if (part.removed === true) {
49 color = 'gray'
50 } else {color = '#333'}
51 var span = h('span')
52 span.style.color = color
53 if (part.removed === true) {
54 span.appendChild(h('del', document.createTextNode(part.value)))
55 } else {
56 span.appendChild(document.createTextNode(part.value))
57 }
58 fragment.appendChild(span)
59 })
60 message.appendChild(h('code', fragment))
61 }
62 }
63 })
64 }
65 return message
66 }
67
68
69 else if (msg.value.content.type == 'scat_message') {
70 var src = hash()
71 if (src != 'backchannel') {
72 message.appendChild(h('button.btn.right', h('a', {href: '#backchannel'}, 'Chat')))
73 }
74 message.appendChild(tools.mini(msg, ' ' + msg.value.content.text))
75 return message
76 }
77 else if (msg.value.content.type == 'contact') {
78 if (msg.value.content.contact) {
79 var contact = h('a', {href: '#' + msg.value.content.contact}, avatar.name(msg.value.content.contact))
80 } else { var contact = h('p', 'no contact named')}
81
82 if (msg.value.content.following == true) {
83 var following = h('span', ' follows ', contact)
84 message.appendChild(tools.mini(msg, following))
85 }
86 if (msg.value.content.following == false) {
87 var unfollowing = h('span', ' unfollows ', contact)
88 message.appendChild(tools.mini(msg, unfollowing))
89 }
90 if (msg.value.content.blocking == true) {
91 var blocking = h('span', ' blocks ', contact)
92 message.appendChild(tools.mini(msg, blocking))
93 }
94 if (msg.value.content.blocking == false) {
95 var unblocking = h('span', ' unblocks ', contact)
96 message.appendChild(tools.mini(msg, unblocking))
97 }
98 return message
99
100 }
101
102 else if (msg.value.content.type == 'git-update') {
103
104 message.appendChild(tools.header(msg))
105
106 var reponame = h('p', 'pushed to ', h('a', {href: '#' + msg.value.content.repo}, msg.value.content.repo))
107
108 var cloneurl = h('pre', 'git clone ssb://' + msg.value.content.repo)
109
110 message.appendChild(reponame)
111
112
113 ssbAvatar(sbot, id, msg.value.content.repo, function (err, data) {
114 if (data) {
115 var actualname = h('p', 'pushed to ', h('a', {href: '#' + msg.value.content.repo}, '%' + data.name))
116 reponame.parentNode.replaceChild(actualname, reponame)
117 }
118 })
119
120 message.appendChild(cloneurl)
121
122 var commits = h('ul')
123 //if (msg.value.content.commits[0]) {
124 if (msg.value.content.commits) {
125 msg.value.content.commits.map(function (commit) {
126 commits.appendChild(h('li', h('code', commit.sha1), ' - ', commit.title))
127 })
128
129 }
130
131 message.appendChild(commits)
132
133 return message
134
135 }
136 else if (msg.value.content.type == 'git-repo') {
137 message.appendChild(tools.header(msg))
138
139 var reponame = h('p', 'git-ssb repo ', h('a', {href: '#' + msg.key}, msg.key))
140
141 message.appendChild(reponame)
142
143 ssbAvatar(sbot, id, msg.key, function (err, data) {
144 if (data)
145 var actualname = h('p', 'git-ssb repo ', h('a', {href: '#' + msg.key}, '%' + data.name))
146 reponame.parentNode.replaceChild(actualname, reponame)
147 })
148
149 var cloneurl = h('pre', 'git clone ssb://' + msg.key)
150 message.appendChild(cloneurl)
151 return message
152 }
153
154 else if (msg.value.content.type == 'post') {
155 var opts = {
156 type: 'post',
157 branch: msg.key
158 }
159 var fallback = {}
160
161
162 if (msg.value.content.root)
163 opts.root = msg.value.content.root
164 else
165 opts.root = msg.key
166
167 message.appendChild(tools.header(msg))
168
169 if (msg.value.content.root)
170 message.appendChild(h('span', 're: ', tools.messageLink(msg.value.content.root)))
171
172 message.appendChild(h('div.message__body', tools.markdown(msg.value.content.text)))
173
174 pull(
175 sbot.query({query: [{$filter: {value: {content: {type: 'edit', original: msg.key}}}}], limit: 100}),
176 pull.drain(function (update) {
177 if (update.sync) {
178 } else {
179 var newMessage = h('div', tools.markdown(update.value.content.text))
180 var latest = h('div.message__body',
181 tools.timestamp(update, {edited: true}),
182 newMessage
183 )
184 message.replaceChild(latest, message.childNodes[message.childNodes.length - 2])
185 fallback.messageText = update.value.content.text
186 opts.updated = update.key
187 opts.original = msg.key
188 }
189 })
190 )
191
192 var name = avatar.name(msg.value.author)
193
194 var buttons = h('div.buttons')
195
196 buttons.appendChild(h('button.btn', 'Reply', {
197 onclick: function () {
198 opts.type = 'post'
199 opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
200 if (msg.value.content.recps) {
201 opts.recps = msg.value.content.recps
202 }
203 var r = message.childNodes.length - 1
204 delete opts.updated
205 delete opts.original
206 delete fallback.messageText
207 fallback.buttons = message.childNodes[r]
208 var compose = h('div.message#re:' + msg.key.substring(0, 44), composer(opts, fallback))
209 message.removeChild(message.childNodes[r])
210 message.parentNode.insertBefore(compose, message.nextSibling)
211 }
212 }))
213
214 /*buttons.appendChild(h('button.btn', 'Boost', {
215 onclick: function () {
216 opts.type = 'post'
217 opts.mentions = '[' + name.textContent + '](' + msg.value.author + ')'
218 if (msg.value.content.recps) {
219 opts.recps = msg.value.content.recps
220 }
221 var r = message.childNodes.length - 1
222 delete opts.updated
223 delete opts.original
224 delete fallback.messageText
225 opts.boostContent = msg.value.content.text
226 opts.boostKey = msg.key
227 opts.boostAuthor = msg.value.author
228 fallback.buttons = message.childNodes[r]
229 var compose = h('div.message#re:' + msg.key.substring(0, 44), composer(opts, fallback))
230 message.removeChild(message.childNodes[r])
231 message.parentNode.insertBefore(compose, message.nextSibling)
232 }
233 }))*/
234
235
236 if (msg.value.author == id)
237 buttons.appendChild(h('button.btn', 'Edit', {
238 onclick: function () {
239 opts.type = 'edit'
240 if (!fallback.messageText)
241 fallback.messageText = msg.value.content.text
242
243 if (!opts.updated)
244 opts.updated = msg.key
245 opts.original = msg.key
246
247 var r = message.childNodes.length - 1
248 fallback.buttons = message.childNodes[r]
249 message.removeChild(message.childNodes[r])
250 var compose = h('div#edit:' + msg.key.substring(0, 44), composer(opts, fallback))
251 message.replaceChild(compose, message.lastElementChild)
252 }
253 }))
254
255 //buttons.appendChild(tools.queueButton(msg))
256 buttons.appendChild(tools.star(msg))
257 message.appendChild(buttons)
258 return message
259
260 } else if (msg.value.content.type == 'vote') {
261 if (msg.value.content.vote.value == 1)
262 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)))
263 else if (msg.value.content.vote.value == -1)
264 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)))
265 message.appendChild(tools.mini(msg, link))
266 return message
267 } /*else if (typeof msg.value.content === 'string') {
268 var privateMsg = h('span', ' sent a private message.')
269 message.appendChild(tools.mini(msg, privateMsg))
270 return message
271 }*/ else {
272
273 //FULL FALLBACK
274 //message.appendChild(tools.header(msg))
275 //message.appendChild(h('pre', tools.rawJSON(msg.value.content)))
276
277 //MINI FALLBACK
278 //var fallback = h('span', ' ' + msg.value.content.type)
279 //message.appendChild(tools.mini(msg, fallback))
280 return h('div')//message
281 }
282}
283

Built with git-ssb-web