Commit 46a1ae94efd979ea889ed8c809555d8d68af371f
add ability to compose messages and reply to posts
Ev Bogue committed on 4/29/2018, 7:52:26 PMParent: 7b050a701daa2eec7d77454ac88684a4addac641
Files changed
compose.js | changed |
index.js | changed |
render.js | changed |
rendertools.js | changed |
scuttlebot.js | changed |
views.js | changed |
compose.js | ||
---|---|---|
@@ -1,8 +1,11 @@ | ||
1 | 1 … | var h = require('hyperscript') |
2 | 2 … | var pull = require('pull-stream') |
3 | 3 … | var sbot = require('./scuttlebot') |
4 | 4 … | |
5 … | +var header = require('./rendertools').header | |
6 … | +var id = require('./keys').id | |
7 … | + | |
5 | 8 … | var mime = require('simple-mime')('application/octect-stream') |
6 | 9 … | var split = require('split-buffer') |
7 | 10 … | |
8 | 11 … | function file_input (onAdded) { |
@@ -33,20 +36,58 @@ | ||
33 | 36 … | |
34 | 37 … | module.exports = function (opts) { |
35 | 38 … | var files = [] |
36 | 39 … | var filesById = {} |
40 … | + | |
41 … | + var composer = h('div.composer') | |
42 … | + | |
43 … | + var container = h('div.container') | |
37 | 44 … | |
38 | - var textarea = h('textarea.compose', {placeholder: 'Reply to this post'}) | |
39 | - | |
40 | - var composer = h('div', | |
41 | - textarea, | |
42 | - h('button.btn', 'Preview'), | |
45 … | + var textarea = h('textarea.compose', {placeholder: 'Write a message' || opts.placeholder}) | |
46 … | + | |
47 … | + var initialButtons = h('span', | |
48 … | + h('button.btn', 'Preview', { | |
49 … | + onclick: function () { | |
50 … | + | |
51 … | + var msg = {} | |
52 … | + msg.value = { | |
53 … | + "author": id, | |
54 … | + "content": { | |
55 … | + "type": opts.type, | |
56 … | + "root": opts.root | |
57 … | + } | |
58 … | + } | |
59 … | + msg.value.content.text = textarea.value | |
60 … | + console.log(msg) | |
61 … | + | |
62 … | + var preview = h('div', | |
63 … | + header(msg), | |
64 … | + h('div.message__content', msg.value.content.text), | |
65 … | + h('button.btn', 'Publish', { | |
66 … | + onclick: function () { | |
67 … | + sbot.publish(msg.value.content, function (err, msg) { | |
68 … | + if(err) throw err | |
69 … | + console.log('Published!', msg) | |
70 … | + window.location.reload() | |
71 … | + if(cb) cb(err, msg) | |
72 … | + }) | |
73 … | + } | |
74 … | + }) | |
75 … | + ) | |
76 … | + composer.replaceChild(preview, composer.firstChild) | |
77 … | + } | |
78 … | + }), | |
43 | 79 … | file_input(function (file) { |
44 | 80 … | files.push(file) |
45 | 81 … | filesById[file.link] = file |
46 | 82 … | var embed = file.type.indexOf('image/') === 0 ? '!' : '' |
47 | 83 … | textarea.value += embed + '['+file.name+']('+file.link+')' |
48 | 84 … | }) |
49 | 85 … | ) |
86 … | + | |
87 … | + composer.appendChild(container) | |
88 … | + container.appendChild(textarea) | |
89 … | + container.appendChild(initialButtons) | |
90 … | + | |
50 | 91 … | return composer |
51 | 92 … | } |
52 | 93 … |
index.js | ||
---|---|---|
@@ -17,7 +17,9 @@ | ||
17 | 17 … | } else if (ref.isFeed(src)) { |
18 | 18 … | views.userstream(src) |
19 | 19 … | } else if (ref.isMsg(src)) { |
20 | 20 … | views.get(src) |
21 … | +} else if (src == 'compose') { | |
22 … | + views.compose() | |
21 | 23 … | } else { |
22 | 24 … | views.logstream() |
23 | 25 … | } |
render.js | ||
---|---|---|
@@ -7,15 +7,18 @@ | ||
7 | 7 … | |
8 | 8 … | var tools = require('./rendertools') |
9 | 9 … | |
10 | 10 … | module.exports = function (msg) { |
11 | - | |
11 … | + var opts = {} | |
12 … | + opts.root = null | |
12 | 13 … | var message = h('div.message') |
13 | 14 … | if (msg.value.content.type == 'post') { |
14 | 15 … | message.appendChild(tools.header(msg)) |
16 … | + opts.type = 'post' | |
15 | 17 … | if (msg.value.content.root) { |
16 | 18 … | message.appendChild(h('span', 're: ', tools.messageLink(msg.value.content.root))) |
17 | - } | |
19 … | + opts.root = msg.value.content.root | |
20 … | + } else { opts.root = msg.key} | |
18 | 21 … | message.appendChild(h('div.message__body', |
19 | 22 … | {innerHTML: markdown.block(msg.value.content.text, {toUrl: function (url, image) { |
20 | 23 … | if(url[0] == '%' || url[0] == '@') return '#' + url |
21 | 24 … | if(!image) return url |
@@ -25,9 +28,9 @@ | ||
25 | 28 … | ) |
26 | 29 … | ) |
27 | 30 … | message.appendChild(h('button.btn', 'Reply', { |
28 | 31 … | onclick: function () { |
29 | - var compose = composer() | |
32 … | + var compose = composer(opts) | |
30 | 33 … | message.replaceChild(compose, message.lastElementChild) |
31 | 34 … | } |
32 | 35 … | })) |
33 | 36 … | return message |
rendertools.js | ||
---|---|---|
@@ -2,9 +2,8 @@ | ||
2 | 2 … | var human = require('human-time') |
3 | 3 … | var avatar = require('./avatar') |
4 | 4 … | var ref = require('ssb-ref') |
5 | 5 … | |
6 | - | |
7 | 6 … | module.exports.header = function (msg) { |
8 | 7 … | return h('div.header', |
9 | 8 … | h('span.avatar', |
10 | 9 … | h('a', {href: '#' + msg.value.author}, |
scuttlebot.js | ||
---|---|---|
@@ -4,8 +4,10 @@ | ||
4 | 4 … | var reconnect = require('pull-reconnect') |
5 | 5 … | |
6 | 6 … | var config = require('./config')() |
7 | 7 … | var createClient = require('ssb-client') |
8 … | +var createFeed = require('ssb-feed') | |
9 … | + | |
8 | 10 … | var keys = require('./keys') |
9 | 11 … | |
10 | 12 … | var CACHE = {} |
11 | 13 … | |
@@ -31,8 +33,19 @@ | ||
31 | 33 … | notify() |
32 | 34 … | }) |
33 | 35 … | }) |
34 | 36 … | |
37 … | +var internal = { | |
38 … | + getLatest: rec.async(function (id, cb) { | |
39 … | + sbot.getLatest(id, cb) | |
40 … | + }), | |
41 … | + add: rec.async(function (msg, cb) { | |
42 … | + sbot.add(msg, cb) | |
43 … | + }) | |
44 … | +} | |
45 … | + | |
46 … | +var feed = createFeed(internal, keys, {remote: true}) | |
47 … | + | |
35 | 48 … | module.exports = { |
36 | 49 … | createLogStream: rec.source(function (opts) { |
37 | 50 … | return pull( |
38 | 51 … | sbot.createLogStream(opts), |
views.js | ||
---|---|---|
@@ -5,16 +5,21 @@ | ||
5 | 5 … | var stream = require('hyperloadmore/stream') |
6 | 6 … | var h = require('hyperscript') |
7 | 7 … | var render = require('./render') |
8 | 8 … | |
9 | -module.exports.logstream = function () { | |
10 | - var content = h('div.content') | |
9 … | +var compose = require('./compose') | |
11 | 10 … | |
11 … | +var content = h('div.content') | |
12 … | +function screen () { | |
12 | 13 … | document.body.appendChild(h('div.screen', |
13 | 14 … | {style: {position: 'absolute', top: '0px', bottom: '0px', left: '0px', right: '0px'}}, |
14 | 15 … | hyperscroll(content) |
15 | 16 … | )) |
17 … | +} | |
16 | 18 … | |
19 … | +module.exports.logstream = function () { | |
20 … | + screen() | |
21 … | + | |
17 | 22 … | function createStream (opts) { |
18 | 23 … | return pull( |
19 | 24 … | More(sbot.createLogStream, opts), |
20 | 25 … | pull.map(function (msg) { |
@@ -36,15 +41,10 @@ | ||
36 | 41 … | |
37 | 42 … | var rawJSON = require('patchapp-raw/json') |
38 | 43 … | |
39 | 44 … | module.exports.rawstream = function () { |
40 | - var content = h('div.content') | |
45 … | + screen() | |
41 | 46 … | |
42 | - document.body.appendChild(h('div.screen', | |
43 | - {style: {position: 'absolute', top: '0px', bottom: '0px', left: '0px', right: '0px'}}, | |
44 | - hyperscroll(content) | |
45 | - )) | |
46 | - | |
47 | 47 … | function createStream (opts) { |
48 | 48 … | return pull( |
49 | 49 … | More(sbot.createLogStream, opts), |
50 | 50 … | pull.filter(function (data) { |
@@ -67,15 +67,10 @@ | ||
67 | 67 … | ) |
68 | 68 … | } |
69 | 69 … | |
70 | 70 … | module.exports.userstream = function (src) { |
71 | - var content = h('div.content') | |
71 … | + screen() | |
72 | 72 … | |
73 | - document.body.appendChild(h('div.screen', | |
74 | - {style: {position: 'absolute', top: '0px', bottom: '0px', left: '0px', right: '0px'}}, | |
75 | - hyperscroll(content) | |
76 | - )) | |
77 | - | |
78 | 73 … | function createStream (opts) { |
79 | 74 … | return pull( |
80 | 75 … | More(sbot.userStream, opts, ['value', 'sequence']), |
81 | 76 … | pull.map(function (msg) { |
@@ -96,15 +91,10 @@ | ||
96 | 91 … | |
97 | 92 … | } |
98 | 93 … | |
99 | 94 … | module.exports.get = function (src) { |
100 | - var content = h('div.content') | |
95 … | + screen() | |
101 | 96 … | |
102 | - document.body.appendChild(h('div.screen', | |
103 | - {style: {position: 'absolute', top: '0px', bottom: '0px', left: '0px', right: '0px'}}, | |
104 | - hyperscroll(content) | |
105 | - )) | |
106 | - | |
107 | 97 … | sbot.get(src, function (err, data) { |
108 | 98 … | if (err) {console.log('could not find message') } |
109 | 99 … | data.value = data |
110 | 100 … | console.log(data) |
@@ -126,4 +116,10 @@ | ||
126 | 116 … | ) |
127 | 117 … | }) |
128 | 118 … | }) |
129 | 119 … | } |
120 … | + | |
121 … | +module.exports.compose = function () { | |
122 … | + screen() | |
123 … | + | |
124 … | + content.appendChild(h('div.message', compose)) | |
125 … | +} |
Built with git-ssb-web