var pull = require('pull-stream') var sbot = require('./scuttlebot') var hyperscroll = require('hyperscroll') var stream = require('hyperloadmore/stream') var h = require('hyperscript') var ref = require('ssb-ref') var next = require('pull-next-query') var render = require('./render').render var config = require('./config')() var human = require('human-time') var tools = require('./tools') var id = require('./keys').id var avatar = require('./avatar') var compose = require('./compose') var keyPage = function () { var screen = document.getElementById('screen') var importKey = h('textarea.import', {placeholder: 'Import a new public/private key', name: 'textarea', style: 'width: 97%; height: 100px;'}) var content = h('div.content', h('div.message#key', h('h1', 'Your Key'), h('p', {innerHTML: 'Your public/private key is:
' + localStorage[config.caps.shs + '/secret'] + '
'},
h('button.btn', {onclick: function (e){
localStorage[config.caps.shs +'/secret'] = ''
alert('Your public/private key has been deleted')
e.preventDefault()
location.hash = ""
location.reload()
}}, 'Delete Key')
),
h('hr'),
h('form',
importKey,
h('button.btn', {onclick: function (e){
if(importKey.value) {
localStorage[config.caps.shs + '/secret'] = importKey.value.replace(/\s+/g, ' ')
e.preventDefault()
alert('Your public/private key has been updated')
}
location.hash = ""
location.reload()
}}, 'Import key'),
)
)
)
screen.appendChild(hyperscroll(content))
}
function getMessage (src) {
var content = h('div.content')
var screen = document.getElementById('screen')
screen.appendChild(hyperscroll(content))
sbot.get(src, function (err, data) {
if (err) {
var message = h('div.message', 'Missing message!')
content.appendChild(message)
}
if (data) {
var message = {}
message.value = data
message.key = src
if (content.firstChild) {
content.insertBefore(render(message), content.firstChild)
} else {
content.appendChild(render(message))
}
}
})
}
function userStream (src) {
var screen = document.getElementById('screen')
var content = h('div.content')
screen.appendChild(hyperscroll(content))
function createStream (opts) {
return pull(
next(sbot.query, opts, ['value', 'timestamp']),
pull.map(function (msg) {
return render(msg)
})
)
}
pull(
createStream({
limit: 100,
reverse: true,
live: false,
query: [{$filter: { value: { author: src}}}]
}),
stream.bottom(content)
)
pull(
createStream({
limit: 100,
old: false,
live: true,
query: [{$filter: { value: {author: src}}}]
}),
stream.top(content)
)
var profile = h('div.content#profile', h('div.message', h('div.messageContent')))
if (screen.firstChild.firstChild) {
screen.firstChild.insertBefore(profile, screen.firstChild.firstChild)
} else {
screen.firstChild.appendChild(profile)
}
var name = avatar.name(src)
var editname = h('span',
avatar.name(src),
h('button.btn', 'New name', {
onclick: function () {
var nameput = h('input', {placeholder: name.textContent})
var nameedit =
h('span', nameput,
h('button.btn', 'Preview', {
onclick: function () {
if (nameput.value[0] != '@')
tobename = nameput.value
else
tobename = nameput.value.substring(1, 100)
var newname = h('span', h('a', {href: '#' + src}, '@' + tobename), h('button.btn', 'Publish', {
onclick: function () {
var donename = h('span', h('a', {href: '#' + src}, '@' + tobename))
sbot.publish({type: 'about', about: src, name: tobename})
localStorage[src + 'name'] = tobename
newname.parentNode.replaceChild(donename, newname)
}
}))
nameedit.parentNode.replaceChild(newname, nameedit)
}
})
)
editname.parentNode.replaceChild(nameedit, editname)
}
})
)
var editimage = h('span',
h('button.btn', 'New image', {
onclick: function () {
var upload =
h('span',
hyperfile.asDataURL(function (data) {
if(data) {
//img.src = data
var _data = dataurl.parse(data)
pull(
pull.once(_data.data),
sbot.addblob(function (err, hash) {
if(err) return alert(err.stack)
selected = {
link: hash,
size: _data.data.length,
type: _data.mimetype
}
})
)
}
}),
h('button.btn', 'Preview image', {
onclick: function() {
if (selected) {
console.log(selected)
var oldImage = document.getElementById('profileImage')
var newImage = h('span.avatar--medium', h('img', {src: config.blobsUrl + selected.link}))
var publish = h('button.btn', 'Publish image', {
onclick: function () {
sbot.publish({
type: 'about',
about: src,
image: selected
}, function (err, published) {
console.log(published)
})
}
})
upload.parentNode.replaceChild(publish, upload)
oldImage.parentNode.replaceChild(newImage, oldImage)
}
/*if(selected) {
api.message_confirm({
type: 'about',
about: id,
image: selected
})
} else { alert('select an image before hitting preview')}*/
}
})
)
editimage.parentNode.replaceChild(upload, editimage)
}
})
)
var avatars = h('div.avatars',
h('a', {href: '#' + src},
h('span.avatar--medium#profileImage', avatar.image(src)),
editname,
h('br'),
editimage
)
)
pull(
sbot.query({query: [{$filter: { value: { author: src}}}], limit: 1}),
pull.drain(function (msg) {
var howlong = h('span', h('br'), ' arrived ', human(new Date(msg.value.timestamp)))
avatars.appendChild(howlong)
avatars.appendChild(h('hr'))
})
)
var buttons = h('div.buttons')
profile.firstChild.firstChild.appendChild(avatars)
profile.firstChild.firstChild.appendChild(buttons)
var writeMessage = h('button.btn', 'Public message ', avatar.name(src), {
onclick: function () {
opts = {}
opts.type = 'post'
opts.mentions = '[' + name.textContent + '](' + src + ')'
var composer = h('div#composer', h('div.message', h('div.messageContent', compose(opts))))
profile.appendChild(composer)
}
})
var writePrivate = h('button.btn', 'Private message ', avatar.name(src), {
onclick: function () {
opts = {}
opts.type = 'post'
opts.mentions = '[' + name.textContent + '](' + src + ')'
opts.recps = [src, id]
var composer = h('div#composer', h('div.message', h('div.messageContent', compose(opts))))
profile.appendChild(composer)
}
})
buttons.appendChild(tools.follow(src))
buttons.appendChild(h('button.btn', 'Generate follows', {
onclick: function () {
profile.firstChild.firstChild.appendChild(tools.getFollowing(src))
profile.firstChild.firstChild.appendChild(tools.getFollowers(src))
}
}))
buttons.appendChild(h('button.btn', 'Generate blocks', {
onclick: function () {
profile.firstChild.firstChild.appendChild(tools.getBlocks(src))
profile.firstChild.firstChild.appendChild(tools.getBlocked(src))
}
}))
buttons.appendChild(h('hr'))
buttons.appendChild(tools.mute(src))
buttons.appendChild(writeMessage)
buttons.appendChild(writePrivate)
buttons.appendChild(h('a', {href: '#wall/' + src}, h('button.btn', avatar.name(src), "'s wall")))
}
function mentionsStream (src) {
var screen = document.getElementById('screen')
var content = h('div.content')
screen.appendChild(hyperscroll(content))
function createStream (opts) {
return pull(
next(sbot.backlinks, opts, ['value', 'timestamp']),
pull.map(function (msg) {
return render(msg)
})
)
}
pull(
createStream({
limit: 100,
reverse: true,
index: 'DTA',
live: false,
query: [{$filter: {dest: src}}]
}),
stream.bottom(content)
)
pull(
createStream({
limit: 100,
old: false,
index: 'DTA',
live: true,
query: [{$filter: {dest: src}}]
}),
stream.top(content)
)
}
function everythingStream () {
var screen = document.getElementById('screen')
var content = h('div.content')
screen.appendChild(hyperscroll(content))
function createStream (opts) {
return pull(
next(sbot.query, opts, ['value', 'timestamp']),
pull.map(function (msg) {
if (msg.value) {
return render(msg)
}
})
)
}
pull(
createStream({
limit: 250,
reverse: true,
live: false,
query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
}),
stream.bottom(content)
)
pull(
createStream({
limit: 250,
old: false,
live: true,
query: [{$filter: { value: { timestamp: { $gt: 0 }}}}]
}),
stream.top(content)
)
}
module.exports = function () {
var src = window.location.hash.substring(1)
if (ref.isFeed(src)) {
userStream(src)
} else if (ref.isMsg(src)) {
getMessage(src)
} else if ((src.substring(0, 5) == 'wall/') && (ref.isFeed(src.substring(5)))) {
mentionsStream(src.substring(5))
} else if (ref.isMsg(src)) {
messageStream()
} else if (src == 'key') {
keyPage()
} else {
everythingStream()
}
}