git ssb

1+

punkmonk.termux / mvd



forked from ev / mvd

Tree: 1e823ee46587238b719751949108da048d09e777

Files: 1e823ee46587238b719751949108da048d09e777 / views.js

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

Built with git-ssb-web