houdini/client/js/campaigns/supporters/index/index.es6

64 lines
2 KiB
Text
Raw Normal View History

2018-03-29 20:42:43 +00:00
// License: LGPL-3.0-or-later
const request = require('../../../common/super-agent-frp')
const view = require('vvvview')
const flyd = require('flyd')
const scanMerge = require('flyd/module/scanmerge')
const flatMap = require('flyd/module/flatmap')
const Im = require('immutable')
const Map = Im.Map
const fromJS = Im.fromJS
const list = require('./supporter-list.es6')
var el = document.querySelector('.js-view-supporters')
var state = Map({loading: true})
var listView = view(list.root, el, state)
// Given a query object, return an ajax stream
const request_index = query =>
request
.get(`/nonprofits/${app.nonprofit_id}/campaigns/${ENV.campaignID}/admin/supporters`)
.query(query)
.perform()
var $searchResponses = flatMap(request_index, list.$streams.searches)
const appendPage = (state, resp) => {
var oldSupporters = state.getIn(['supporters', 'data'])
var newData = fromJS(resp.body)
if(oldSupporters) newData = newData.set('data', oldSupporters.concat(newData.get('data')))
return state
.set('supporters', newData)
.set('moreLoading', false)
.set('loading', false)
}
const $showMorePages = flyd.scan(
count => count + 1
, 1
, list.$streams.showMore)
const $newPages = flatMap(
page => request_index({page: page})
, $showMorePages)
const setResults = (state, resp) =>
state.set('supporters', fromJS(resp.body)).set('loading', false)
var $giftLevelResponses =
request.get(`/nonprofits/${app.nonprofit_id}/campaigns/${ENV.campaignID}/admin/campaign_gift_options`).perform()
var $state = flyd.immediate(scanMerge([
[list.$streams.searches, state => state.set('loading', true).set('isSearching', true)],
[list.$streams.showMore, state => state.set('moreLoading', true).set('page', state.get('page') + 1)],
[$newPages, appendPage],
[$searchResponses, setResults],
[$giftLevelResponses, (state, resp) => state.set('gift_levels', fromJS(resp.body))],
], state))
window.$state =$state
window.$giftLevelResponses= $giftLevelResponses
flyd.map(listView, $state)