sbot/ui/lib/com/index.js

284 lines
8.4 KiB
JavaScript

'use strict'
var h = require('hyperscript')
var o = require('observable')
var pull = require('pull-stream')
var app = require('../app')
var ui = require('../ui')
var modals = require('../ui/modals')
var subwindows = require('../ui/subwindows')
var u = require('../util')
var social = require('../social-graph')
var suggestBox = require('suggest-box')
var ago = require('nicedate')
var a =
exports.a = function (href, text, opts) {
opts = opts || {}
opts.href = href
return h('a', opts, text)
}
var icon =
exports.icon = function (i) {
return h('span.glyphicon.glyphicon-'+i)
}
var userlink =
exports.userlink = function (id, text, opts) {
opts = opts || {}
opts.className = (opts.className || '') + ' user-link'
text = text || userName(id) || u.shortString(id)
return h('span.user-link-outer', a('#/profile/'+id, text, opts))
}
var user =
exports.user = function (id, opts) {
var followIcon
if (id != app.user.id && (!app.user.profile.assignedTo[id] || !app.user.profile.assignedTo[id].following)) {
followIcon = [' ', h('a',
{ title: 'This is not somebody you follow.', href: '#/profile/'+id },
h('span.text-muted', icon('question-sign'))
)]
}
var l = userlink
if (opts && opts.thin)
l = userlinkThin
var name = userName(id)
if (opts && opts.maxlength && name.length > opts.maxlength)
name = name.slice(0, opts.maxlength-3) + '...'
return [l(id, name), followIcon]
}
var userName =
exports.userName = function (id) {
return app.users.names[id] || u.shortString(id)
}
var profilePicUrl =
exports.profilePicUrl = function (id) {
var url = './img/default-prof-pic.png'
var profile = app.users.profiles[id]
if (profile) {
var link
// lookup the image link
if (profile.assignedBy[app.user.id] && profile.assignedBy[app.user.id].image)
link = profile.assignedBy[app.user.id].image
else if (profile.self.image)
link = profile.self.image
if (link) {
url = 'http://localhost:7777/'+link.link
// append the 'backup img' flag, so we always have an image
url += '?fallback=img'
// if we know the filetype, try to construct a good filename
if (link.type) {
var ext = link.type.split('/')[1]
if (ext) {
var name = app.users.names[id] || 'profile'
url += '&name='+encodeURIComponent(name+'.'+ext)
}
}
}
}
return url
}
var userImg =
exports.userImg = function (id) {
return h('a.user-img', { href: '#/profile/'+id },
h('img', { src: profilePicUrl(id) })
)
}
var userlinkThin =
exports.userlinkThin = function (id, text, opts) {
opts = opts || {}
opts.className = (opts.className || '') + 'thin'
return userlink(id, text, opts)
}
var hexagon =
exports.hexagon = function (url, size) {
var img = url ? 'url('+url+')' : 'none'
size = size || 30
return h('.hexagon-'+size, { 'data-bg': url, style: 'background-image: '+img },
h('.hexTop'),
h('.hexBottom'))
}
var userHexagon =
exports.userHexagon = function (id, size) {
return h('a.user-hexagon', { href: '#/profile/'+id },
hexagon(profilePicUrl(id), size)
)
}
var userRelationship =
exports.userRelationship = function (id, nfollowers, nflaggers) {
if (id == app.user.id)
return 'This is you!'
// gather followers that you follow
if (typeof nfollowers == 'undefined')
nfollowers = social.followedFollowers(app.user.id, id).length
var summary
if (social.follows(app.user.id, id)) {
summary = 'Followed by you'
if (nfollowers > 0)
summary += ' and ' + nfollowers + ' user' + (nfollowers==1?'':'s') + ' you follow'
} else {
if (nfollowers === 0)
summary = 'Not followed by you or anyone you follow'
else
summary = 'Followed by ' + nfollowers + ' user' + (nfollowers==1?'':'s') + ' you follow'
}
// gather flaggers that you follow (and self)
if (typeof nflaggers == 'undefined')
nflaggers = social.followedFlaggers(app.user.id, id, true).length
if (nflaggers !== 0) {
summary += '. Flagged by '+nflaggers+' user' + (nflaggers==1?'':'s')
}
return summary
}
var hovercard =
exports.hovercard = function (id) {
var name = userName(id)
var following = social.follows(app.user.id, id)
return h('.hovercard', { style: 'background-image: url('+profilePicUrl(id)+')' },
h('h3', userName(id)),
userRelationship(id),
(id != app.user.id) ? h('p', following ? 'You follow ' : 'You do not follow ', name) : ''
)
}
var userHexagrid =
exports.userHexagrid = function (uids, opts) {
var nrow = (opts && opts.nrow) ? opts.nrow : 3
var size = (opts && opts.size) ? opts.size : 60
var els = [], row = []
uids.forEach(function (uid) {
row.push(userHexagon(uid, size))
var n = (opts && opts.uneven && els.length % 2 == 1) ? nrow-1 : nrow
if (row.length >= n) {
els.push(h('div', row))
row = []
}
})
if (row.length)
els.push(h('div', row))
return h('.user-hexagrid-'+size, els)
}
var friendsHexagrid =
exports.friendsHexagrid = function (opts) {
var friends = []
friends.push(app.user.id)
for (var k in app.users.profiles) {
var p = app.users.profiles[k]
if (opts && opts.reverse) {
if (p.assignedTo[app.user.id] && p.assignedTo[app.user.id].following)
friends.push(p.id)
} else {
if (p.assignedBy[app.user.id] && p.assignedBy[app.user.id].following)
friends.push(p.id)
}
}
if (friends.length)
return userHexagrid(friends, opts)
}
exports.filterClasses = function () {
var cls = ''
if (!app.filters.nsfw)
cls += '.show-nsfw'
if (!app.filters.spam)
cls += '.show-spam'
if (!app.filters.abuse)
cls += '.show-abuse'
return cls
}
var nav =
exports.nav = function (opts) {
var items = opts.items.map(function (item) {
var cls = '.navlink-'+item[0]
if (item[0] == opts.current)
cls += '.selected'
if (item[3])
cls += item[3]
if (typeof item[1] == 'function')
return h('a'+cls, { href: '#', 'data-item': item[0], onclick: item[1] }, item[2])
return h('a'+cls, { href: item[1] }, item[2])
})
return h('.navlinks', items)
}
var search =
exports.search = function (opts) {
var searchInput = h('input.search', { type: 'text', name: 'search', placeholder: 'Search', value: opts.value })
return h('form', { onsubmit: opts.onsearch }, searchInput)
}
exports.paginator = function (base, start, count) {
var prevBtn = h('a.btn.btn-primary', { href: base+((start - 30 > 0) ? start - 30 : 0) }, icon('chevron-left'))
var nextBtn = h('a.btn.btn-primary', { href: base+(start+30) }, icon('chevron-right'))
if (start <= 0) prevBtn.setAttribute('disabled', true)
if (start+30 > count) nextBtn.setAttribute('disabled', true)
return h('p', prevBtn, (start + 1), ' - ', Math.min(count, (start + 30)), ' ('+count+')', nextBtn)
}
var panel =
exports.panel = function (title, content) {
return h('.panel.panel-default', [
(title) ? h('.panel-heading', h('h3.panel-title', title)) : '',
h('.panel-body', content)
])
}
var page =
exports.page = function (id, content) {
return h('#page.container-fluid.'+id+'-page', content)
}
exports.prettyRaw = require('./pretty-raw')
exports.messageFeed = require('./message-feed')
exports.message = require('./message')
exports.messageContent = require('./message-content')
exports.messageSummary = require('./message-summary')
exports.messageOneline = require('./message-oneline')
exports.messageAttachments = require('./message-attachments')
exports.messageStats = require('./message-stats')
exports.contactFeed = require('./contact-feed')
exports.contactPlaque = require('./contact-plaque')
exports.contactListing = require('./contact-listing')
exports.files = require('./files')
exports.notifications = require('./notifications')
exports.peers = require('./peers')
exports.postForm = require('./post-form')
exports.pmForm = require('./pm-form')
exports.webcamGifferForm = require('./webcam-giffer-form')
exports.imagesForm = require('./images-form')
exports.composer = require('./composer')
exports.imageUploader = require('./image-uploader')
exports.inviteForm = require('./invite-form')
exports.lookupForm = require('./lookup-form')
exports.renameForm = require('./rename-form')
exports.flagForm = require('./flag-form')
exports.networkGraph = require('./network-graph')
exports.connectionGraph = require('./connection-graph')
exports.userDownloader = require('./user-downloader')
exports.help = require('./help')
exports.pagenav = require('./nav').pagenav
exports.sidenav = require('./nav').sidenav
exports.webview = require('./webview')
exports.finder = require('./finder')