sbot/ui/lib/com/flag-form.js

91 lines
2.8 KiB
JavaScript

var h = require('hyperscript')
var suggestBox = require('suggest-box')
var multicb = require('multicb')
var schemas = require('ssb-msg-schemas')
var app = require('../app')
var ui = require('../ui')
var modals = require('../ui/modals')
var com = require('./index')
var mentionslib = require('../mentions')
module.exports = function (id, opts) {
// markup
var name = com.userName(id)
var textarea = h('textarea.form-control', { placeholder: 'Write your reason for flagging here.', rows: 4 })
suggestBox(textarea, app.suggestOptions)
var form = h('.flag-form',
h('h3', com.icon('flag'), ' Flag "', name, '"'),
h('p.text-muted', h('small', 'Warn your followers about this user.')),
h('form', { onsubmit: onsubmit },
h('.radios',
opt('old-account', 'Old account'),
opt('spammer', 'Spammer'),
opt('abusive', 'Abusive'),
opt('nsfw', 'NSFW'),
opt('other', 'Other')
),
h('p', textarea),
h('p.text-right', h('button.btn.btn-3d', 'Publish'))
)
)
function opt (value, label) {
return h('.radio',
h('label',
h('input', { type: 'radio', name: 'flag-choice', value: value }),
label
)
)
}
// handlers
function onsubmit (e) {
e.preventDefault()
// prep text
ui.pleaseWait(true)
ui.setStatus('Publishing...')
var reason = textarea.value
var flag
try { flag = form.querySelector(':checked').value } catch (e) {}
mentionslib.extract(reason, function (err, mentions) {
if (err) {
ui.setStatus(null)
ui.pleaseWait(false)
if (err.conflict)
modals.error('Error While Publishing', 'You follow multiple people with the name "'+err.name+'." Go to the homepage to resolve this before publishing.')
else
modals.error('Error While Publishing', err, 'This error occurred while trying to extract the mentions from the text of a flag post.')
return
}
// publish
var done = multicb({ pluck: 1 })
app.ssb.publish(schemas.block(id), done())
app.ssb.publish(schemas.flag(id, flag||'other'), done())
done(function (err, msgs) {
if (err) {
ui.setStatus(null)
ui.pleaseWait(false)
return modals.error('Error While Publishing', err, 'This error occurred while trying to publish the block and flag messages.')
}
if (!reason) {
ui.setStatus(null)
ui.pleaseWait(false)
return opts.onsubmit()
}
app.ssb.publish(schemas.post(reason, msgs[1].key, msgs[1].key, (mentions.length) ? mentions : null), function (err) {
if (err) modals.error('Error While Publishing', err, 'This error occured while trying to publish the reason-post of a new flag.')
else opts.onsubmit()
})
})
})
}
return form
}