git ssb

0+

ev / 0qc



Tree: 34c6b405528c998bb419248c8bbfeaef62e071cb

Files: 34c6b405528c998bb419248c8bbfeaef62e071cb / compose.js

6326 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 if (opts.type == 'post')
127 var header = tools.header(msg)
128 if (opts.root)
129 var rootMsg = h('span', 're: ', tools.messageLink(opts.root))
130 if (opts.type == 'update')
131 var header = tools.timestamp(msg, {edited: true})
132 var preview = h('div',
133 header,
134 rootMsg,
135 h('div.message__content', tools.markdown(msg.value.content.text)),
136 h('button.btn', 'Publish', {
137 onclick: function () {
138 if (msg.value.content) {
139 sbot.publish(msg.value.content, function (err, msg) {
140 if(err) throw err
141 console.log('Published!', msg)
142 if (opts.type == 'edit') {
143 var message = document.getElementById(opts.branch.substring(0,44))
144 fallback.messageText = msg.value.content.text
145 var editBody = h('div.message__body',
146 tools.timestamp(msg, {edited: true}),
147 h('div', tools.markdown(msg.value.content.text))
148 )
149
150 message.firstChild.replaceChild(editBody, message.firstChild.childNodes[message.childNodes.length - 1])
151 editBody.parentNode.appendChild(fallback.buttons)
152 } else {
153 if (opts.branch)
154 cancel = document.getElementById('re:' + opts.branch.substring(0,44))
155 else
156 cancel = document.getElementById('composer')
157 cancel.parentNode.removeChild(cancel)
158 }
159 })
160 }
161 }
162 }),
163 h('button.btn', 'Cancel', {
164 onclick: function () {
165 composer.replaceChild(container, composer.firstChild)
166 container.appendChild(textarea)
167 container.appendChild(initialButtons)
168 }
169 })
170 )
171 composer.replaceChild(preview, composer.firstChild)
172 }
173 }
174 }),
175 file_input(function (file) {
176 files.push(file)
177 filesById[file.link] = file
178 var embed = file.type.indexOf('image/') === 0 ? '!' : ''
179 textarea.value += embed + '['+file.name+']('+file.link+')'
180 }),
181 cancelBtn
182 )
183
184 composer.appendChild(container)
185 container.appendChild(textarea)
186 container.appendChild(initialButtons)
187
188 return composer
189}
190
191

Built with git-ssb-web