git ssb

0+

ev / minbase



Tree: f1cc08ac986f18880000b780dae6fb2043e76948

Files: f1cc08ac986f18880000b780dae6fb2043e76948 / modules / notifications.js

3961 bytesRaw
1'use strict'
2var h = require('hyperscript')
3var u = require('../util')
4var pull = require('pull-stream')
5var Scroller = require('pull-scroll')
6var paramap = require('pull-paramap')
7var cont = require('cont')
8var ref = require('ssb-ref')
9var log = require('./scuttlebot').log
10var get = require('./scuttlebot').get
11var userstream = require('./scuttlebot').userstream
12
13exports.needs = {
14 message_render: 'first'
15}
16
17exports.gives = {
18 builtin_tabs: true,
19 screen_view: true
20}
21
22exports.create = function (api) {
23
24 function notifications(ourIds) {
25
26 function linksToUs(link) {
27 return link && link.link in ourIds
28 }
29
30 function isOurMsg(id, cb) {
31 if (!id) return cb(null, false)
32 if (typeof id === 'object' && typeof id.link === 'string') id = id.link
33 if (!ref.isMsg(id)) return cb(null, false)
34 get(id, function (err, msg) {
35 if (err && err.name == 'NotFoundError') cb(null, false)
36 else if (err) cb(err)
37 else if (msg.content.type === 'issue' || msg.content.type === 'pull-request')
38 isOurMsg(msg.content.repo || msg.content.project, cb)
39 else cb(err, msg.author in ourIds)
40 })
41 }
42
43 function isAnyOurMessage(msg, ids, cb) {
44 cont.para(ids.map(function (id) {
45 return function (cb) { isOurMsg(id, cb) }
46 }))
47 (function (err, results) {
48 if (err) cb(err)
49 else if (results.some(Boolean)) cb(null, msg)
50 else cb()
51 })
52 }
53
54 return paramap(function (msg, cb) {
55 var c = msg.value && msg.value.content
56 if (!c || typeof c !== 'object') return cb()
57 if (msg.value.author in ourIds) return cb()
58
59 if (c.mentions && Array.isArray(c.mentions) && c.mentions.some(linksToUs))
60 return cb(null, msg)
61
62 if (msg.private)
63 return cb(null, msg)
64
65 switch (c.type) {
66 case 'post':
67 if (c.branch || c.root)
68 return isAnyOurMessage(msg, [].concat(c.branch, c.root), cb)
69 else return cb()
70
71 case 'contact':
72 return cb(null, c.contact in ourIds ? msg : null)
73
74 case 'vote':
75 if (c.vote && c.vote.link)
76 return isOurMsg(c.vote.link, function (err, isOurs) {
77 cb(err, isOurs ? msg : null)
78 })
79 else return cb()
80
81 case 'issue':
82 case 'pull-request':
83 return isOurMsg(c.project || c.repo, function (err, isOurs) {
84 cb(err, isOurs ? msg : null)
85 })
86
87 case 'issue-edit':
88 return isAnyOurMessage(msg, [c.issue].concat(c.issues), cb)
89
90 default:
91 cb()
92 }
93 }, 4)
94 }
95
96 function getFirstMessage(feedId, cb) {
97 userstream({id: feedId, gte: 0, limit: 1})(null, cb)
98 }
99
100 return {
101 builtin_tabs: function () {
102 return ['Mentions']
103 },
104
105 screen_view: function (path) {
106 if(path === 'Mentions') {
107 var ids = {}
108 var oldest
109
110 var id = require('../keys').id
111 ids[id] = true
112 getFirstMessage(id, function (err, msg) {
113 if (err) return console.error(err)
114 if (!oldest || msg.value.timestamp < oldest) {
115 oldest = msg.value.timestamp
116 }
117 })
118
119 var content = h('div.column.scroller__content')
120 var div = h('div.column.scroller',
121 {style: {'overflow':'auto'}},
122 h('div.scroller__wrapper',
123 content
124 )
125 )
126
127 pull(
128 u.next(log, {old: false, limit: 100}),
129 notifications(ids),
130 pull.filter(),
131 Scroller(div, content, api.message_render, true, false)
132 )
133
134 pull(
135 u.next(log, {reverse: true, limit: 100, live: false}),
136 notifications(ids),
137 pull.filter(),
138 pull.take(function (msg) {
139 return !oldest ? true : msg.value.timestamp > oldest
140 }),
141 Scroller(div, content, api.message_render, false, false)
142 )
143
144 return div
145 }
146 }
147 }
148}
149
150

Built with git-ssb-web