lib/serve.jsView |
---|
283 | 283 … | case '/friends': return this.friends(m[2]) |
284 | 284 … | case '/live': return this.live(m[2]) |
285 | 285 … | case '/compose': return this.compose(m[2]) |
286 | 286 … | case '/emojis': return this.emojis(m[2]) |
| 287 … | + case '/votes': return this.votes(m[2]) |
287 | 288 … | } |
288 | 289 … | m = /^(\/?[^\/]*)(\/.*)?$/.exec(url) |
289 | 290 … | switch (m[1]) { |
290 | 291 … | case '/channel': return this.channel(m[2]) |
525 | 526 … | ) |
526 | 527 … | }) |
527 | 528 … | } |
528 | 529 … | |
| 530 … | +Serve.prototype.votes = function (path) { |
| 531 … | + if (path) return pull( |
| 532 … | + pull.once(u.renderError(new Error('Not implemented')).outerHTML), |
| 533 … | + this.wrapPage('#' + channel), |
| 534 … | + this.respondSink(404, {'Content-Type': ctype('html')}) |
| 535 … | + ) |
| 536 … | + |
| 537 … | + var self = this |
| 538 … | + var q = self.query |
| 539 … | + var opts = { |
| 540 … | + reverse: !q.forwards, |
| 541 … | + limit: Number(q.limit) || 50, |
| 542 … | + } |
| 543 … | + var gt = Number(q.gt) |
| 544 … | + if (gt) opts.gt = gt |
| 545 … | + var lt = Number(q.lt) |
| 546 … | + if (lt) opts.lt = lt |
| 547 … | + |
| 548 … | + self.app.getVoted(opts, function (err, voted) { |
| 549 … | + if (err) return pull( |
| 550 … | + pull.once(u.renderError(err).outerHTML), |
| 551 … | + self.wrapPage('#' + channel), |
| 552 … | + self.respondSink(500, {'Content-Type': ctype('html')}) |
| 553 … | + ) |
| 554 … | + |
| 555 … | + pull( |
| 556 … | + ph('table', [ |
| 557 … | + ph('thead', [ |
| 558 … | + ph('tr', [ |
| 559 … | + ph('td', {colspan: 2}, self.syncPager({ |
| 560 … | + first: voted.firstTimestamp, |
| 561 … | + last: voted.lastTimestamp, |
| 562 … | + })) |
| 563 … | + ]) |
| 564 … | + ]), |
| 565 … | + ph('tbody', pull( |
| 566 … | + pull.values(voted.items), |
| 567 … | + paramap(function (item, cb) { |
| 568 … | + cb(null, ph('tr', [ |
| 569 … | + ph('td', [String(item.value)]), |
| 570 … | + ph('td', [ |
| 571 … | + self.phIdLink(item.id), |
| 572 … | + pull.once(' dug by '), |
| 573 … | + self.renderIdsList()(pull.values(item.feeds)) |
| 574 … | + ]) |
| 575 … | + ])) |
| 576 … | + }, 8) |
| 577 … | + )), |
| 578 … | + ph('tfoot', {}, []), |
| 579 … | + ]), |
| 580 … | + self.wrapPage('votes'), |
| 581 … | + self.respondSink(200, { |
| 582 … | + 'Content-Type': ctype('html') |
| 583 … | + }) |
| 584 … | + ) |
| 585 … | + }) |
| 586 … | +} |
| 587 … | + |
| 588 … | +Serve.prototype.syncPager = function (opts) { |
| 589 … | + var q = this.query |
| 590 … | + var reverse = !q.forwards |
| 591 … | + var min = (reverse ? opts.last : opts.first) || Number(q.gt) |
| 592 … | + var max = (reverse ? opts.first : opts.last) || Number(q.lt) |
| 593 … | + var minDate = new Date(min) |
| 594 … | + var maxDate = new Date(max) |
| 595 … | + var qOlder = mergeOpts(q, {lt: min, gt: undefined, forwards: undefined}) |
| 596 … | + var qNewer = mergeOpts(q, {gt: max, lt: undefined, forwards: 1}) |
| 597 … | + var atNewest = reverse ? !q.lt : !max |
| 598 … | + var atOldest = reverse ? !min : !q.gt |
| 599 … | + if (atNewest && !reverse) qOlder.lt++ |
| 600 … | + if (atOldest && reverse) qNewer.gt-- |
| 601 … | + return h('div', |
| 602 … | + atOldest ? 'oldest' : [ |
| 603 … | + h('a', {href: '?' + qs.stringify(qOlder)}, '<<'), ' ', |
| 604 … | + h('span', {title: minDate.toString()}, htime(minDate)), ' ', |
| 605 … | + ], |
| 606 … | + ' - ', |
| 607 … | + atNewest ? 'now' : [ |
| 608 … | + h('span', {title: maxDate.toString()}, htime(maxDate)), ' ', |
| 609 … | + h('a', {href: '?' + qs.stringify(qNewer)}, '>>') |
| 610 … | + ] |
| 611 … | + ).outerHTML |
| 612 … | +} |
| 613 … | + |
529 | 614 … | Serve.prototype.peers = function (ext) { |
530 | 615 … | var self = this |
531 | 616 … | if (self.data.action === 'connect') { |
532 | 617 … | return self.app.sbot.gossip.connect(self.data.address, function (err) { |
619 | 704 … | }) |
620 | 705 … | ) |
621 | 706 … | } |
622 | 707 … | |
623 | | -Serve.prototype.phIdLink = function (id) { |
624 | | - return pull( |
625 | | - pull.once(id), |
626 | | - pull.asyncMap(this.renderIdLink.bind(this)), |
627 | | - pull.map(u.toHTML) |
628 | | - ) |
629 | | -} |
630 | | - |
631 | 708 … | Serve.prototype.contacts = function (path) { |
632 | 709 … | var self = this |
633 | 710 … | var id = String(path).substr(1) |
634 | 711 … | var contacts = self.app.createContactStreams(id) |
1158 | 1235 … | h('a', {href: render.toUrl('/friends')}, 'friends'), ' ', |
1159 | 1236 … | h('a', {href: render.toUrl('/advsearch')}, 'search'), ' ', |
1160 | 1237 … | h('a', {href: render.toUrl('/live')}, 'live'), ' ', |
1161 | 1238 … | h('a', {href: render.toUrl('/compose')}, 'compose'), ' ', |
| 1239 … | + h('a', {href: render.toUrl('/votes')}, 'votes'), ' ', |
1162 | 1240 … | h('a', {href: render.toUrl('/emojis')}, 'emojis'), ' ', |
1163 | 1241 … | render.idLink(self.app.sbot.id, done()), ' ', |
1164 | 1242 … | h('input.search-input', {name: 'q', value: searchQ, |
1165 | 1243 … | placeholder: 'search'}) |
1178 | 1256 … | }) |
1179 | 1257 … | ) |
1180 | 1258 … | } |
1181 | 1259 … | |
1182 | | -Serve.prototype.renderIdLink = function (id, cb) { |
1183 | | - var render = this.app.render |
1184 | | - var el = render.idLink(id, function (err) { |
1185 | | - if (err || !el) { |
1186 | | - el = h('a', {href: render.toUrl(id)}, id) |
1187 | | - } |
1188 | | - cb(null, el) |
1189 | | - }) |
| 1260 … | +Serve.prototype.phIdLink = function (id) { |
| 1261 … | + return pull( |
| 1262 … | + pull.once(id), |
| 1263 … | + this.renderIdsList() |
| 1264 … | + ) |
1190 | 1265 … | } |
1191 | 1266 … | |
1192 | 1267 … | Serve.prototype.friends = function (path) { |
1193 | 1268 … | var self = this |
1194 | 1269 … | pull( |
1195 | 1270 … | self.app.sbot.friends.createFriendStream({hops: 1}), |
1196 | | - self.renderFriends(), |
1197 | | - pull.map(function (el) { |
1198 | | - return [el, ' '] |
1199 | | - }), |
1200 | | - pull.map(u.toHTML), |
| 1271 … | + self.renderIdsList(), |
1201 | 1272 … | u.hyperwrap(function (items, cb) { |
1202 | 1273 … | cb(null, [ |
1203 | 1274 … | h('section', |
1204 | 1275 … | h('h3', 'Friends') |
|
1212 | 1283 … | }) |
1213 | 1284 … | ) |
1214 | 1285 … | } |
1215 | 1286 … | |
1216 | | -Serve.prototype.renderFriends = function () { |
| 1287 … | +Serve.prototype.renderIdsList = function () { |
1217 | 1288 … | var self = this |
1218 | | - return paramap(function (id, cb) { |
1219 | | - self.renderIdLink(id, function (err, el) { |
1220 | | - if (err) el = u.renderError(err, ext) |
1221 | | - cb(null, el) |
1222 | | - }) |
1223 | | - }, 8) |
| 1289 … | + return pull( |
| 1290 … | + paramap(function (id, cb) { |
| 1291 … | + self.app.render.getNameLink(id, cb) |
| 1292 … | + }, 8), |
| 1293 … | + pull.map(function (el) { |
| 1294 … | + return [el, ' '] |
| 1295 … | + }), |
| 1296 … | + pull.map(u.toHTML) |
| 1297 … | + ) |
1224 | 1298 … | } |
1225 | 1299 … | |
1226 | 1300 … | var relationships = [ |
1227 | 1301 … | '', |