index.jsView |
---|
24 | 24 … | var ident = require('pull-identify-filetype') |
25 | 25 … | var mime = require('mime-types') |
26 | 26 … | var moment = require('moment') |
27 | 27 … | var LRUCache = require('lrucache') |
| 28 … | +var asyncFilter = require('pull-async-filter') |
28 | 29 … | |
29 | 30 … | var hlCssPath = path.resolve(require.resolve('highlight.js'), '../../styles') |
30 | 31 … | var emojiPath = path.resolve(require.resolve('emoji-named-characters'), '../pngs') |
31 | 32 … | |
239 | 240 … | return this.handlePOST(req, dir) |
240 | 241 … | |
241 | 242 … | if (dir == '') |
242 | 243 … | return this.serveIndex(req) |
| 244 … | + else if (dir == 'notifications') |
| 245 … | + return this.serveNotifications(req) |
243 | 246 … | else if (dir == 'search') |
244 | 247 … | return this.serveSearch(req) |
245 | 248 … | else if (dir[0] === '#') |
246 | 249 … | return this.serveChannel(req, dir, dirs.slice(1)) |
537 | 540 … | '<form action="/search" method="get">' + |
538 | 541 … | '<h1><a href="/">' + app + |
539 | 542 … | (appName == 'ssb' ? '' : ' <sub>' + appName + '</sub>') + |
540 | 543 … | '</a></h1> ' + |
| 544 … | + '<a href="/notifications">NOTIFICATIONS</a>' + |
541 | 545 … | '<input class="search-bar" name="q" size="60"' + |
542 | 546 … | ' placeholder=" Search" value="' + q + '" />' + |
543 | 547 … | '</form>' + |
544 | 548 … | '</header>' + |
650 | 654 … | ) |
651 | 655 … | ) |
652 | 656 … | } |
653 | 657 … | |
| 658 … | +G.renderNotifications = function (req, feedId, filter) { |
| 659 … | + |
| 660 … | + |
| 661 … | + var self = this |
| 662 … | + |
| 663 … | + var query = req._u.query |
| 664 … | + var opts = { |
| 665 … | + reverse: !query.forwards, |
| 666 … | + lt: query.lt && +query.lt || Date.now(), |
| 667 … | + gt: query.gt ? +query.gt : -Infinity, |
| 668 … | + values: true, |
| 669 … | + id: feedId |
| 670 … | + } |
| 671 … | + |
| 672 … | + |
| 673 … | + var source |
| 674 … | + if (this.ssb.gitindex) { |
| 675 … | + source = pull( |
| 676 … | + feedId ? this.ssb.gitindex.author(opts) : this.ssb.gitindex.read(opts), |
| 677 … | + pull.map(function (msg) { return msg.value }) |
| 678 … | + ) |
| 679 … | + } else { |
| 680 … | + source = feedId ? this.ssb.createUserStream(opts) : this.ssb.createFeedStream(opts) |
| 681 … | + } |
| 682 … | + |
| 683 … | + var id = query.feed || self.myId |
| 684 … | + |
| 685 … | + return pull( |
| 686 … | + source, |
| 687 … | + u.decryptMessages(this.ssb), |
| 688 … | + u.readableMessages(), |
| 689 … | + pull.filter(function (msg) { |
| 690 … | + var c = msg.value.content |
| 691 … | + return c.type in msgTypes |
| 692 … | + || (c.type == 'post' && c.repo && c.issue) |
| 693 … | + }), |
| 694 … | + typeof filter == 'function' ? filter(opts) : filter, |
| 695 … | + |
| 696 … | + asyncFilter(function (msg, cb) { |
| 697 … | + if (!msg.value.content.repo) return cb(null, true) |
| 698 … | + if (msg.value.author === id) return cb(null, true) |
| 699 … | + |
| 700 … | + |
| 701 … | + var repoId = msg.value.content.repo |
| 702 … | + |
| 703 … | + |
| 704 … | + self.getRepo(repoId, function (err, repo) { |
| 705 … | + if (err) return cb(null, true) |
| 706 … | + var mine = (repo.feed === id) |
| 707 … | + cb(null, !mine) |
| 708 … | + }) |
| 709 … | + }), |
| 710 … | + pull.take(25), |
| 711 … | + this.addAuthorName(), |
| 712 … | + query.forwards && u.pullReverse(), |
| 713 … | + paginate( |
| 714 … | + function (first, cb) { |
| 715 … | + if (!query.lt && !query.gt) return cb(null, '') |
| 716 … | + var gt = feedId ? first.value.sequence : first.value.timestamp + 1 |
| 717 … | + query.gt = gt |
| 718 … | + query.forwards = 1 |
| 719 … | + delete query.lt |
| 720 … | + cb(null, '<a href="?' + qs.stringify(query) + '">' + |
| 721 … | + req._t('Next') + '</a>') |
| 722 … | + }, |
| 723 … | + paramap(this.renderFeedItem.bind(this, req), 8), |
| 724 … | + function (last, cb) { |
| 725 … | + query.lt = feedId ? last.value.sequence : last.value.timestamp - 1 |
| 726 … | + delete query.gt |
| 727 … | + delete query.forwards |
| 728 … | + cb(null, '<a href="?' + qs.stringify(query) + '">' + |
| 729 … | + req._t('Previous') + '</a>') |
| 730 … | + }, |
| 731 … | + function (cb) { |
| 732 … | + if (query.forwards) { |
| 733 … | + delete query.gt |
| 734 … | + delete query.forwards |
| 735 … | + query.lt = opts.gt + 1 |
| 736 … | + } else { |
| 737 … | + delete query.lt |
| 738 … | + query.gt = opts.lt - 1 |
| 739 … | + query.forwards = 1 |
|
| 740 … | + } |
| 741 … | + cb(null, '<a href="?' + qs.stringify(query) + '">' + |
| 742 … | + req._t(query.forwards ? 'Older' : 'Newer') + '</a>') |
| 743 … | + } |
| 744 … | + ) |
| 745 … | + ) |
| 746 … | +} |
| 747 … | + |
654 | 748 … | G.renderFeedItem = function (req, msg, cb) { |
655 | 749 … | var self = this |
656 | 750 … | var c = msg.value.content |
657 | 751 … | var msgDate = moment(new Date(msg.value.timestamp)).fromNow() |
758 | 852 … | G.serveIndex = function (req) { |
759 | 853 … | return this.serveTemplate(req)(this.renderFeed(req)) |
760 | 854 … | } |
761 | 855 … | |
| 856 … | +G.serveNotifications = function (req) { |
| 857 … | + return this.serveTemplate(req)(this.renderNotifications(req)) |
| 858 … | +} |
| 859 … | + |
762 | 860 … | G.serveChannel = function (req, id, path) { |
763 | 861 … | var self = this |
764 | 862 … | return u.readNext(function (cb) { |
765 | 863 … | self.getRepo(id, function (err, repo) { |