git ssb

2+

mixmix / ticktack



Tree: f6a16e3fc5c25cadd2445d141a36a91d964a1813

Files: f6a16e3fc5c25cadd2445d141a36a91d964a1813 / app / html / thread-card.js

2417 bytesRaw
1var nest = require('depnest')
2var h = require('mutant/h')
3var isString= require('lodash/isString')
4var maxBy= require('lodash/maxBy')
5
6exports.gives = nest('app.html.threadCard', true)
7
8exports.needs = nest({
9 'keys.sync.id': 'first',
10 'history.sync.push': 'first',
11 'about.obs.name': 'first',
12 'about.html.avatar': 'first',
13 'message.html.subject': 'first',
14 'translations.sync.strings': 'first',
15 'unread.sync.isUnread': 'first'
16})
17
18exports.create = function (api) {
19
20 //render the icon for a thread.
21 //it would be more depjecty to split this
22 //into two methods, one in a private plugin
23 //one in a channel plugin
24 function threadIcon (msg) {
25 if(msg.value.private) {
26 const myId = api.keys.sync.id()
27
28 return msg.value.content.recps
29 .map(link => isString(link) ? link : link.link)
30 .filter(link => link !== myId)
31 .map(api.about.html.avatar)
32 }
33 else if(msg.value.content.channel)
34 return '#'+msg.value.content.channel
35 }
36
37
38 // REFACTOR: move this to a template?
39 function buildRecipientNames (thread) {
40 const myId = api.keys.sync.id()
41
42 return thread.value.content.recps
43 .map(link => isString(link) ? link : link.link)
44 .filter(link => link !== myId)
45 .map(api.about.obs.name)
46 }
47
48 return nest('app.html.threadCard', (thread, opts = {}) => {
49 var strings = api.translations.sync.strings()
50 const { subject } = api.message.html
51
52 if(!thread.value) return
53 if(!thread.value.content.text) return
54
55 const subjectEl = h('div.subject', [
56 opts.nameRecipients
57 ? h('div.recps', buildRecipientNames(thread).map(recp => h('div.recp', recp)))
58 : null,
59 subject(thread)
60 ])
61
62 const lastReply = thread.replies && maxBy(thread.replies, r => r.timestamp)
63 const replySample = lastReply ? subject(lastReply) : null
64
65 const onClick = opts.onClick || function () { api.history.sync.push(thread) }
66 const id = `${thread.key.replace(/[^a-z0-9]/gi, '')}` //-${JSON.stringify(opts)}`
67 // id is only here to help morphdom morph accurately
68
69 var className = thread.unread ? '-unread': ''
70
71 return h('ThreadCard', { id, className }, [
72 h('div.context', threadIcon(thread)),
73 h('div.content', {'ev-click': onClick}, [
74 subjectEl,
75 replySample ? h('div.reply', [
76 h('i.fa.fa-caret-left'),
77 replySample
78 ]) : null
79 ])
80 ])
81 })
82}
83
84
85

Built with git-ssb-web