// License: LGPL-3.0-or-later var view = require("vvvview") var flyd = require("flyd") flyd.scanmerge = require("flyd/module/scanmerge") var h = require("virtual-dom/h") var setStateFromValue = require('../../components/set-state-from-value') var appearance = require('./appearance') var designations = require('./designations') var amounts = require('./amounts') var type = require('./type') var hideDedication = require('./hide-dedication') var thankYou = require('./thank-you') var preview = require('./preview') var $footer = require('./footer').stream var state = { page: window.location.hash.replace('#', '') ? window.location.hash.replace('#', '') : 'appearance', settings: { appearance: { name: 'default', customText: 'Donate' }, designations: {count: 1, multiples: {}}, amounts: { name: 'multiple', single: 30, multiples: {0: 10, 1: 20, 2: 30, 3: 70, 4: 100, 5: 200, 6: 1000 } }, type: { name: 'both'}, thankYou: {} } } function root(state) { return h('div', [ menu(state), pages(state) ]) } var $page = flyd.stream() var $pageClick = flyd.stream() flyd.map(function(ev){ if(ev.target.data.page === 'preview') { appendScript() } else { removeScript() } }, $pageClick) $page = flyd.merge($page, flyd.map(function(ev) { return ev.target.data.page }, $pageClick)) function appendScript(){ var script = document.createElement('script') script.id = 'commitchange-donation-script' script.setAttribute('data-npo-id', app.nonprofit_id) script.setAttribute('src', app.host_with_port + '/js/donate-button.v2.js') document.body.appendChild(script) } function removeScript(){ if(document.getElementById('commitchange-donation-script')){ document.getElementById('commitchange-donation-script').remove() } removeButtonContent() } function removeButtonContent(){ var donateButton = document.querySelector('.commitchange-donate') while(donateButton.lastChild){ donateButton.removeChild(donateButton.lastChild) } } function appendButtonCode(){ document.getElementById('choose-role-modal').classList.add('inView') document.body.classList.add('is-showingModal') var buttonWrapper = document.getElementById('js-donateButtonWrapper').cloneNode(true) while(buttonWrapper.querySelector('iframe')) { buttonWrapper.querySelector('iframe').remove() } while(buttonWrapper.querySelector('div')){ buttonWrapper.querySelector('div').remove() } var code = buttonWrapper.innerHTML.replace(/"/g, "'") document.getElementById('js-donateButtonAnchor').value = code document.querySelector('#send-code-modal input[name="code"]').value = code } function menu(state){ var menuItems = [ {name: 'appearance', text: 'Appearance'}, {name: 'designations', text: 'Designations'}, {name: 'amounts', text: 'Preset amounts'}, {name: 'type', text: 'Preset recurring or one-time'}, {name: 'hideDedication', text: 'Hide dedication' }, {name: 'thankYou', text: 'Thank-you page'}, {name: 'preview', text: 'Live preview'}] var lis =[] var button = h('div.u-paddingX-10', h('a.button--large.orange.u-width--full', {onclick: appendButtonCode}, 'Finish')) menuItems.map(function(item) { var liClass = state.page === item.name ? '.active' : '' lis.push(h('li' + liClass, {data: {page: item.name}, onclick: $pageClick}, item.text)) }) return h('aside.stepsMenu', [h('ul', lis), button]) } function pageWrapper(state, pageName, content){ return h('section.step.' + pageName, { style: {display: state.page === pageName ? 'block' : 'none'} }, content) } function pages(state){ return [ pageWrapper(state, 'appearance', appearance.root(state)), pageWrapper(state, 'designations', designations.root(state)), pageWrapper(state, 'amounts', amounts.root(state)), pageWrapper(state, 'type', type.root(state)), pageWrapper(state, 'hideDedication', hideDedication.root(state)), pageWrapper(state, 'thankYou', thankYou.root(state)), pageWrapper(state, 'preview', preview.root(state)) ] } var donateFormBuilder = view(root, document.getElementById('js-donateFormBuilder'), state) var nameStreams = [appearance.stream, designations.streams.name, amounts.stream, type.stream, hideDedication.stream, thankYou.stream] .map(function(stream) { return [stream, setStateFromValue]}) window.state = state var scanPairs = [ [$page, setPage], [$footer, advancePage], [designations.streams.count, addDesignation] ].concat(nameStreams) var $state = flyd.immediate(flyd.scanmerge(scanPairs, state)) // rerenders the view based on state changes // takes the view and state stream flyd.map(donateFormBuilder, $state) function setPage(state, pageName){ state.page = window.location.hash = pageName return state } function addDesignation(state, ev) { if(state.settings.designations.count < 20) { state.settings.designations.count++ } return state } function advancePage(state, ev) { state.page = ev.target.data.next return state } // // Send email to webmaster $('#send-code-modal form').on('submit', function(e) { var self = this e.preventDefault() var data = $(this).serializeObject() $(this).find('button').loading('Sending...') $.post('/nonprofits/' + app.nonprofit_id + '/button/send_code.json', data) .done(function() { notification('Email sent!') appl.close_modal() }) .complete(function() { $(self).find('button').disableLoading() }) .fail(function(d) { notification('Error: ' + utils.print_error(d)) }) })