169 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
	
		
			5.1 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')})
 | |
| 
 | 
