const h = require('snabbdom/h') const R = require('ramda') const flyd = require('flyd') const button = require('ff-core/button') const serializeForm = require('form-serialize') flyd.scanMerge = require('flyd/module/scanmerge') flyd.flatMap = require('flyd/module/flatmap') flyd.filter = require('flyd/module/filter') flyd.mergeAll = require('flyd/module/mergeall') const request = require('../common/request') // pass in your existing supporter data to prefill the form // pass in your url endpoint for supporter updates // pass in some default data for your update payload function init(state) { state = state || {} state = R.merge({ submit$: flyd.stream() , supporter$: flyd.stream(state.supporter || {}) , error$: flyd.stream() }, state) state.updated$ = flyd.map( ev => { ev.preventDefault() return serializeForm(ev.target, {hash: true}) } , state.submit$ ) state.supporter$ = flyd.merge(state.updated$, flyd.stream(state.supporter)) state.response$ = flyd.flatMap( supporter => flyd.map(R.prop('body'), request({ method: 'put' , path: state.path || `/nonprofits/${app.nonprofit_id}/supporters` , send: R.merge({supporter}, state.payload || {}) }).load) , state.updated$ ) state.loading$ = flyd.mergeAll([ flyd.map(R.always(true), state.submit$) , flyd.map(R.always(false), state.response$) ]) return state } // things you need in state: // - a supporter object with name, address, city, state_code, country, zip_code // - the $submitAddressUpdate stream function view(state) { var supporter = state.supporter return h('form', { on: {submit: state.submit$}}, [ h('div.layout--three.u-marginBottom--10', [ h('span', [ h('label', 'Name') , h('input', {props: {name: 'name', placeholder: 'name', value: supporter.name}}) ]) , h('span', [ h('label', 'Street Address') , h('input', {props: {name: 'address', placeholder: 'address', value: supporter.address}}) ]) , h('span', [ h('label', 'City') , h('input', {props: {name: 'city', placeholder: 'city', value: supporter.city}}) ]) , ]) , h('div.layout--three.u-marginBottom--15', [ h('span', [ h('label', 'State/Region') , h('input', {props: {name: 'state_code', placeholder: 'state/region', value: supporter.state_code}}) ]) , h('span', [ h('label', 'Postal Code') , h('input', {props: {name: 'zip_code', placeholder: 'postal code', value: supporter.zip_code}}) ]) , h('span', [ h('label', 'Country') , h('input', {props: {name: 'country', placeholder: 'country', value: supporter.country}}) ]) ]) , h('input', {props: {type: 'hidden', name: 'id', value: supporter.id}}) , button(R.pick(['loading$', 'error$'], state)) ]) } module.exports = {view, init}