sbot/ui/lib/pages/sync.js

114 lines
4.0 KiB
JavaScript

'use strict'
var h = require('hyperscript')
var o = require('observable')
var mlib = require('ssb-msgs')
var pull = require('pull-stream')
var multicb = require('multicb')
var app = require('../app')
var ui = require('../ui')
var modals = require('../ui/modals')
var com = require('../com')
var u = require('../util')
var social = require('../social-graph')
module.exports = function () {
// markup
var pubStatusEl = h('.pub-status')
var peersEl = h('.peers',
h('h3', 'Mesh Network', h('a.pull-right.btn.btn-3d.btn-sm', { onclick: addnode }, com.icon('plus'), ' Add Node...')),
o.transform(app.observ.peers, function (peers) {
return h('div', peers.map(renderPeer))
})
)
ui.setPage('sync', h('.layout-onecol',
h('.layout-main',
o.transform(app.observ.peers, function () {
var stats = u.getPubStats()
var danger1 = (stats.membersof === 0) ? '.text-danger' : ''
var danger2 = (stats.active === 0) ? '.text-danger' : ''
var warning
if (stats.membersof === 0)
warning = h('p', com.icon('warning-sign'), ' You need to join a pub if you want to communicate across the Internet!')
else if (stats.active === 0 && stats.untried === 0)
warning = h('p', com.icon('warning-sign'), ' None of your pubs are responding! Are you connected to the Internet?')
return h('.pub-status',
h('h3'+danger1, 'You\'re followed by ', stats.membersof,' public node', (stats.membersof==1?'':'s'), ' ', h('small'+danger2, stats.active, ' connected')),
warning,
h('p', h('a.btn.btn-3d', { href: '#', onclick: modals.invite }, com.icon('cloud'), ' Join a Public Node'))
)
}),
peersEl
)
))
function setprogress (el, p, label) {
el.querySelector('.progress-bar').style.width = p + '%'
el.querySelector('.progress-bar span').innerText = label
if (label)
el.querySelector('.progress-bar').style.minWidth = '12%'
else
el.querySelector('.progress-bar').style.minWidth = '2%'
}
function renderPeer (peer) {
function onsync (e) {
e.preventDefault()
app.ssb.gossip.connect({ host: peer.host, port: peer.port, key: peer.key }, function (){})
}
var lastConnect
if (peer.time) {
if (peer.time.connect > peer.time.attempt)
lastConnect = [h('span.text-success', com.icon('ok')), ' Synced '+(new Date(peer.time.connect).toLocaleString())]
else if (peer.time.attempt) {
lastConnect = [h('span.text-danger', com.icon('remove')), ' Attempted (but failed) to connect at '+(new Date(peer.time.attempt).toLocaleString())]
}
}
var el = h('.peer' + ((peer.connected)?'.connected':''), { 'data-id': peer.key },
com.userHexagon(peer.key, 80),
h('.details',
social.follows(peer.key, app.user.id) ? h('small.pull-right.label.label-success', 'Follows You') : '',
h('h3',
com.userName(peer.key),
' ',
((peer.connected) ?
h('a.btn.btn-3d.btn-xs.disabled', 'Syncing') :
h('a.btn.btn-3d.btn-xs', { href: '#', onclick: onsync }, 'Sync')),
' ',
h('br'), h('small', peer.host+':'+peer.port+':'+peer.key)
),
h('.progress', h('.progress-bar.progress-bar-striped.active', h('span'))),
h('p.last-connect', lastConnect)
)
)
if (peer.connected) {
if (!peer.progress)
setprogress(el, 0, ' Connecting... ')
else if (peer.progress.sync)
setprogress(el, 100, 'Live-streaming')
else
setprogress(el, Math.round(peer.progress.current / peer.progress.total * 100), 'Syncing...')
}
return el
}
// handlers
function addnode () {
modals.prompt('Nodes full address:', 'host:port@key', 'Connect', function (err, addr) {
app.ssb.gossip.connect(addr, function (err) {
if (err)
modals.error('Failed to Connect', err, 'Error occurred while trying to manually add a node to the network mesh.')
})
})
}
}