houdini/client/js/campaigns/show/page.js
2018-06-04 16:13:35 -05:00

172 lines
5.3 KiB
JavaScript
Executable file

// License: LGPL-3.0-or-later
const flyd = require('flyd')
const h = require('snabbdom/h')
const R = require('ramda')
const donateWiz = require('../../nonprofits/donate/wizard')
const render = require('ff-core/render')
const snabbdom = require('snabbdom')
const modal = require('ff-core/modal')
flyd.mergeAll = require('flyd/module/mergeall')
flyd.scanMerge = require('flyd/module/scanmerge')
const format = require('../../common/format')
const giftOptions = require('./gift-option-list')
const chooseGiftOptionsModal = require('./choose-gift-options-modal')
const metricsAndContributeBox = require('./metrics-and-contribute-box')
const timeRemaining = require('../../common/time-remaining')
const request = require('../../common/request')
const activities = require('../../components/public-activities')
// Viewscript legacy side effect stuff
require('../../components/branded_fundraising')
require('../../common/on-change-sanitize-slug')
require('../../common/fundraiser_metrics')
require('../../components/fundraising/add_header_image')
require('../../common/restful_resource')
require('../../gift_options/index')
const on_ios11 = require('../../common/on-ios11')
const noScroll = require('no-scroll')
appl.ajax_gift_options.index()
// Campaign editor only functionality
if(app.current_campaign_editor) {
require('./admin')
appl.def('current_campaign_editor', true)
require('../../gift_options/admin')
var create_info_card = require('../../supporters/info-card.es6')
}
// Initialize the state for the top-level campaign component
// This includes the metrics, contribute button, gift options listing, and the donate wizard (most of right sidebar)
// Later can include the other viewscript pieces
function init() {
var state = {
timeRemaining$: timeRemaining(app.end_date_time, app.timezone),
}
console.error(window.navigator.userAgent)
state.giftOptions = giftOptions.init(flyd.stream(), state)
const metricsResp$ = flyd.map(R.prop('body'), request({
method: 'get'
, path: `/nonprofits/${app.nonprofit_id}/campaigns/${app.campaign.id}/metrics`
}).load)
state.loadingMetrics$ = flyd.mergeAll([
flyd.map(_ => false, metricsResp$)
, flyd.stream(true)
])
state.metrics$ = flyd.merge(
flyd.stream({goal_amount: 0, total_raised: 0, supporters_count: 0})
, metricsResp$
)
state.metrics = metricsAndContributeBox.init(state)
state.activities = activities.init('campaign', `/nonprofits/${app.nonprofit_id}/campaigns/${app.campaign_id}/activities`)
const contributeModalType$ = R.compose(
flyd.map(_ =>
state.timeRemaining$() && state.giftOptions.giftOptions$().length
? 'gifts' : 'regular')
)(state.metrics.clickContribute$)
const clickContributeGifts$ = flyd.filter(x => x === 'gifts', contributeModalType$)
const clickContributeRegular$ = flyd.filter(x => x === 'regular', contributeModalType$)
state.clickRegularContribution$ = flyd.stream()
const startWiz$ = flyd.mergeAll([
state.giftOptions.clickOption$
, clickContributeRegular$
, state.clickRegularContribution$
])
state.selectedModalGift$ = flyd.stream({})
state.modalID$ = flyd.merge(
flyd.map(R.always('chooseGiftOptionsModal'), clickContributeGifts$)
, flyd.map(R.always('donationModal'), startWiz$))
flyd.on((id) => {
if (on_ios11() && id === null) {
noScroll.off()
}
}, state.modalID$)
flyd.on((id) => {
if (on_ios11() && id !== null) {
noScroll.on()
}
}, state.modalID$)
// Stream of which gift option you have selected
const giftOption$ = flyd.map(setGiftParams, state.giftOptions.clickOption$)
const donateParam$ = flyd.scanMerge([
[state.metrics.clickContribute$, resetDonateForm]
, [giftOption$, setGiftOption]
], {campaign_id: app.campaign.id} )
state.donateWiz = donateWiz.init(donateParam$)
return state
}
const resetDonateForm = (params, _) => R.merge(params, {
single_amount: undefined
, gift_option: undefined
, type: undefined
})
const setGiftOption = (params, gift) => R.merge(params, {
single_amount: gift.amount / 100
, gift_option: gift
, type: gift.type
})
// Set the donate wizard parameters using data from a gift option
const setGiftParams = (triple) => {
var [gift, amount, type] = triple
return { amount: amount, type: type , id: gift.id, name: gift.name, to_ship: gift.to_ship}
}
function view(state) {
return h('div', [
metricsAndContributeBox.view(state.metrics)
, giftOptions.view(state.giftOptions)
, activities.view(state.activities)
, h('div.donationModal', [
modal({
thisID: 'donationModal'
, id$: state.modalID$
, body: donateWiz.view(state.donateWiz)
// , notCloseable: state.donateWiz.paymentStep.cardForm.loading$()
})
, modal({
thisID: 'chooseGiftOptionsModal'
, title: 'Contribute'
, id$: state.modalID$
, body: chooseGiftOptionsModal(state)
})
])
])
}
// -- Render to the page
const patch = snabbdom.init([
require('snabbdom/modules/eventlisteners')
, require('snabbdom/modules/class')
, require('snabbdom/modules/props')
, require('snabbdom/modules/style')
])
render({state: init(), view, patch, container: document.querySelector('.ff-sidebar')})
// Init the metrics
appl.def('metrics.path_prefix', '/nonprofits/' + app.nonprofit_id + '/campaigns/' + app.campaign_id + '/')
appl.ajax_metrics.index()