46 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			46 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								// License: LGPL-3.0-or-later
							 | 
						||
| 
								 | 
							
								// npm
							 | 
						||
| 
								 | 
							
								const snabbdom = require('snabbdom')
							 | 
						||
| 
								 | 
							
								const flyd = require('flyd')
							 | 
						||
| 
								 | 
							
								const R = require('ramda')
							 | 
						||
| 
								 | 
							
								const render = require('ff-core/render')
							 | 
						||
| 
								 | 
							
								const notification = require('ff-core/notification')
							 | 
						||
| 
								 | 
							
								const serializeForm = require('form-serialize')
							 | 
						||
| 
								 | 
							
								flyd.flatMap  = require('flyd/module/flatmap')
							 | 
						||
| 
								 | 
							
								flyd.mergeAll = require('flyd/module/mergeall')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// local
							 | 
						||
| 
								 | 
							
								const request = require('../../../common/request')
							 | 
						||
| 
								 | 
							
								const view = require('./view')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function init() {
							 | 
						||
| 
								 | 
							
								  var state = { submit$: flyd.stream() }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // formSerialize will set checked boxes to "on" and unchecked boxes to "". We want it to be true/false instead
							 | 
						||
| 
								 | 
							
								  const formObj$ = R.compose(
							 | 
						||
| 
								 | 
							
								    flyd.map(obj => R.map(val => val === 'on' ? true : false, obj))
							 | 
						||
| 
								 | 
							
								  , flyd.map(ev => serializeForm(ev.currentTarget, {hash: true, empty: true}))
							 | 
						||
| 
								 | 
							
								  )(state.submit$)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const path = `/nonprofits/${app.nonprofit_id}/users/${app.current_user_id}/email_settings`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const updateResp$ = flyd.flatMap(
							 | 
						||
| 
								 | 
							
								    obj => request({ path, method: 'post' , send: {email_settings: obj} }).load
							 | 
						||
| 
								 | 
							
								  , formObj$ )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  state.email_settings$ = flyd.map(R.prop('body'), request({method: 'get', path}).load)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  state.loading$ = flyd.mergeAll([
							 | 
						||
| 
								 | 
							
								    flyd.map(R.always(true), state.submit$)
							 | 
						||
| 
								 | 
							
								  , flyd.map(R.always(false), updateResp$)
							 | 
						||
| 
								 | 
							
								  ])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const notify$ = flyd.map(()=> 'Email notification settings updated.', updateResp$)
							 | 
						||
| 
								 | 
							
								  state.notification = notification.init({message$: notify$})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return state
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = {init, view}
							 | 
						||
| 
								 | 
							
								
							 |