git ssb

0+

ev / 0qc



Tree: d6b80ccf3b7cdf17831fe84ad7e1811bd6a6cbd5

Files: d6b80ccf3b7cdf17831fe84ad7e1811bd6a6cbd5 / compose.js

6367 bytesRaw
1var h = require('hyperscript')
2var pull = require('pull-stream')
3var sbot = require('./scuttlebot')
4var human = require('human-time')
5var id = require('./keys').id
6var mentions = require('ssb-mentions')
7
8var avatar = require('./avatar')
9var tools = require('./tools')
10
11var mime = require('simple-mime')('application/octect-stream')
12var split = require('split-buffer')
13
14var route = require('./views')
15
16function file_input (onAdded) {
17 return h('label.btn', 'Upload file',
18 h('input', { type: 'file', hidden: true,
19 onchange: function (ev) {
20 var file = ev.target.files[0]
21 if (!file) return
22 var reader = new FileReader()
23 reader.onload = function () {
24 pull(
25 pull.values(split(new Buffer(reader.result), 64*1024)),
26 sbot.addblob(function (err, blob) {
27 if(err) return console.error(err)
28 onAdded({
29 link: blob,
30 name: file.name,
31 size: reader.result.length || reader.result.byteLength,
32 type: mime(file.name)
33 })
34 })
35 )
36 }
37 reader.readAsArrayBuffer(file)
38 }
39 }))
40}
41
42module.exports = function (opts, fallback) {
43 var files = []
44 var filesById = {}
45
46 var composer = h('div.composer')
47 var container = h('div.container')
48
49 if (opts.boostAuthor) {
50 var boostName = avatar.cachedName(opts.boostAuthor)
51 }
52
53 if (opts.boostContent) {
54 var textarea = h('textarea.compose')
55 var str = opts.boostContent
56 var lines = str.split("\n")
57 for(var i=0; i<lines.length; i++) {
58 lines[i] = "> " + lines[i]
59 }
60 var newContent = lines.join("\n")
61 var content = 'Boosting: ' + opts.boostKey + '\n\n' + newContent + ' - [' + boostName.textContent + ']('+ opts.boostAuthor + ')'
62 textarea.value = content
63 }
64
65 else if (opts.mentions) {
66 var textarea = h('textarea.compose', opts.mentions)
67 }
68
69 else if (opts.type == 'post') {
70 var textarea = h('textarea.compose', {placeholder: opts.placeholder || 'Write a message (only you can edit)'})
71 } else {
72 var textarea = h('textarea.compose', {placeholder: opts.placeholder || 'Write a message'}, fallback.messageText)
73 }
74
75 var cancelBtn = h('button.btn', 'Cancel', {
76 onclick: function () {
77 var cancel
78 console.log(opts)
79
80 if (opts.type == 'edit') {
81 cancel = document.getElementById('edit:' + opts.branch.substring(0,44))
82 var oldMessage = h('div.message__body', tools.markdown(fallback.messageText))
83 cancel.parentNode.replaceChild(oldMessage, cancel)
84 oldMessage.parentNode.appendChild(fallback.buttons)
85 } else if (opts.branch) {
86 //cancel reply composer
87 cancel = document.getElementById('re:' + opts.branch.substring(0,44))
88 cancel.removeChild(cancel.firstChild)
89 message = document.getElementById(opts.branch.substring(0,44))
90 message.firstChild.appendChild(fallback.buttons)
91 } else {
92 // cancel generic composer
93 cancel = document.getElementById('composer')
94 cancel.parentNode.removeChild(cancel)
95 }
96 }
97
98 })
99
100 var initialButtons = h('span',
101 h('button.btn', 'Preview', {
102 onclick: function () {
103 if (textarea.value) {
104 var msg = {}
105
106 msg.value = {
107 "author": id,
108 "content": opts
109 }
110
111 msg.value.content.text = textarea.value
112 msg.value.content.mentions = mentions(textarea.value).map(
113 function (mention) {
114 var file = filesById[mention.link]
115 if (file) {
116 if (file.type) mention.type = file.type
117 if (file.size) mention.size = file.size
118 }
119 return mention
120 }
121 )
122
123 if (opts.recps)
124 msg.value.private = true
125
126 console.log(msg)
127 if (opts.type == 'post')
128 var header = tools.header(msg)
129 if (opts.root)
130 var rootMsg = h('span', 're: ', tools.messageLink(opts.root))
131 if (opts.type == 'update')
132 var header = tools.timestamp(msg, {edited: true})
133 var preview = h('div',
134 header,
135 rootMsg,
136 h('div.message__content', tools.markdown(msg.value.content.text)),
137 h('button.btn', 'Publish', {
138 onclick: function () {
139 if (msg.value.content) {
140 sbot.publish(msg.value.content, function (err, msg) {
141 if(err) throw err
142 console.log('Published!', msg)
143 if (opts.type == 'edit') {
144 var message = document.getElementById(opts.branch.substring(0,44))
145 fallback.messageText = msg.value.content.text
146 var editBody = h('div.messageContent',
147 tools.timestamp(msg, {edited: true}),
148 h('div', tools.markdown(msg.value.content.text))
149 )
150
151 message.replaceChild(editBody, message.firstChild.childNodes[message.childNodes.length - 1])
152 editBody.parentNode.appendChild(fallback.buttons)
153 } else {
154 if (opts.branch)
155 cancel = document.getElementById('re:' + opts.branch.substring(0,44))
156 else
157 cancel = document.getElementById('composer')
158 cancel.parentNode.removeChild(cancel)
159 }
160 })
161 }
162 }
163 }),
164 h('button.btn', 'Cancel', {
165 onclick: function () {
166 composer.replaceChild(container, composer.firstChild)
167 container.appendChild(textarea)
168 container.appendChild(initialButtons)
169 }
170 })
171 )
172 composer.replaceChild(preview, composer.firstChild)
173 }
174 }
175 }),
176 file_input(function (file) {
177 files.push(file)
178 filesById[file.link] = file
179 var embed = file.type.indexOf('image/') === 0 ? '!' : ''
180 textarea.value += embed + '['+file.name+']('+file.link+')'
181 }),
182 cancelBtn
183 )
184
185 composer.appendChild(container)
186 container.appendChild(textarea)
187 container.appendChild(initialButtons)
188
189 return composer
190}
191
192

Built with git-ssb-web