135 lines
3.2 KiB
JavaScript
135 lines
3.2 KiB
JavaScript
|
'use strict'
|
||
|
|
||
|
/*
|
||
|
Application Master State
|
||
|
========================
|
||
|
Common state which either exists as part of the session,
|
||
|
or which has been loaded from scuttlebot during page
|
||
|
refresh because its commonly needed during rendering.
|
||
|
*/
|
||
|
|
||
|
var o = require('observable')
|
||
|
var multicb = require('multicb')
|
||
|
var SSBClient = require('./muxrpc-ipc')
|
||
|
var emojis = require('emoji-named-characters')
|
||
|
|
||
|
// master state object
|
||
|
var app =
|
||
|
module.exports = {
|
||
|
// sbot rpc connection
|
||
|
ssb: SSBClient(),
|
||
|
|
||
|
// pull state from sbot, called on every pageload
|
||
|
fetchLatestState: fetchLatestState,
|
||
|
|
||
|
// page params parsed from the url
|
||
|
page: {
|
||
|
id: 'home',
|
||
|
param: null,
|
||
|
qs: {}
|
||
|
},
|
||
|
|
||
|
// ui data
|
||
|
suggestOptions: {
|
||
|
':': Object.keys(emojis).map(function (emoji) {
|
||
|
return {
|
||
|
image: './img/emoji/' + emoji + '.png',
|
||
|
title: emoji,
|
||
|
subtitle: emoji,
|
||
|
value: emoji + ':'
|
||
|
}
|
||
|
}),
|
||
|
'@': []
|
||
|
},
|
||
|
homeMode: {
|
||
|
view: 'all',
|
||
|
live: true
|
||
|
},
|
||
|
filters: {
|
||
|
nsfw: true,
|
||
|
spam: true,
|
||
|
abuse: true
|
||
|
},
|
||
|
|
||
|
// application state, fetched every refresh
|
||
|
actionItems: {},
|
||
|
indexCounts: {},
|
||
|
user: {
|
||
|
id: null,
|
||
|
profile: {}
|
||
|
},
|
||
|
users: {
|
||
|
names: {},
|
||
|
profiles: {}
|
||
|
},
|
||
|
peers: [],
|
||
|
|
||
|
// global observables, updated by persistent events
|
||
|
observ: {
|
||
|
sideview: o(true),
|
||
|
peers: o([]),
|
||
|
hasSyncIssue: o(false),
|
||
|
newPosts: o(0),
|
||
|
indexCounts: {
|
||
|
inbox: o(0),
|
||
|
votes: o(0),
|
||
|
follows: o(0),
|
||
|
inboxUnread: o(0),
|
||
|
votesUnread: o(0),
|
||
|
followsUnread: o(0)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var firstFetch = true
|
||
|
function fetchLatestState (cb) {
|
||
|
var done = multicb({ pluck: 1 })
|
||
|
app.ssb.whoami(done())
|
||
|
app.ssb.patchwork.getNamesById(done())
|
||
|
app.ssb.patchwork.getAllProfiles(done())
|
||
|
app.ssb.patchwork.getActionItems(done())
|
||
|
app.ssb.patchwork.getIndexCounts(done())
|
||
|
app.ssb.gossip.peers(done())
|
||
|
done(function (err, data) {
|
||
|
if (err) throw err.message
|
||
|
app.user.id = data[0].id
|
||
|
app.users.names = data[1]
|
||
|
app.users.profiles = data[2]
|
||
|
app.actionItems = data[3]
|
||
|
app.indexCounts = data[4]
|
||
|
app.peers = data[5]
|
||
|
app.user.profile = app.users.profiles[app.user.id]
|
||
|
|
||
|
// update observables
|
||
|
app.observ.peers(app.peers)
|
||
|
var stats = require('./util').getPubStats()
|
||
|
app.observ.hasSyncIssue(!stats.membersof || !stats.active)
|
||
|
for (var k in app.indexCounts)
|
||
|
if (app.observ.indexCounts[k])
|
||
|
app.observ.indexCounts[k](app.indexCounts[k])
|
||
|
|
||
|
// refresh suggest options for usernames
|
||
|
app.suggestOptions['@'] = []
|
||
|
for (var id in app.users.profiles) {
|
||
|
if (id == app.user.profile.id || (app.user.profile.assignedTo[id] && app.user.profile.assignedTo[id].following)) {
|
||
|
var name = app.users.names[id]
|
||
|
app.suggestOptions['@'].push({
|
||
|
id: id,
|
||
|
cls: 'user',
|
||
|
title: name || id,
|
||
|
image: require('./com').profilePicUrl(id),
|
||
|
subtitle: name || id,
|
||
|
value: name || id.slice(1) // if using id, dont include the @ sigil
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// do some first-load things
|
||
|
if (firstFetch) {
|
||
|
app.observ.newPosts(0) // trigger title render, so we get the correct name
|
||
|
firstFetch = false
|
||
|
}
|
||
|
|
||
|
cb()
|
||
|
})
|
||
|
}
|