sbot/ui/lib/com/message-oneline.js

138 lines
4.2 KiB
JavaScript

'use strict'
var h = require('hyperscript')
var mlib = require('ssb-msgs')
var app = require('../app')
var com = require('./index')
var u = require('../util')
function getSummary (msg, opts) {
var c = msg.value.content
var maxlen = (opts && opts.menuitem) ? 40 : 100
function t(text) {
if (text.length > maxlen)
return text.slice(0, maxlen-3) + '...'
return text
}
try {
var s = ({
post: function () {
if (!c.text) return
if (mlib.link(c.root, 'msg'))
return com.a('#/msg/'+mlib.link(c.root).link + '?jumpto=' + encodeURIComponent(msg.key), t(c.text))
return com.a('#/msg/'+msg.key, t(c.text))
},
mail: function () {
return com.a('#/msg/'+msg.key, [c.subject||'(No Subject)', ' ', h('span.text-muted', t(c.body))])
},
vote: function () {
if (!mlib.link(c.vote, 'msg'))
return
var link, desc = h('span', 'this message')
if (c.vote == 1)
link = h('a', { href: '#/msg/'+mlib.link(c.vote).link }, com.icon('star'), ' ', desc)
else if (c.vote <= 0)
link = h('a', { href: '#/msg/'+mlib.link(c.vote).link }, com.icon('erase'), ' ', desc)
appendMsgSummary(desc, mlib.link(c.vote).link, t)
return link
},
flag: function () {
if (!mlib.link(c.flag, 'msg'))
return
if (c.flag)
return com.a('#/msg/'+mlib.link(c.flag).link, h('span.text-danger', com.icon('flag'), ' Flagged your post ', h('span.label.label-danger', c.flag)))
else
return com.a('#/msg/'+mlib.link(c.flag).link, h('span.text-danger', com.icon('erase'), ' Unflagged your post'))
}
})[c.type]()
if (!s || s.length == 0)
s = false
} catch (e) { }
if (!s)
s = h('div', t(JSON.stringify(msg.value.content)))
return s
}
module.exports = function (msg, opts) {
// markup
var content
if (typeof msg.value.content == 'string') {
// encrypted message, try to decrypt
content = h('div')
app.ssb.private.unbox(msg.value.content, function (err, decrypted) {
if (decrypted) {
// success, render content
msg.value.content = decrypted
var col = content.parentNode
var icon = com.icon('lock')
icon.style.marginRight = '5px'
col.removeChild(content)
col.appendChild(icon)
col.appendChild(getSummary(msg, opts))
}
})
} else
content = getSummary(msg, opts)
if (!content)
return
var msgOneline
if (opts && opts.menuitem) {
// get the href for the link
var c = msg.value.content
var href = '#/msg/'
if (mlib.link(c.root, 'msg'))
href += mlib.link(c.root).link + '?jumpto=' + encodeURIComponent(msg.key)
else if (mlib.link(c.voteTopic, 'msg'))
href += mlib.link(c.voteTopic).link
else
href += msg.key
// render based on type
if (c.type == 'vote') {
msgOneline = h('a.message-oneline-menuitem', { href: href },
h('.message-oneline-column.only', h('strong', com.userName(msg.value.author)), ' ', content)
)
} else {
msgOneline = h('a.message-oneline-menuitem', { href: href },
h('.message-oneline-column', h('strong', com.userName(msg.value.author))),
h('.message-oneline-column', content),
h('.message-oneline-column', ago(msg))
)
}
} else {
msgOneline = h('.message-oneline',
h('.message-oneline-column', com.userImg(msg.value.author)),
h('.message-oneline-column', com.user(msg.value.author, { maxlength: 15 })),
h('.message-oneline-column', content),
h('.message-oneline-column', ago(msg))
)
}
app.ssb.patchwork.isRead(msg.key, function (err, isread) {
if (!err && !isread)
msgOneline.classList.add('unread')
})
return msgOneline
}
function appendMsgSummary (el, mid, shorten) {
app.ssb.get(mid, function (err, msg) {
if (!msg) return
if (msg.content.type == 'post')
el.textContent = shorten(msg.content.text)
else if (msg.content.type == 'mail')
el.textContent = shorten(msg.content.subject)
})
}
function ago (msg) {
var str = u.prettydate(new Date(msg.value.timestamp))
if (str == 'yesterday')
str = '1d'
return h('small.text-muted', str, ' ago')
}