modules_basic/compose.jsView |
---|
1 | 1 … | 'use strict' |
2 | | -var h = require('hyperscript') |
3 | | -var u = require('../util') |
4 | | -var suggest = require('suggest-box') |
5 | | -var mentions = require('ssb-mentions') |
6 | | -var lightbox = require('hyperlightbox') |
7 | | -var cont = require('cont') |
| 2 … | +const fs = require('fs') |
| 3 … | +const h = require('../h') |
| 4 … | +const u = require('../util') |
| 5 … | +const suggest = require('suggest-box') |
| 6 … | +const mentions = require('ssb-mentions') |
| 7 … | +const cont = require('cont') |
8 | 8 … | |
9 | 9 … | |
10 | 10 … | |
11 | 11 … | |
20 | 20 … | message_confirm: 'first', |
21 | 21 … | file_input: 'first' |
22 | 22 … | } |
23 | 23 … | |
24 | | -exports.gives = 'message_compose' |
| 24 … | +exports.gives = { |
| 25 … | + 'message_compose': true, |
| 26 … | + 'mcss': true |
| 27 … | +} |
25 | 28 … | |
26 | | -function id (e) { return e } |
| 29 … | +exports.create = function (api) { |
| 30 … | + return { |
| 31 … | + message_compose, |
| 32 … | + mcss: () => fs.readFileSync(__filename.replace(/js$/, 'mcss'), 'utf8') |
| 33 … | + } |
27 | 34 … | |
28 | | - |
29 | | - opts can take |
| 35 … | + |
| 36 … | + opts can take |
30 | 37 … | |
31 | | - placeholder: string. placeholder text, defaults to "Write a message" |
32 | | - prepublish: function. called before publishing a message. |
33 | | - shrink: boolean. set to false, to make composer not shrink (or hide controls) when unfocused. |
34 | | -*/ |
| 38 … | + placeholder: string. placeholder text, defaults to "Write a message" |
| 39 … | + prepublish: function. called before publishing a message. |
| 40 … | + shrink: boolean. set to false, to make composer not shrink (or hide controls) when unfocused. |
| 41 … | + */ |
35 | 42 … | |
36 | | -exports.create = function (api) { |
| 43 … | + function message_compose (meta = {}, opts = {}, cb) { |
| 44 … | + if(!meta.type) throw new Error('message must have type') |
37 | 45 … | |
38 | | - return function (meta, opts, cb) { |
39 | 46 … | if('function' === typeof cb) { |
40 | | - if('function' === typeof opts) |
| 47 … | + if('function' === typeof opts) { |
41 | 48 … | opts = {prepublish: opts} |
42 | 49 … | } |
43 | | - |
44 | | - if(!opts) opts = {} |
| 50 … | + } |
45 | 51 … | opts.prepublish = opts.prepublish || id |
46 | 52 … | |
47 | | - var accessories |
48 | | - meta = meta || {} |
49 | | - if(!meta.type) throw new Error('message must have type') |
50 | | - var ta = h('textarea', { |
51 | | - placeholder: opts.placeholder || 'Write a message', |
52 | | - style: {height: opts.shrink === false ? '200px' : ''} |
| 53 … | + var actions |
| 54 … | + |
| 55 … | + var textArea = h('textarea', { |
| 56 … | + placeholder: opts.placeholder || 'Write a message' |
53 | 57 … | }) |
54 | 58 … | |
55 | 59 … | if(opts.shrink !== false) { |
56 | 60 … | var blur |
57 | | - ta.addEventListener('focus', function () { |
| 61 … | + textArea.addEventListener('focus', () => { |
58 | 62 … | clearTimeout(blur) |
59 | | - if(!ta.value) { |
60 | | - ta.style.height = '200px' |
| 63 … | + if(!textArea.value) { |
| 64 … | + composer.className = 'Compose -expanded' |
61 | 65 … | } |
62 | | - accessories.style.display = 'block' |
63 | 66 … | }) |
64 | | - ta.addEventListener('blur', function () { |
| 67 … | + textArea.addEventListener('blur', () => { |
65 | 68 … | |
66 | 69 … | |
67 | 70 … | clearTimeout(blur) |
68 | | - blur = setTimeout(function () { |
69 | | - if(ta.value) return |
70 | | - ta.style.height = '50px' |
71 | | - accessories.style.display = 'none' |
72 | | - }, 200) |
| 71 … | + blur = setTimeout(() => { |
| 72 … | + if(textArea.value) return |
| 73 … | + composer.className = 'Compose -contracted' |
| 74 … | + }, 300) |
73 | 75 … | }) |
74 | 76 … | } |
75 | 77 … | |
76 | | - ta.addEventListener('keydown', function (ev) { |
| 78 … | + textArea.addEventListener('keydown', ev => { |
77 | 79 … | if(ev.keyCode === 13 && ev.ctrlKey) publish() |
78 | 80 … | }) |
79 | 81 … | |
80 | 82 … | var files = [] |
83 | 85 … | function publish() { |
84 | 86 … | publishBtn.disabled = true |
85 | 87 … | var content |
86 | 88 … | try { |
87 | | - content = JSON.parse(ta.value) |
| 89 … | + content = JSON.parse(textArea.value) |
|
88 | 90 … | } catch (err) { |
89 | | - meta.text = ta.value |
90 | | - meta.mentions = mentions(ta.value).map(function (mention) { |
| 91 … | + meta.text = textArea.value |
| 92 … | + meta.mentions = mentions(textArea.value).map(mention => { |
91 | 93 … | |
92 | 94 … | var file = filesById[mention.link] |
93 | 95 … | if (file) { |
94 | 96 … | if (file.type) mention.type = file.type |
110 | 112 … | |
111 | 113 … | function done (err, msg) { |
112 | 114 … | publishBtn.disabled = false |
113 | 115 … | if(err) return alert(err.stack) |
114 | | - else if (msg) ta.value = '' |
| 116 … | + else if (msg) textArea.value = '' |
115 | 117 … | |
116 | 118 … | if (cb) cb(err, msg) |
117 | 119 … | } |
118 | 120 … | } |
119 | 121 … | |
| 122 … | + var fileInput = api.file_input(file => { |
| 123 … | + files.push(file) |
| 124 … | + filesById[file.link] = file |
120 | 125 … | |
121 | | - var publishBtn = h('button', 'Publish', {onclick: publish}) |
122 | | - var composer = |
123 | | - h('div.compose', h('div.column', ta, |
124 | | - accessories = h('div.row.compose__controls', |
125 | | - |
126 | | - {style: {display: opts.shrink === false ? '' : 'none'}}, |
127 | | - api.file_input(function (file) { |
128 | | - files.push(file) |
129 | | - filesById[file.link] = file |
| 126 … | + var embed = file.type.indexOf('image/') === 0 ? '!' : '' |
130 | 127 … | |
131 | | - var embed = file.type.indexOf('image/') === 0 ? '!' : '' |
132 | | - ta.value += embed + '['+file.name+']('+file.link+')' |
133 | | - console.log('added:', file) |
134 | | - }), |
135 | | - publishBtn) |
136 | | - ) |
137 | | - ) |
| 128 … | + textArea.value += embed + '['+file.name+']('+file.link+')' |
| 129 … | + composer.className = 'Compose -expanded' |
| 130 … | + console.log('added:', file) |
| 131 … | + }) |
| 132 … | + var publishBtn = h('button', {'ev-click': publish}, 'Publish' ) |
| 133 … | + var actions = h('section.actions', [ |
| 134 … | + fileInput, publishBtn |
| 135 … | + ]) |
138 | 136 … | |
139 | | - suggest(ta, function (name, cb) { |
| 137 … | + var composer = h('Compose', { |
| 138 … | + className: opts.shrink === false ? '-expanded' : '-contracted' |
| 139 … | + }, [ |
| 140 … | + textArea, |
| 141 … | + actions |
| 142 … | + ]) |
| 143 … | + |
| 144 … | + suggest(textArea, (name, cb) => { |
140 | 145 … | cont.para(api.suggest_mentions(name)) |
141 | | - (function (err, ary) { |
142 | | - cb(null, ary.reduce(function (a, b) { |
| 146 … | + ((err, ary) => { |
| 147 … | + cb(null, ary.reduce((a, b) => { |
143 | 148 … | if(!b) return a |
144 | 149 … | return a.concat(b) |
145 | 150 … | }, [])) |
146 | 151 … | }) |
147 | 152 … | }, {}) |
148 | 153 … | |
149 | 154 … | return composer |
150 | | - |
151 | 155 … | } |
152 | 156 … | |
153 | 157 … | } |
154 | 158 … | |
| 159 … | +function id (e) { return e } |
155 | 160 … | |