diff options
Diffstat (limited to 'app.js')
-rw-r--r-- | app.js | 451 |
1 files changed, 237 insertions, 214 deletions
@@ -1,18 +1,39 @@ - - - var screen = h('div', {id: 'screen'}) document.body.appendChild(screen) -var keys = getKeys() +localforage.getItem('id', function (err, value) { + // the navbar has a dual purpose of generating a key if you don't already have one -var navbar = h('div', {classList: 'navbar'}, [ - h('div', {classList: 'internal'}, [ - h('li', [h('a', {href: '/'}, ['Home'])]), - h('li', [h('a', {href: '#' + keys.publicKey}, [getName(keys.publicKey)])]), - h('li', [h('a', {href: '/#key'}, ['Key'])]) - ]) -]) + if (value) { + var keys = value + var navbar = h('div', {classList: 'navbar'}, [ + h('div', {classList: 'internal'}, [ + h('li', [h('a', {href: '/'}, ['Home'])]), + h('li', [h('a', {href: '#' + keys.publicKey}, [getName(keys.publicKey)])]), + h('li', [h('a', {href: '/#key'}, ['Key'])]) + ]) + ]) + document.body.appendChild(navbar) + } else if (value == null) { + var genkey = nacl.sign.keyPair() + if (genkey) { + var keys = { + publicKey: '@' + nacl.util.encodeBase64(genkey.publicKey), + privateKey: nacl.util.encodeBase64(genkey.secretKey) + } + // when we get our next round of funding, let's figure out how to do this without a page reload + if (keys.publicKey.includes('/')) { + console.log('TRYING AGAIN') + setTimeout(function () { + window.location.reload() + }, 10) + } else { + localforage.setItem('id', keys) + window.location.reload() + } + } + } +}) if (!localStorage['subscribees']) { var subscribees = ['@218Fd2bCrmXe4gwnMg5Gcb9qVZrjXquym2AlelbkBro='] @@ -24,262 +45,264 @@ if (!localStorage['pubs']) { localStorage['pubs'] = JSON.stringify(pubs) } -document.body.appendChild(navbar) - function compose (keys, opts) { - var header = h('div', {classList: 'message'}) - var scroller = document.getElementById('scroller') - - scroller.insertBefore(header, scroller.firstChild) + localforage.getItem('id', function (err, keys) { + if (keys) { + var header = h('div', {classList: 'message'}) + var scroller = document.getElementById('scroller') + + scroller.insertBefore(header, scroller.firstChild) - var textarea = h('textarea', {placeholder: 'Write a new bog post'}) - - header.appendChild(textarea) - - var composer = h('div', [ - h('button', { - onclick: function () { - if (textarea.value) { - var content = { - author: keys.publicKey, - type: 'post', - text: textarea.value, - timestamp: Date.now() + var textarea = h('textarea', {placeholder: 'Write a new bog post'}) + + header.appendChild(textarea) + + var composer = h('div', [ + h('button', { + onclick: function () { + if (textarea.value) { + var content = { + author: keys.publicKey, + type: 'post', + text: textarea.value, + timestamp: Date.now() + } + textarea.value = '' + publish(content, keys) + } } - textarea.value = '' - publish(content, keys) - } - } - }, ['Publish']) - ]) - - header.appendChild(composer) + }, ['Publish']) + ]) + header.appendChild(composer) + } + }) } function route () { - src = window.location.hash.substring(1) - var scroller = h('div', {id: 'scroller'}) - var screen = document.getElementById('screen') + localforage.getItem('id', function (err, keys) { + src = window.location.hash.substring(1) + var scroller = h('div', {id: 'scroller'}) + var screen = document.getElementById('screen') - screen.appendChild(scroller) - if (src === 'key') { - var keyMessage = h('div', {classList: 'message'}) + screen.appendChild(scroller) - keyMessage.appendChild(h('p', {innerHTML: marked('This is your ed25519 public/private keypair. It was generated using [Tweetnacl.js](https://tweetnacl.js.org/#/). Your public key is your identiy when using [Bogbook](http://bogbook.com/), save your key in a safe place so that you can continue to use the same identity.')})) + if (src === 'key') { + var keyMessage = h('div', {classList: 'message'}) - // print stringified keypair - keyMessage.appendChild(h('pre', {style: 'width: 80%'}, [h('code', [JSON.stringify(keys)])])) + keyMessage.appendChild(h('p', {innerHTML: marked('This is your ed25519 public/private keypair. It was generated using [Tweetnacl.js](https://tweetnacl.js.org/#/). Your public key is your identiy when using [Bogbook](http://bogbook.com/), save your key in a safe place so that you can continue to use the same identity.')})) - // delete key button - keyMessage.appendChild(h('button', { - onclick: function () { - localStorage['id'] = '' - location.reload() - } - }, ['Delete Key'])) - - var textarea = h('textarea', {placeholder: 'Import your existing ed25519 keypair'}) - keyMessage.appendChild(textarea) - keyMessage.appendChild(h('button', { - onclick: function () { - if (textarea.value) { - localStorage['id'] = textarea.value - location.reload() + // print stringified keypair + keyMessage.appendChild(h('pre', {style: 'width: 80%'}, [h('code', [JSON.stringify(keys)])])) + + // delete key button + keyMessage.appendChild(h('button', { + onclick: function () { + localStorage['id'] = '' + location.reload() } - } - }, ['Import Key'])) + }, ['Delete Key'])) - scroller.appendChild(keyMessage) + var textarea = h('textarea', {placeholder: 'Import your existing ed25519 keypair'}) + keyMessage.appendChild(textarea) + keyMessage.appendChild(h('button', { + onclick: function () { + if (textarea.value) { + localStorage['id'] = textarea.value + location.reload() + } + } + }, ['Import Key'])) - var pubMessage = h('div', {classList: 'message'}) + scroller.appendChild(keyMessage) - var newPub = h('input', {placeholder: 'Add a new pub. Ex: ws://bogbook.com/'}) + var pubMessage = h('div', {classList: 'message'}) - var pubs = JSON.parse(localStorage['pubs']) + var newPub = h('input', {placeholder: 'Add a new pub. Ex: ws://bogbook.com/'}) - pubMessage.appendChild(h('div', [ - h('p', {innerHTML: marked('These are your bogbook pubs. These servers will sync data when you publish a new post, when you subscribe to new feeds, and when you click on feed ids.')}), - newPub, - h('button', { - onclick: function () { - if (newPub.value) { - pubs.push(newPub.value) - localStorage['pubs'] = JSON.stringify(pubs) - location.reload() + var pubs = JSON.parse(localStorage['pubs']) + + pubMessage.appendChild(h('div', [ + h('p', {innerHTML: marked('These are your bogbook pubs. These servers will sync data when you publish a new post, when you subscribe to new feeds, and when you click on feed ids.')}), + newPub, + h('button', { + onclick: function () { + if (newPub.value) { + pubs.push(newPub.value) + localStorage['pubs'] = JSON.stringify(pubs) + location.reload() + } } - } - }, ['Add Pub']) - ])) - - function removeButton (pubName) { - var button = h('button', { - onclick: function () { - console.log('removing' + pubName) - for (var i = pubs.length; i--;) { - if (pubs[i] === pubName) { - pubs.splice(i, 1); - localStorage['pubs'] = JSON.stringify(pubs) - window.location.reload() + }, ['Add Pub']) + ])) + + function removeButton (pubName) { + var button = h('button', { + onclick: function () { + console.log('removing' + pubName) + for (var i = pubs.length; i--;) { + if (pubs[i] === pubName) { + pubs.splice(i, 1); + localStorage['pubs'] = JSON.stringify(pubs) + window.location.reload() + } } } - } - }, ['Remove Pub']) - return button + }, ['Remove Pub']) + return button + } + + for (i = 0; i < pubs.length; i++) { + var pubName = pubs[i] + pubMessage.appendChild(h('p', [ + pubName, + removeButton(pubName) + ])) + } + + scroller.appendChild(pubMessage) } - for (i = 0; i < pubs.length; i++) { - var pubName = pubs[i] - pubMessage.appendChild(h('p', [ - pubName, - removeButton(pubName) - ])) - } - scroller.appendChild(pubMessage) - } + else if (src[0] === '@') { + var profile = h('div', {classList: 'message'}) + scroller.appendChild(profile) + if (src == keys.publicKey) { + var nameInput = h('input', {placeholder: 'Publish a new name'}) - else if (src[0] === '@') { - var profile = h('div', {classList: 'message'}) - scroller.appendChild(profile) + var namePublisher = h('div',[ + nameInput, + h('button', { + onclick: function () { + if (nameInput.value) { - if (src == keys.publicKey) { - var nameInput = h('input', {placeholder: 'Publish a new name'}) + var content = { + author: keys.publicKey, + type: 'name', + text: nameInput.value, + timestamp: Date.now() + } - var namePublisher = h('div',[ - nameInput, - h('button', { - onclick: function () { - if (nameInput.value) { + publish(content, keys) + } + } + }, ['Publish']) + ]) + profile.appendChild(namePublisher) + + readFile() + + var imageInput = h('span', [ + h('input', {id: 'inp', type:'file'}), + h('span', {id: 'b64'}), + h('img', {id: 'img'}) + ]) + + var imagePublisher = h('div', [ + imageInput, + h('button', { + onclick: function () { var content = { author: keys.publicKey, - type: 'name', - text: nameInput.value, + type: 'image', + image: document.getElementById("img").src, timestamp: Date.now() } publish(content, keys) } - } - }, ['Publish']) - ]) - - profile.appendChild(namePublisher) + }, ['Publish']) + ]) + + profile.appendChild(imagePublisher) + + document.getElementById("inp").addEventListener("change", readFile); + + } else { + var subscribees = JSON.parse(localStorage['subscribees']) + if (subscribees.includes(src)) { + profile.appendChild(h('button', { + onclick: function () { + for (var i = subscribees.length; i--;) { + if (subscribees[i] === src) { + subscribees.splice(i, 1); + localStorage['subscribees'] = JSON.stringify(subscribees) + window.location.reload() + } + } + } + // remove subscribee + }, ['UNSUBSCRIBE'])) + } else { + profile.appendChild(h('button', { + onclick: function () { + subscribees.push(src) + localStorage['subscribees'] = JSON.stringify(subscribees) + window.location.reload() + } + }, ['SUBSCRIBE'])) + } + } - readFile() + var pubs = JSON.parse(localStorage['pubs']) - var imageInput = h('span', [ - h('input', {id: 'inp', type:'file'}), - h('span', {id: 'b64'}), - h('img', {id: 'img'}) - ]) + for (i = 0; i < pubs.length; i++) { + requestFeed(src, pubs[i]) + } + + localforage.getItem(src, function (err, log) { + if (log) { + for (var i=0; i < log.length; i++) { + var post = log[i] + scroller.appendChild(renderMessage(post)) + } + } + }) + } - var imagePublisher = h('div', [ - imageInput, - h('button', { - onclick: function () { - var content = { - author: keys.publicKey, - type: 'image', - image: document.getElementById("img").src, - timestamp: Date.now() - } + else if (src[0] === '%') { - publish(content, keys) + localforage.getItem('log', function (err, log) { + for (var i = log.length - 1; i >= 0; --i) { + if (log[i].key === src) { + var post = log[i] + scroller.appendChild(renderMessage(post)) } - }, ['Publish']) - ]) - - profile.appendChild(imagePublisher) + } + }) + } - document.getElementById("inp").addEventListener("change", readFile); + else { + compose(keys) - } else { var subscribees = JSON.parse(localStorage['subscribees']) - if (subscribees.includes(src)) { - profile.appendChild(h('button', { - onclick: function () { - for (var i = subscribees.length; i--;) { - if (subscribees[i] === src) { - subscribees.splice(i, 1); - localStorage['subscribees'] = JSON.stringify(subscribees) - window.location.reload() - } - } - } - // remove subscribee - }, ['UNSUBSCRIBE'])) - } else { - profile.appendChild(h('button', { - onclick: function () { - subscribees.push(src) - localStorage['subscribees'] = JSON.stringify(subscribees) - window.location.reload() - } - }, ['SUBSCRIBE'])) - } - } - var pubs = JSON.parse(localStorage['pubs']) - - for (i = 0; i < pubs.length; i++) { - requestFeed(src, pubs[i]) - } - - if (localStorage[src]) { - var log = JSON.parse(localStorage[src]) - for (var i=0; i < log.length; i++) { - var post = log[i] - scroller.appendChild(renderMessage(post)) + console.log(subscribees) + for (i = 0; i < subscribees.length; i++) { + var pubs = JSON.parse(localStorage['pubs']) + for (n = 0; n < pubs.length; n++) { + requestFeed(subscribees[i], pubs[n]) + } } - } - } - else if (src[0] === '%') { - if (localStorage['log']) { - var log = JSON.parse(localStorage['log']) - console.log(log.length) - for (var i = log.length - 1; i >= 0; --i) { - if (log[i].key === src) { + localforage.getItem('log', function (err, log) { + for (var i=0; i < log.length; i++) { var post = log[i] scroller.appendChild(renderMessage(post)) } - } - } - } - - else { - compose(keys) - - var subscribees = JSON.parse(localStorage['subscribees']) - - console.log(subscribees) - for (i = 0; i < subscribees.length; i++) { - var pubs = JSON.parse(localStorage['pubs']) - for (n = 0; n < pubs.length; n++) { - requestFeed(subscribees[i], pubs[n]) - } - } - - if (localStorage['log']) { - var log = JSON.parse(localStorage['log']) - for (var i=0; i < log.length; i++) { - var post = log[i] - scroller.appendChild(renderMessage(post)) - } - // sort log by timestamp and save over -- I don't know how expensive this is, we probably don't want to do this every single time we load the log? - var newLog = log.sort(function (a, b) { - return b.content.timestamp - a.content.timestamp + var newLog = log.sort(function (a, b) { + return b.content.timestamp - a.content.timestamp + }) + if (newLog) { + localforage.setItem('log', log) + } }) - if (newLog) { - localStorage['log'] = JSON.stringify(newLog) - } } - } + }) } |