houdini/app/javascript/legacy/supporters/index.js

68 lines
2.1 KiB
JavaScript
Raw Normal View History

2019-11-06 20:36:28 +00:00
// License: LGPL-3.0-or-later
const R = require('ramda')
const h = require('snabbdom/h')
const flyd = require('flyd')
const render = require('ff-core/render')
const request = require('../common/request')
const snabbdom = require('snabbdom')
const flyd_lift = require('flyd/module/lift')
const flyd_mergeAll = require('flyd/module/mergeall')
const url = require('url')
// TODO move this into sub-component in the future
const mailchimpModal = require('./settings/mailchimp-integration-settings')
// This is the root component for the supporters dashboard/CRM, found on /nonprofits/:nonprofit_id/supporters
function init() {
var state = { }
var thisUrl = url.parse(location.href, true)
const mailchimpSyncClick$ = getMailchimpClickSync()
const mailchimpKeyResp$ = request({method: 'get', path: `/nonprofits/${app.nonprofit_id}/nonprofit_keys`, query: {select: 'mailchimp_token'}}).load
const hasKey$ = flyd.filter(resp => resp.status === 200, mailchimpKeyResp$)
const modalID$ = flyd_mergeAll([
flyd_lift(openModalOrAuth, mailchimpSyncClick$, mailchimpKeyResp$)
, flyd.map(()=> thisUrl.query['show-modal'], hasKey$)
])
state.mailchimpModal = mailchimpModal.init(modalID$)
return state
}
// Either return the modal ID to open, or redirect the page to the mailchimp oauth screen
const openModalOrAuth = (ev, resp) => {
if(resp.status === 200) {
return 'mailchimpSettingsModal'
} else {
window.location.href = `/nonprofits/${app.nonprofit_id}/nonprofit_keys/mailchimp_login`
return null
}
}
const getMailchimpClickSync = () => {
const s = flyd.stream()
document.querySelector('.js-openMailchimpModal')
.addEventListener('click', ev => {appl.close_modal(); s(ev)})
return s
}
function view(state) {
return h('div', [
mailchimpModal.view(state.mailchimpModal)
])
}
// -- Render to the page
var container = document.querySelector('#js-main')
const patch = snabbdom.init([
require('snabbdom/modules/eventlisteners')
, require('snabbdom/modules/class')
, require('snabbdom/modules/props')
, require('snabbdom/modules/style')
])
var state = init()
render({patch, view, state, container})