138 lines
3.9 KiB
JavaScript
138 lines
3.9 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) {
|
|
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) {
|
|
// 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.hasSyncIssue)
|
|
}
|
|
|
|
function onReplicationEvent (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+' ]=-'
|
|
}
|
|
} |