sbot/ui/lib/com/nav.js

171 lines
6.6 KiB
JavaScript

var h = require('hyperscript')
var o = require('observable')
var ssbref = require('ssb-ref')
var com = require('./index')
var ui = require('../ui')
var modals = require('../ui/modals')
var subwindows = require('../ui/subwindows')
var app = require('../app')
var u = require('../util')
function addressbar () {
// markup
var addressInput = h('input', { value: '', onfocus: onfocus, onkeyup: onkeyup })
// handlers
function onfocus (e) {
setTimeout(function () { // shameless setTimeout to wait for default behavior (preventDefault doesnt seem to stop it)
addressInput.select() // select all on focus
}, 50)
}
function onkeyup (e) {
var v = addressInput.value
if (e.keyCode == 13 && v) {
if (v.charAt(0) == '@' && v.indexOf('.ed25519') !== -1)
window.location.hash = '#/profile/'+v
else if (v.charAt(0) == '&')
window.location.hash = '#/webview/'+v
else if (v.charAt(0) == '%')
window.location.hash = '#/msg/'+v
else
window.location.hash = '#/search/'+v
}
}
return [
addressInput,
h('.address-icon', com.icon('search'))
]
}
exports.pagenav = function () {
// markup
// dropdowns
function onmenuclick (e) {
e.preventDefault()
e.stopPropagation()
// toggle warning sign on network sync
var syncWarningIcon
if (app.observ.hasSyncIssue())
syncWarningIcon = com.icon('warning-sign.text-danger')
ui.dropdown(this, [
h('a.item', { onclick: subwindows.pm, title: 'Compose an encrypted message' }, com.icon('lock'), ' Secret Message'),
h('a.item', { href: '#/inbox', title: 'Your inbox' }, com.icon('inbox'), ' Inbox (', app.observ.indexCounts.inboxUnread, ')'),
h('a.item', { href: '#/profile/'+app.user.id, title: 'View your site' }, com.icon('user'), ' Your Profile'),
h('hr'),
h('a.item', { href: '#/sync', title: 'Review the status of your network connections' }, com.icon('circle-arrow-down'), ' Network Sync ', syncWarningIcon),
h('a.item', { onclick: modals.invite, title: 'Connect to a public node using an invite code' }, com.icon('cloud'), ' Join a Public Node'),
h('hr'),
h('a.item', { href: '#/feed', title: 'View the raw data feed' }, com.icon('th-list'), ' Behind the Scenes'),
h('a.item.noicon', { href: 'https://github.com/ssbc/patchwork/issues/new', target: '_blank', title: 'File a suggestion or issue' }, com.icon('bullhorn'), ' File an Issue')
], { right: true, offsetY: 5 })
}
function onsideview () {
app.observ.sideview(!app.observ.sideview())
}
var sideviewBtn = o.transform(app.observ.sideview, function (b) {
var enabled = (app.page.id == 'profile' && ssbref.isFeedId(app.page.param))
return h('a.button'+(enabled?'':'.disabled'),
{ onclick: ((enabled) ? onsideview : null), title: 'Toggle the about panel' },
com.icon(b&&enabled ? 'collapse-down' : 'collapse-up')
)
})
// toggle warning sign on network sync
var networkSync = o.transform(app.observ.hasSyncIssue, function (b) {
if (b)
return h('a.button', { href: '#/sync', title: 'Warning! You are not online' }, com.icon('warning-sign.text-danger'))
return h('a.button', { href: '#/sync', title: 'Review the status of your network connections' }, com.icon('circle-arrow-down'))
})
// render nav
return h('.page-nav-inner',
h('a.button.home', { href: '#/', title: 'Home page launcher' }, com.icon('home')),
h('a.button', { onclick: ui.navBack, title: 'Go back' }, com.icon('arrow-left')),
h('a.button', { onclick: ui.navForward, title: 'Go forward' }, com.icon('arrow-right')),
h('a.button', { onclick: ui.navRefresh, title: 'Refresh this page' }, com.icon('refresh')),
addressbar(),
// sideviewBtn,
networkSync,
h('a.button', { onclick: onmenuclick }, com.icon('menu-hamburger'))
)
function item (id, path, label, extra_cls) {
var selected = (id == app.page.id) ? '.selected' : ''
return h('a.pagenav-'+id+(extra_cls||'')+selected, { href: '#/'+path }, label)
}
}
exports.sidenav = function (opts) {
function onviewclick (view) {
return function (e) {
e.preventDefault()
app.homeMode.view = view
ui.refreshPage()
}
}
function view (view, label) {
if (app.homeMode.view == view)
return h('li.view', h('strong', h('a', { href: '#', onclick: onviewclick(view) }, label)))
return h('li.view', h('a', { href: '#', onclick: onviewclick(view) }, label))
}
function onoptionsclick (e) {
e.preventDefault()
e.stopPropagation()
function label(b, l) {
return [com.icon(b ? 'check' : 'unchecked'), l]
}
ui.dropdown(e.target, [
{ value: 'live', label: label(app.homeMode.live, ' Livestream'), title: 'Show new updates to the feed in realtime' },
{ value: 'nsfw', label: label(app.filters.nsfw, ' NSFW Filter'), title: 'Show/hide posts flagged as NSFW by people you follow' },
{ value: 'spam', label: label(app.filters.spam, ' Spam Filter'), title: 'Show/hide posts flagged as Spam by people you follow' },
{ value: 'abuse', label: label(app.filters.abuse, ' Abuse Filter'), title: 'Show/hide posts flagged as Abuse by people you follow' }
], function (choice) {
if (choice == 'live') {
app.homeMode.live = !app.homeMode.live
ui.refreshPage()
} else {
var hide = !app.filters[choice]
app.filters[choice] = hide
if (!hide)
document.querySelector('.message-feed').classList.add('show-'+choice)
else
document.querySelector('.message-feed').classList.remove('show-'+choice)
}
})
}
return h('ul.list-unstyled.sidenav',
h('li', h('h4', 'feed ', h('a', { href: '#', onclick: onoptionsclick, title: 'Options for this feed view', style: 'font-size: 12px; color: gray;' }, 'options'))),
view('all', ['all', h('small', ' users on your network')]),
view('friends', ['friends', h('small', ' that you have followed')]),
o.transform(app.observ.peers, function (peers) {
// :HACK: hyperscript needs us to return an Element if it's going to render
// we really shouldnt be returning a div here, but it does render correctly
// would be better to update hyperscript to correctly handle an array
return h('div', peers
.sort(function (a, b) {
if (!a.announcers) return -1
if (!b.announcers) return 1
return (a.announcers.length - b.announcers.length)
})
.map(function (peer) {
if (!peer.time || !peer.time.connect) return
return view(peer.key, [peer.host, h('small', ' members')])
})
.filter(Boolean)
)
}),
h('li', h('br')),
h('li', h('h4', 'follows and flags'))
)
}