message/html/compose.jsView |
---|
1 | | -const { h, when, send, resolve, Value, computed } = require('mutant') |
| 1 … | +const { h, when, send, resolve, Value, Array: MutantArray, computed } = require('mutant') |
2 | 2 … | const nest = require('depnest') |
3 | 3 … | const ssbMentions = require('ssb-mentions') |
4 | 4 … | const extend = require('xtend') |
5 | 5 … | const addSuggest = require('suggest-box') |
| 6 … | +const blobFiles = require('ssb-blob-files') |
6 | 7 … | |
7 | 8 … | exports.gives = nest('message.html.compose') |
8 | 9 … | |
9 | 10 … | exports.needs = nest({ |
10 | 11 … | 'about.async.suggest': 'first', |
11 | 12 … | 'channel.async.suggest': 'first', |
12 | 13 … | 'emoji.async.suggest': 'first', |
13 | 14 … | 'meme.async.suggest': 'first', |
14 | | - 'blob.html.input': 'first', |
| 15 … | + |
15 | 16 … | 'message.html.confirm': 'first', |
16 | 17 … | 'drafts.sync.get': 'first', |
17 | 18 … | 'drafts.sync.set': 'first', |
18 | 19 … | 'drafts.sync.remove': 'first', |
19 | | - 'settings.obs.get': 'first' |
| 20 … | + 'settings.obs.get': 'first', |
| 21 … | + 'sbot.obs.connection': 'first' |
20 | 22 … | }) |
21 | 23 … | |
22 | 24 … | exports.create = function (api) { |
23 | 25 … | return nest({ 'message.html.compose': compose }) |
92 | 94 … | hasContent.set(true) |
93 | 95 … | } |
94 | 96 … | |
95 | 97 … | var isPrivate = location.page === 'private' || |
96 | | - (location.key && !location.value) || |
97 | | - (location.value && location.value.private) |
| 98 … | + (location.key && !location.value) || |
| 99 … | + (location.value && location.value.private) |
98 | 100 … | |
99 | | - var warningMessage = Value(null) |
100 | | - var warning = h('section.warning', |
101 | | - { className: when(warningMessage, '-open', '-closed') }, |
102 | | - [ |
103 | | - h('div.warning', warningMessage), |
104 | | - h('div.close', { 'ev-click': () => warningMessage.set(null) }, 'x') |
105 | | - ] |
106 | | - ) |
107 | | - var fileInput = api.blob.html.input(file => { |
108 | | - const megabytes = file.size / 1024 / 1024 |
109 | | - if (megabytes >= 5) { |
110 | | - const rounded = Math.floor(megabytes * 100) / 100 |
111 | | - warningMessage.set([ |
| 101 … | + var warningMessages = MutantArray([]) |
| 102 … | + var warning = computed(warningMessages, msgs => { |
| 103 … | + if (!msgs.length) return |
| 104 … | + |
| 105 … | + return h('section.warnings', msgs.map((m, i) => { |
| 106 … | + return h('div.warning', [ |
112 | 107 … | h('i.fa.fa-exclamation-triangle'), |
113 | | - h('strong', file.name), |
114 | | - ` is ${rounded}MB - the current limit is 5MB` |
| 108 … | + h('div.message', m), |
| 109 … | + h('i.fa.fa-times', { 'ev-click': () => warningMessages.deleteAt(i) }) |
115 | 110 … | ]) |
| 111 … | + })) |
| 112 … | + }) |
| 113 … | + |
| 114 … | + var fileInput = h('input', { |
| 115 … | + type: 'file', |
| 116 … | + |
| 117 … | + attributes: { multiple: true }, |
| 118 … | + 'ev-click': () => hasContent.set(true), |
| 119 … | + 'ev-change': (ev) => { |
| 120 … | + warningMessages.set([]) |
| 121 … | + |
| 122 … | + const files = ev.target.files |
| 123 … | + const opts = { |
| 124 … | + stripExif: api.settings.obs.get('patchbay.removeExif', true), |
| 125 … | + isPrivate |
| 126 … | + } |
| 127 … | + blobFiles(files, api.sbot.obs.connection, opts, afterBlobed) |
| 128 … | + } |
| 129 … | + }) |
| 130 … | + function afterBlobed (err, result) { |
| 131 … | + if (err) { |
| 132 … | + console.error(err) |
| 133 … | + warningMessages.push(err.message) |
116 | 134 … | return |
117 | 135 … | } |
118 | 136 … | |
119 | | - files.push(file) |
120 | | - filesById[file.link] = file |
| 137 … | + files.push(result) |
| 138 … | + filesById[result.link] = result |
121 | 139 … | |
122 | 140 … | const pos = textArea.selectionStart |
123 | | - const embed = file.type.match(/^image/) ? '!' : '' |
| 141 … | + const embed = result.type.match(/^image/) ? '!' : '' |
124 | 142 … | const spacer = embed ? '\n' : ' ' |
125 | | - const insertLink = spacer + embed + '[' + file.name + ']' + '(' + file.link + ')' + spacer |
| 143 … | + const insertLink = spacer + embed + '[' + result.name + ']' + '(' + result.link + ')' + spacer |
126 | 144 … | |
127 | 145 … | textArea.value = textArea.value.slice(0, pos) + insertLink + textArea.value.slice(pos) |
128 | 146 … | |
129 | | - console.log('added:', file) |
130 | | - }, { private: isPrivate, removeExif: api.settings.obs.get('patchbay.removeExif', true) }) |
| 147 … | + console.log('added:', result) |
| 148 … | + } |
131 | 149 … | |
132 | | - fileInput.onclick = () => hasContent.set(true) |
133 | | - |
134 | 150 … | var publishBtn = h('button', { 'ev-click': publish }, isPrivate ? 'Reply' : 'Publish') |
135 | 151 … | |
136 | 152 … | var actions = h('section.actions', [ |
137 | 153 … | fileInput, |
164 | 180 … | addSuggest(channelInput, (inputText, cb) => { |
165 | 181 … | if (inputText[0] === '#') { |
166 | 182 … | api.channel.async.suggest(inputText.slice(1), cb) |
167 | 183 … | } |
168 | | - }, {cls: 'PatchSuggest'}) |
| 184 … | + }, { cls: 'PatchSuggest' }) |
169 | 185 … | channelInput.addEventListener('suggestselect', ev => { |
170 | 186 … | channelInput.value = ev.detail.id |
171 | 187 … | }) |
172 | 188 … | |
177 | 193 … | if (char === '@') api.about.async.suggest(wordFragment, feedIdsInThread, cb) |
178 | 194 … | if (char === '#') api.channel.async.suggest(wordFragment, cb) |
179 | 195 … | if (char === ':') api.emoji.async.suggest(wordFragment, cb) |
180 | 196 … | if (char === '&') api.meme.async.suggest(wordFragment, cb) |
|
181 | | - }, {cls: 'PatchSuggest'}) |
| 197 … | + }, { cls: 'PatchSuggest' }) |
182 | 198 … | |
183 | 199 … | return composer |
184 | 200 … | |
185 | 201 … | |