git ssb

2+

mixmix / ticktack



Tree: adca29179dee2177af6fefa725c91581ffef5395

Files: adca29179dee2177af6fefa725c91581ffef5395 / app / page / blogNew.js

3605 bytesRaw
1const nest = require('depnest')
2const { h, Struct, Value } = require('mutant')
3const addSuggest = require('suggest-box')
4const pull = require('pull-stream')
5const marksum = require('markdown-summary')
6
7exports.gives = nest('app.page.blogNew')
8
9exports.needs = nest({
10 'app.html.sideNav': 'first',
11 'channel.async.suggest': 'first',
12 'history.sync.push': 'first',
13 'message.html.compose': 'first',
14 'translations.sync.strings': 'first',
15 'sbot.async.addBlob': 'first'
16})
17
18exports.create = (api) => {
19 var contentHtmlObs
20
21 return nest('app.page.blogNew', blogNew)
22
23 function blogNew (location) {
24 const strings = api.translations.sync.strings()
25 const getChannelSuggestions = api.channel.async.suggest()
26
27 const meta = Struct({
28 type: 'blog',
29 channel: Value(),
30 title: Value(),
31 summary: Value()
32 })
33
34 const composer = api.message.html.compose(
35 {
36 meta,
37 placeholder: strings.blogNew.actions.writeBlog,
38 shrink: false,
39 prepublish: function (content, cb) {
40 var m = /\!\[[^]+\]\(([^\)]+)\)/.exec(marksum.image(content.text))
41 content.thumbnail = m && m[1]
42 // content.summary = marksum.summary(content.text) // Need a summary whihch doesn't trim the start
43
44 var stream = pull.values([content.text])
45 delete content.text
46 api.sbot.async.addBlob(stream, function (err, hash) {
47 if (err) return cb(err)
48 if (!hash) throw new Error('missing hash')
49 content.blog = hash
50 cb(null, content)
51 })
52 }
53 },
54 (err, msg) => api.history.sync.push(err || { page: 'blogIndex' })
55 )
56
57 const channelInput = h('input', {
58 'ev-input': e => meta.channel.set(e.target.value),
59 placeholder: strings.channel
60 })
61
62 var page = h('Page -blogNew', [
63 api.app.html.sideNav(location),
64 h('div.content', [
65 h('div.container', [
66 h('div.field -channel', [
67 h('div.label', strings.channel),
68 channelInput
69 ]),
70 h('div.field -title', [
71 h('div.label', strings.blogNew.field.title),
72 h('input', {
73 'ev-input': e => meta.title.set(e.target.value),
74 placeholder: strings.blogNew.field.title
75 })
76 ]),
77 h('div.field -summary', [
78 h('div.label', strings.blogNew.field.summary),
79 h('input', {
80 'ev-input': e => meta.summary.set(e.target.value),
81 placeholder: strings.blogNew.field.summary
82 })
83 ]),
84 composer
85 ])
86 ])
87 ])
88
89 addSuggest(channelInput, (inputText, cb) => {
90 inputText = inputText.replace(/^#/, '')
91 var suggestions = getChannelSuggestions(inputText)
92 .map(s => {
93 s.value = s.value.replace(/^#/, '') // strip the defualt # prefix here
94 return s
95 })
96 .map(s => {
97 if (s.subtitle === 'subscribed') { s.subtitle = h('i.fa.fa-heart') } // TODO - translation-friendly subscribed
98 return s
99 })
100
101 // HACK add the input text if it's not an option already
102 if (!suggestions.some(s => s.title === inputText)) {
103 suggestions.push({
104 title: inputText,
105 subtitle: h('i.fa.fa-plus-circle'),
106 value: inputText
107 })
108 }
109
110 cb(null, suggestions)
111 }, {cls: 'PatchSuggest.-channelHorizontal'}) // WARNING hacking suggest-box cls
112
113 channelInput.addEventListener('suggestselect', (e) => {
114 meta.channel.set(e.detail.value)
115 })
116
117 return page
118 }
119}
120

Built with git-ssb-web