sbot/ui/main.js

143 lines
4.0 KiB
JavaScript

'use strict'
var pull = require('pull-stream')
var ui = require('./lib/ui')
var modals = require('./lib/ui/modals')
// Init
// ====
// master state object
window.app = require('./lib/app')
// toplevel events
window.addEventListener('hashchange', ui.refreshPage)
window.addEventListener('contextmenu', ui.contextMenu)
window.addEventListener('error', onError)
document.body.addEventListener('click', onClick)
document.body.addEventListener('mouseover', onHover)
pull(app.ssb.patchwork.createEventStream(), pull.drain(onIndexEvent))
pull(app.ssb.blobs.changes(), pull.drain(onBlobDownloaded))
pull(app.ssb.gossip.changes(), pull.drain(onGossipEvent))
pull(app.ssb.replicate.changes(), pull.drain(onReplicationEvent))
app.observ.newPosts(onNewPost)
// render
ui.refreshPage(null, ui.pleaseWait.bind(ui, false))
// Handlers
// ========
function onError (e) {
e.preventDefault()
console.error(e.error)
modals.error('Unexpected Error', e.error, 'This was an unhandled exception.')
}
// look for link clicks which should trigger same-page refreshes
function onClick (e) {
var el = e.target
while (el) {
if (el.tagName == 'A' && el.origin == window.location.origin && el.hash && el.hash == window.location.hash) {
e.preventDefault()
e.stopPropagation()
ui.refreshPage()
return
}
el = el.parentNode
}
}
function onHover (e) {
var el = e.target
while (el) {
if (el.tagName == 'A') {
if (el.getAttribute('title')) {
ui.setStatus(el.getAttribute('title'))
} else if (el.href) {
var i = el.href.indexOf('#')
if (i > 0)
ui.setStatus(el.href.slice(i+1))
else
ui.setStatus(el.href)
}
return
}
el = el.parentNode
}
ui.setStatus(false)
}
// update UI to reflect index changes
function onIndexEvent (event) {
console.log('onIndexEvent', event)
if (event.type == 'home-add')
app.observ.newPosts(1 + app.observ.newPosts())
if (event.type == 'index-change') {
app.indexCounts[event.index] = event.total
app.indexCounts[event.index+'Unread'] = event.unread
app.observ.indexCounts[event.index](event.total)
app.observ.indexCounts[event.index+'Unread'](event.unread)
}
}
// render blobs as they come in
function onBlobDownloaded (hash) {
// hash downloaded, update any images
var els = document.querySelectorAll('img[src^="http://localhost:7777/'+hash+'"]')
for (var i=0; i < els.length; i++)
els[i].src = 'http://localhost:7777/'+hash
var els = document.querySelectorAll('video[src^="http://localhost:7777/'+hash+'"]')
for (var i=0; i < els.length; i++)
els[i].src = 'http://localhost:7777/'+hash
var els = document.querySelectorAll('[data-bg^="http://localhost:7777/'+hash+'"]')
for (var i=0; i < els.length; i++)
els[i].style.backgroundImage = 'url(http://localhost:7777/'+hash+')'
}
function onGossipEvent (e) {
console.log(e)
// update the peers
var i
for (i=0; i < app.peers.length; i++) {
if (app.peers[i].key == e.peer.key && app.peers[i].host == e.peer.host && app.peers[i].port == e.peer.port) {
app.peers[i] = e.peer
break
}
}
if (i == app.peers.length)
app.peers.push(e.peer)
var stats = require('./lib/util').getPubStats()
// update observables
app.observ.peers(app.peers)
app.observ.hasSyncIssue(!stats.membersof || !stats.active)
}
function onReplicationEvent (e) {
console.log(e)
// update the peers
var progress = { feeds: e.feeds, sync: e.sync, current: e.progress, total: e.total }
var i
for (i=0; i < app.peers.length; i++) {
if (app.peers[i].key == e.peerid) {
app.peers[i].progress = progress
break
}
}
// update observables
if (i !== app.peers.length)
app.observ.peers(app.peers)
}
// update title to show when new messages are available
function onNewPost (n) {
n = (n<0)?0:n
var name = app.users.names[app.user.id] || 'New Account'
if (n) {
document.title = '-=[ ('+n+') Patchwork : '+name+' ]=-'
} else {
document.title = '-=[ Patchwork : '+name+' ]=-'
}
}