2018-03-25 18:03:08 +00:00
|
|
|
// License: LGPL-3.0-or-later
|
2018-03-25 17:30:42 +00:00
|
|
|
// npm
|
|
|
|
const R = require('ramda')
|
|
|
|
const flyd = require('flyd')
|
|
|
|
const h = require('snabbdom/h')
|
|
|
|
const snabbdom = require('snabbdom')
|
|
|
|
const render = require('flimflam-render')
|
|
|
|
const filter = require('flyd/module/filter')
|
|
|
|
const flatMap = require('flyd/module/flatmap')
|
|
|
|
const every = require('flyd/module/every')
|
|
|
|
|
|
|
|
const format = require('../../common/format')
|
|
|
|
const request = require('../../common/request')
|
|
|
|
|
|
|
|
const eventsPath = `/nonprofits/${app.nonprofit_id}/events/${app.event_id}`
|
|
|
|
|
|
|
|
const makeStatsSquare = vnode => {
|
|
|
|
const elm = vnode.elm
|
|
|
|
const height = elm.offsetHeight
|
|
|
|
const width = elm.offsetWidth
|
|
|
|
height > width
|
|
|
|
? elm.style.width = height + 'px'
|
|
|
|
: elm.style.height = width + 'px'
|
|
|
|
}
|
|
|
|
|
|
|
|
const get = path => R.compose(
|
|
|
|
flyd.map(x => x.body)
|
|
|
|
, filter(x => x.status === 200)
|
|
|
|
)(request({method: 'get', path}).load)
|
|
|
|
|
|
|
|
// makes an ajax call on page load and then every minute
|
|
|
|
const getEveryMinute = path => flyd.merge(
|
|
|
|
flyd.stream({})
|
|
|
|
, flatMap(time => get(path), every(60 * 1000)))
|
|
|
|
|
|
|
|
const init = () => {
|
|
|
|
return {
|
|
|
|
metrics$: getEveryMinute(`${eventsPath}/metrics`)
|
|
|
|
, activities$: getEveryMinute(`${eventsPath}/activities`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const activity = a =>
|
|
|
|
h('p.stats-activity'
|
|
|
|
, `${a.supporter_name} got ${a.quantity} ticket${a.quantity > 1 ? 's' : ''}`)
|
|
|
|
|
|
|
|
const statInner = (content, isCircle) => {
|
|
|
|
const data = {
|
|
|
|
hook: {postpatch: makeStatsSquare}
|
|
|
|
, class: {'stat-inner--circular': isCircle}
|
|
|
|
}
|
|
|
|
return h('section.stat-inner'
|
|
|
|
, app.nonprofit.brand_color
|
|
|
|
? R.merge(data, {style: {background: app.nonprofit.brand_color}})
|
|
|
|
: data
|
|
|
|
, content)
|
|
|
|
}
|
|
|
|
|
|
|
|
const view = state =>
|
|
|
|
console.log('metrics', state.metrics$()) ||
|
|
|
|
h('div', [
|
|
|
|
h('section.stat-outer', [
|
|
|
|
statInner([
|
|
|
|
h('div.stat-text', [
|
|
|
|
h('h3.stat-title', 'Raised')
|
|
|
|
, h('h3.stat-number', ['$', format.centsToDollars(state.metrics$().total_paid || 0)])
|
|
|
|
])
|
|
|
|
])
|
|
|
|
])
|
|
|
|
, h('section.stat-outer', [
|
|
|
|
statInner([
|
|
|
|
h('div.stat-text', [
|
|
|
|
h('h3.stat-title', 'Attendees')
|
|
|
|
, h('h3.stat-number', state.metrics$().total_attendees || '0')
|
|
|
|
])
|
|
|
|
], true)
|
|
|
|
])
|
|
|
|
, !app.hide_activity_feed && state.activities$().length
|
|
|
|
? h('div.stats-activities', R.map(activity, R.take(3, state.activities$())))
|
|
|
|
: ''
|
|
|
|
, h('div.stats-backgroundScrim', '')
|
|
|
|
, app.event_background_image
|
|
|
|
? h('div.stats-backgroundImage'
|
|
|
|
, {style: {'background-image': `url('${app.event_background_image}')`}})
|
|
|
|
: ''
|
|
|
|
])
|
|
|
|
|
|
|
|
const patch = snabbdom.init([
|
|
|
|
require('snabbdom/modules/class')
|
|
|
|
, require('snabbdom/modules/props')
|
|
|
|
, require('snabbdom/modules/style')
|
|
|
|
, require('snabbdom/modules/eventlisteners')
|
|
|
|
, require('snabbdom/modules/attributes')
|
|
|
|
])
|
|
|
|
|
|
|
|
const container = document.querySelector('#container')
|
|
|
|
|
|
|
|
render({patch, container, view, state: init()})
|
|
|
|
|