sbot/ui/lib/pages/profile.js

200 lines
7.0 KiB
JavaScript

'use strict'
var h = require('hyperscript')
var refs = require('ssb-ref')
var mlib = require('ssb-msgs')
var multicb = require('multicb')
var schemas = require('ssb-msg-schemas')
var pull = require('pull-stream')
var app = require('../app')
var ui = require('../ui')
var modals = require('../ui/modals')
var subwindows = require('../ui/subwindows')
var com = require('../com')
var u = require('../util')
var markdown = require('../markdown')
var mentions = require('../mentions')
var social = require('../social-graph')
module.exports = function () {
var pid = app.page.param
var profile = app.users.profiles[pid]
var name = com.userName(pid)
// user not found
if (!profile) {
if (refs.isFeedId(pid)) {
profile = {
assignedBy: {},
id: pid,
isEmpty: true
}
} else {
ui.setPage('profile', h('.layout-twocol',
h('.layout-main',
h('.well', { style: 'margin-top: 5px; background: #fff' },
h('h3', { style: 'margin-top: 0' }, 'Invalid user ID'),
h('p',
h('em', pid),
' is not a valid user ID. ',
h('img.emoji', { src: './img/emoji/disappointed.png', title: 'disappointed', width: 20, height: 20, style: 'vertical-align: top' })
)
)
)
))
return
}
}
var isSelf = (pid == app.user.id)
var isFollowing = social.follows(app.user.id, pid)
var followsYou = social.follows(pid, app.user.id)
var hasFlagged = social.flags(app.user.id, pid)
var hasBlocked = social.blocks(app.user.id, pid)
var followers1 = social.followedFollowers(app.user.id, pid, true)
var followers2 = social.unfollowedFollowers(app.user.id, pid)
var followeds = social.followeds(pid)
var flaggers = social.followedFlaggers(app.user.id, pid, true)
// name conflict controls
var nameConflictDlg
var nameConflicts = []
for (var id in app.users.names) {
if (id != pid && app.users.names[id] == app.users.names[pid])
nameConflicts.push(id)
}
if (nameConflicts.length) {
nameConflictDlg = h('.well.white', { style: 'margin: -10px 15px 15px' },
h('p', { style: 'margin-bottom: 10px' }, h('strong', 'Other users named "'+app.users.names[pid]+'":')),
h('ul.list-inline', nameConflicts.map(function (id) { return h('li', com.user(id)) })),
h('p', h('small', 'ProTip: You can rename users to avoid getting confused!'))
)
}
// flag controls
var flagMsgs
if (flaggers.length) {
flagMsgs = h('.profile-flags.message-feed')
flaggers.forEach(function (id) {
var flag = social.flags(id, pid)
if (flag.reason && flag.key) {
app.ssb.get(flag.key, function (err, flagMsg) {
if (err) console.error(err)
if (flagMsg) flagMsgs.appendChild(com.message({ key: flag.key, value: flagMsg }))
})
}
})
}
var hasMsgs = false
var content = com.messageFeed({ feed: feedFn, cursor: feedCursor, filter: feedFilter, infinite: true, onempty: onNoMsgs })
function feedFn (opts) {
opts = opts || {}
opts.id = pid
return app.ssb.createUserStream(opts)
}
function feedCursor (msg) {
if (msg)
return msg.value.sequence
}
function feedFilter (msg) {
hasMsgs = true
// post by this user
var c = msg.value.content
if (msg.value.author == pid && c.type == 'post')
return true
}
function onNoMsgs (feedEl) {
if (hasMsgs) {
feedEl.appendChild(h('p.text-center.text-muted', h('br'), 'No posts...yet!'))
} else {
feedEl.appendChild(h('div', { style: 'margin: 12px 1px; background: #fff; padding: 15px 15px 10px' },
h('h3', { style: 'margin-top: 0' }, 'Umm... who is this?'),
h('p', 'This user\'s data hasn\'t been fetched yet, so we don\'t know anything about them!'),
h('p', com.userDownloader(pid))
))
}
}
// render page
ui.setPage('profile', h('.layout-twocol',
h('.layout-main',
h('.profile-header',
h('h1', h('strong', name)),
h('a.btn.btn-3d', { href: '#', onclick: privateMessage, title: 'Send an encrypted message to '+name }, com.icon('envelope'), ' Secret Message')
),
flagMsgs ? h('.message-feed-container', flagMsgs) : '',
content),
h('.layout-rightnav',
h('.profile-controls',
com.contactPlaque(profile, followers1.length + followers2.length, flaggers.length),
(hasBlocked) ? h('.block', 'BLOCKED') : '',
(!isSelf) ?
[
(followsYou) ? h('.follows-you', 'Follows You') : '',
h('.btns',
h('.btns-group',
(hasBlocked) ? '' : h('a.btn.btn-3d', { href: '#', onclick: toggleFollow }, com.icon('user'), ((isFollowing) ? ' Unfollow' : ' Follow')),
' ',
h('a.btn.btn-3d', { href: '#', onclick: renameModal }, com.icon('pencil'), ' Rename'),
' ',
h('a.btn.btn-3d', { href: '#', onclick: flagModal }, com.icon('flag'), ((!!hasFlagged) ? ' Unflag' : ' Flag'))))
] :
h('.btns.text-center', { style: 'padding-right: 10px' },
h('a.btn.btn-3d', { href: '#/setup', title: 'Update your name or image' }, com.icon('pencil'), ' Edit Your Profile')),
nameConflictDlg,
(!isSelf) ?
com.connectionGraph(app.user.id, pid, { w: 5.5, drawLabels: false, touchEnabled: false, mouseEnabled: false, mouseWheelEnabled: false }) :
'',
(flaggers.length) ? h('.relations', h('h4', 'flagged by'), com.userHexagrid(flaggers, { nrow: 4 })) : '',
(followers1.length) ? h('.relations', h('h4', 'followers you follow'), com.userHexagrid(followers1, { nrow: 4 })) : '',
(followers2.length) ? h('.relations', h('h4', 'followers you don\'t follow'), com.userHexagrid(followers2, { nrow: 4 })) : '',
(followeds.length) ? h('.relations', h('h4', name, ' is following'), com.userHexagrid(followeds, { nrow: 4 })) : ''
)
)
))
// handlers
function privateMessage (e) {
e.preventDefault()
subwindows.pm({ recipients: [pid] })
}
function renameModal (e) {
e.preventDefault()
modals.setName(pid)
}
function toggleFollow (e) {
e.preventDefault()
if (isSelf)
return
ui.pleaseWait(true, 500)
if (isFollowing)
app.ssb.publish(schemas.unfollow(pid), done)
else
app.ssb.publish(schemas.follow(pid), done)
function done (err) {
ui.pleaseWait(false)
if (err) modals.error('Error While Publishing', err, 'This error occured while trying to un/follow somebody on their profile page.')
else ui.refreshPage()
}
}
function flagModal (e) {
e.preventDefault()
if (isSelf)
return
if (!hasFlagged)
modals.flag(pid)
else {
var done = multicb()
app.ssb.publish(schemas.unblock(pid), done())
app.ssb.publish(schemas.unflag(pid), done())
done(function (err) {
if (err) modals.error('Error While Publishing', err, 'This error occured while trying to un/flag somebody on their profile page.')
else ui.refreshPage()
})
}
}
}