git ssb

2+

ev / mvd



Tree: 7a856ed68d3f4c64fac98fce38e8ead1b4b005e1

Files: 7a856ed68d3f4c64fac98fce38e8ead1b4b005e1 / views.js

6633 bytesRaw
1var pull = require('pull-stream')
2var sbot = require('./scuttlebot')
3var hyperscroll = require('hyperscroll')
4var More = require('pull-more')
5var stream = require('hyperloadmore/stream')
6var h = require('hyperscript')
7var render = require('./render')
8var ref = require('ssb-ref')
9
10var Next = require('pull-next-query')
11
12var config = require('./config')()
13
14var tools = require('./tools')
15var avatar = require('./avatar')
16var id = require('./keys').id
17
18var fs = require('fs')
19
20var compose = require('./compose')
21
22var about = function () {
23 var screen = document.getElementById('screen')
24
25 var about = require('./about')
26
27 var content = h('div.content', about)
28
29 screen.appendChild(hyperscroll(content))
30}
31
32var mentionsStream = function () {
33 var content = h('div.content')
34
35 var screen = document.getElementById('screen')
36
37 screen.appendChild(hyperscroll(content))
38
39 function createStream (opts) {
40 return pull(
41 Next(sbot.backlinks, opts, ['value', 'timestamp']),
42 pull.map(function (msg) {
43 return render(msg)
44 })
45 )
46 }
47
48 pull(
49 createStream({
50 limit: 10,
51 reverse: true,
52 live: false,
53 query: [{$filter: {dest: id}}]
54 }),
55 stream.bottom(content)
56 )
57
58 pull(
59 createStream({
60 limit: 10,
61 old: false,
62 live: true,
63 query: [{$filter: {dest: id}}]
64 }),
65 stream.top(content)
66 )
67}
68
69var userStream = function (src) {
70 var content = h('div.content')
71 var screen = document.getElementById('screen')
72 screen.appendChild(hyperscroll(content))
73 function createStream (opts) {
74 return pull(
75 More(sbot.userStream, opts, ['value', 'sequence']),
76 pull.map(function (msg) {
77 return render(msg)
78 })
79 )
80 }
81
82 pull(
83 createStream({old: false, limit: 10, id: src}),
84 stream.top(content)
85 )
86
87 pull(
88 createStream({reverse: true, live: false, limit: 10, id: src}),
89 stream.bottom(content)
90 )
91
92
93 var profile = h('div.content#profile', h('div.message'))
94
95 if (screen.firstChild.firstChild) {
96 screen.firstChild.insertBefore(profile, screen.firstChild.firstChild)
97 } else {
98 screen.firstChild.appendChild(profile)
99 }
100
101 var name = avatar.name(src)
102
103 var avatars = h('div.avatars',
104 h('a', {href: '#' + src},
105 h('span.avatar--medium', avatar.image(src)),
106 name
107 )
108 )
109
110 var buttons = h('div.buttons')
111
112 profile.firstChild.appendChild(avatars)
113 profile.firstChild.appendChild(buttons)
114 buttons.appendChild(tools.mute(src))
115
116 var writeMessage = h('button.btn', 'Public message ' + name.textContent, {
117 onclick: function () {
118 opts = {}
119 opts.type = 'post'
120 opts.mentions = '[' + name.textContent + '](' + src + ')'
121 var composer = h('div#composer', h('div.message', compose(opts)))
122 profile.appendChild(composer)
123 }
124 })
125
126 var writePrivate = h('button.btn', 'Private message ' + name.textContent, {
127 onclick: function () {
128 opts = {}
129 opts.type = 'post'
130 opts.mentions = '[' + name.textContent + '](' + src + ')'
131 opts.recps = [src, id]
132 var composer = h('div#composer', h('div.message', compose(opts)))
133 profile.appendChild(composer)
134 }
135 })
136
137 buttons.appendChild(writeMessage)
138 buttons.appendChild(writePrivate)
139 buttons.appendChild(tools.follow(src))
140
141 profile.firstChild.appendChild(tools.getFollowing(src))
142 profile.firstChild.appendChild(tools.getFollowers(src))
143
144}
145
146var msgThread = function (src) {
147
148 var content = h('div.content')
149 var screen = document.getElementById('screen')
150 screen.appendChild(hyperscroll(content))
151
152 pull(
153 sbot.query({query: [{$filter: { value: { content: {root: src}, timestamp: { $gt: 1 }}}}], live: true}),
154 pull.drain(function (msg) {
155 if (msg.value) {
156 content.appendChild(render(msg))
157 }
158 })
159 )
160
161 sbot.get(src, function (err, data) {
162 if (err) {console.log('could not find message')}
163 data.value = data
164 data.key = src
165 console.log(data)
166 var rootMsg = render(data)
167
168 if (content.firstChild) {
169 content.insertBefore(rootMsg, content.firstChild)
170 } else {
171 content.appendChild(rootMsg)
172 }
173 })
174}
175
176var keyPage = function () {
177 var screen = document.getElementById('screen')
178
179 var importKey = h('textarea.import', {placeholder: 'Import a new public/private key', name: 'textarea', style: 'width: 97%; height: 100px;'})
180
181 var content = h('div.content',
182 h('div.message#key',
183 h('h1', 'Your Key'),
184 h('p', {innerHTML: 'Your public/private key is: <pre><code>' + localStorage[config.caps.shs + '/secret'] + '</code></pre>'},
185 h('button.btn', {onclick: function (e){
186 localStorage[config.caps.shs +'/secret'] = ''
187 alert('Your public/private key has been deleted')
188 e.preventDefault()
189 location.hash = ""
190 location.reload()
191 }}, 'Delete Key')
192 ),
193 h('hr'),
194 h('form',
195 importKey,
196 h('button.btn', {onclick: function (e){
197 if(importKey.value) {
198 localStorage[config.caps.shs + '/secret'] = importKey.value.replace(/\s+/g, ' ')
199 e.preventDefault()
200 alert('Your public/private key has been updated')
201 }
202 location.hash = ""
203 location.reload()
204 }}, 'Import key'),
205 )
206 )
207 )
208
209 screen.appendChild(hyperscroll(content))
210}
211
212function everythingStream () {
213
214 var screen = document.getElementById('screen')
215 var content = h('div.content')
216
217 screen.appendChild(hyperscroll(content))
218
219 function createStream (opts) {
220 return pull(
221 Next(sbot.query, opts, ['value', 'timestamp']),
222 pull.map(function (msg) {
223 if (msg.value) {
224 return render(msg)
225 }
226 })
227 )
228 }
229
230 pull(
231 createStream({
232 limit: 10,
233 reverse: true,
234 live: false,
235 query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
236 }),
237 stream.bottom(content)
238 )
239
240 pull(
241 createStream({
242 limit: 10,
243 old: false,
244 live: true,
245 query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
246 }),
247 stream.top(content)
248 )
249}
250
251
252function hash () {
253 return window.location.hash.substring(1)
254}
255
256module.exports = function () {
257 var src = hash()
258
259 if (ref.isFeed(src)) {
260 userStream(src)
261 } else if (ref.isMsg(src)) {
262 msgThread(src)
263 } else if (src == 'queue') {
264 mentionsStream()
265 } else if (src == 'about') {
266 about()
267 } else if (src == 'edit') {
268 edit()
269 } else if (src == 'key') {
270 keyPage()
271 } else {
272 everythingStream()
273 }
274}
275

Built with git-ssb-web