git ssb

0+

ev / minbase



Tree: a82d9b053001af225a6db818036079f377f481d0

Files: a82d9b053001af225a6db818036079f377f481d0 / modules / compose.js

4410 bytesRaw
1'use strict'
2var h = require('hyperscript')
3var u = require('../util')
4var suggest = require('suggest-box')
5var mentions = require('ssb-mentions')
6var lightbox = require('hyperlightbox')
7var cont = require('cont')
8
9var pull = require('pull-stream')
10var mime = require('simple-mime')('application/octect-stream')
11var split = require('split-buffer')
12var addblob = require('./scuttlebot').blobs_add
13
14function file_input (onAdded) {
15 return h('label.btn', 'Upload file',
16 h('input', { type: 'file', hidden: true,
17 onchange: function (ev) {
18 var file = ev.target.files[0]
19 if (!file) return
20 var reader = new FileReader()
21 reader.onload = function () {
22 pull(
23 pull.values(split(new Buffer(reader.result), 64*1024)),
24 addblob(function (err, blob) {
25 if(err) return console.error(err)
26 onAdded({
27 link: blob,
28 name: file.name,
29 size: reader.result.length || reader.result.byteLength,
30 type: mime(file.name)
31 })
32 })
33 )
34 }
35 reader.readAsArrayBuffer(file)
36 }
37 }))
38}
39
40exports.needs = {
41 suggest_mentions: 'map',
42 message_content: 'first',
43 message_confirm: 'first'
44}
45
46exports.gives = 'message_compose'
47
48function id (e) { return e }
49
50/*
51 opts can take
52
53 placeholder: string. placeholder text, defaults to "Write a message"
54 prepublish: function. called before publishing a message.
55 shrink: boolean. set to false, to make composer not shrink (or hide controls) when unfocused.
56*/
57
58exports.create = function (api) {
59
60 return function (meta, opts, cb) {
61 if('function' === typeof cb) {
62 if('function' === typeof opts)
63 opts = {prepublish: opts}
64 }
65
66 if(!opts) opts = {}
67 opts.prepublish = opts.prepublish || id
68
69 var accessories
70 meta = meta || {}
71 if(!meta.type) throw new Error('message must have type')
72
73 var publishBtn = h('button.btn.btn-success.right', 'Preview', {onclick: publish})
74
75 var ta = h('textarea', {
76 placeholder: opts.placeholder || 'Write a message',
77 style: {height: opts.shrink === false ? '200px' : ''}
78 }, opts.text)
79
80 accessories = h('div.row.compose__controls',
81 publishBtn,
82 {style: {display: 'none'}},
83 file_input(function (file) {
84 files.push(file)
85 filesById[file.link] = file
86 var embed = file.type.indexOf('image/') === 0 ? '!' : ''
87 ta.value += embed + '['+file.name+']('+file.link+')'
88 console.log('added:', file)
89 })
90 )
91
92
93 if(opts.shrink !== false) {
94 var blur
95 ta.addEventListener('focus', function () {
96 clearTimeout(blur)
97 if(!ta.value) {
98 ta.style.height = '200px'
99 }
100 accessories.style.display = 'block'
101 })
102 ta.addEventListener('blur', function () {
103 if(ta.value) return
104 ta.style.height = '50px'
105 accessories.style.display = 'none'
106 })
107 }
108
109 var files = []
110 var filesById = {}
111
112 function publish() {
113 publishBtn.disabled = true
114 var content
115 try {
116 content = JSON.parse(ta.value)
117 } catch (err) {
118 meta.text = ta.value
119 meta.mentions = mentions(ta.value).map(function (mention) {
120 // merge markdown-detected mention with file info
121 var file = filesById[mention.link]
122 if (file) {
123 if (file.type) mention.type = file.type
124 if (file.size) mention.size = file.size
125 }
126 return mention
127 })
128 try {
129 meta = opts.prepublish(meta)
130 } catch (err) {
131 publishBtn.disabled = false
132 if (cb) cb(err)
133 else alert(err.message)
134 }
135 return api.message_confirm(meta, done)
136 }
137
138 api.message_confirm(content, done)
139
140 function done (err, msg) {
141 publishBtn.disabled = false
142 if(err) return alert(err.stack)
143 else if (msg) ta.value = ''
144
145 if (cb) cb(err, msg)
146 }
147 }
148
149
150 var composer =
151 h('div.compose',
152 h('div.column',
153 ta,
154 accessories
155 )
156 )
157
158 suggest(ta, function (name, cb) {
159 cont.para(api.suggest_mentions(name))
160 (function (err, ary) {
161 cb(null, ary.reduce(function (a, b) {
162 if(!b) return a
163 return a.concat(b)
164 }, []))
165 })
166 }, {})
167
168 return composer
169 }
170
171}
172
173
174

Built with git-ssb-web