{"version":3,"file":"js/support-ef4b80337bb9fbe47627.js","mappings":"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","sources":["webpack://endrun/./app/javascript/app/analytics/ga.js","webpack://endrun/./app/javascript/app/analytics/helpers.js","webpack://endrun/./app/javascript/app/support/pitch.js","webpack://endrun/./app/javascript/app/support/moneyselector.js","webpack://endrun/./app/javascript/app/support/benefitoption.js","webpack://endrun/./app/javascript/app/support/shared.js","webpack://endrun/./app/javascript/app/support/membershipbenefitpanel.js","webpack://endrun/./app/javascript/app/shared/button.js","webpack://endrun/./app/javascript/app/support/recurringnudge.js","webpack://endrun/./app/javascript/app/shared/customselect.js","webpack://endrun/./app/javascript/app/support/frequencyselector.js","webpack://endrun/./app/javascript/app/support/nextbutton.js","webpack://endrun/./app/javascript/app/shared/validators.js","webpack://endrun/./app/javascript/app/support/supportintent.js","webpack://endrun/./app/javascript/app/shared/formfield.js","webpack://endrun/./app/javascript/app/shared/selectformfield.js","webpack://endrun/./app/javascript/app/support/contactinfoform.js","webpack://endrun/./app/javascript/app/support/hooks.js","webpack://endrun/./app/javascript/app/support/progresslogo.js","webpack://endrun/./app/javascript/app/support/stripeform.js","webpack://endrun/./app/javascript/app/support/paymentform.js","webpack://endrun/./app/javascript/app/support/supportsection.js","webpack://endrun/./app/javascript/app/support/analytics.js","webpack://endrun/./app/javascript/app/support/state.js","webpack://endrun/./app/javascript/app/support/supportpage.js","webpack://endrun/./app/javascript/app/support/index.js","webpack://endrun/./app/javascript/shared/http.js","webpack://endrun/./app/javascript/shared/utils.js"],"sourcesContent":["// We set up the ga object here so that any code depending on the presence of\n// ga can import this file and forever assume that they can use it normally,\n// without checking whether its really running all the time. This decouples the\n// decision of \"Do we want analytics right now?\" from everywhere we actually\n// use analytics.\nwindow.dataLayer = window.dataLayer || [];\nexport const gtag =\n window.gtag ||\n function () {\n window.dataLayer.push(arguments);\n };\n\nexport const ga = (window.ga =\n window.ga ||\n function () {\n (ga.q = ga.q || []).push(arguments);\n });\n","// packages\nimport delay from 'underscore/modules/delay.js';\n\n// local\nimport { gtag } from './ga.js';\n\n/**\n * Track a user interaction in GA.\n */\nexport function trackEvent(eventName, eventData = {}) {\n // Convert legacy event format to GA4 format\n if (typeof eventData === 'string') {\n eventData = convertLegacyEvent(...arguments);\n eventName = eventData.event_name;\n }\n\n try {\n gtag('event', eventName, eventData);\n } catch (e) {\n console.warn('error reporting event', eventData);\n }\n}\n\n/**\n * Convert a Universal analytics style event into GA4 format.\n */\nfunction convertLegacyEvent(\n category,\n action,\n label = '',\n value = undefined,\n options = {}\n) {\n return {\n event_name: `${category}_${action}`,\n event_category: category,\n event_action: action,\n event_label: label,\n event_value: value,\n };\n}\n\n/**\n * Track a non-interactive event in GA.\n */\nexport function trackPassiveEvent(\n category,\n action,\n label = '',\n value = undefined\n) {\n const passiveOptions = { nonInteraction: 1 };\n return trackEvent(category, action, label, value, passiveOptions);\n}\n\nexport const trackParselyConversion = (function () {\n // make a queue for conversion events\n const parselyConversionEventQueue = [];\n\n // wrapper function safely handles either case\n const capture = (type, label) => {\n if (window.PARSELY && window.PARSELY.loaded) {\n report(type, label);\n } else {\n parselyConversionEventQueue.push([type, label]);\n }\n };\n\n const report = function (type, label) {\n try {\n window.PARSELY.conversions[type](label);\n // console.log('reported', type, label)\n } catch (e) {\n console.log(\n `Error reporting Parsely conversion. type: ${type}, label: ${label}, error: ${e}`\n );\n }\n };\n\n // Preload an event if it's present in the bootstrap\n if (window.TMPBootstrapData && window.TMPBootstrapData.parselyConversion) {\n const conversion = window.TMPBootstrapData.parselyConversion;\n capture(conversion.type, conversion.label);\n }\n\n // flush the queue when the tracker loads\n window.PARSELY = window.PARSELY || {\n onload: function () {\n delay(() => {\n parselyConversionEventQueue.forEach((event) => {\n report(event[0], event[1]);\n });\n });\n },\n };\n\n return capture;\n})();\n\nexport function trackParselyNewsletterConversion(label) {\n trackParselyConversion('trackNewsletterSignup', label);\n}\n\nexport function trackParselyMonthlyDonationConversion(label) {\n trackParselyConversion('trackSubscription', label);\n}\n\nexport function trackParselyDonationConversion(label) {\n trackParselyConversion('trackPurchase', label);\n}\n\nexport function trackParselyCustomConversion(label) {\n trackParselyConversion('trackCustom', label);\n}\n\n// Make this available site-wide for graphics\nwindow.TMPAnalytics = window.TMPAnalytics || {};\nwindow.TMPAnalytics.trackConversion = trackParselyCustomConversion;\nwindow.TMPAnalytics.trackEvent = trackEvent;\n// For backwards compatibility with old graphics.\nwindow.report = trackEvent;\n","import { useState } from 'react';\nimport cx from 'classnames';\nimport { SlideDown } from 'react-slidedown';\nimport 'react-slidedown/lib/slidedown.css';\n\nconst FALLBACK_TITLE = 'We keep the spotlight on criminal justice.';\nconst FALLBACK_BODY =\n 'Our journalism establishes facts, exposes failures and examines solutions for a criminal justice system in crisis. If you believe in what we do, become a member today.';\n\nexport default function Pitch({ copyOptions }) {\n const [collapsed, setCollapsed] = useState(true);\n\n const { title, body } = copyOptions;\n\n const renderedBody =
;\n\n const fallbackBody =

{FALLBACK_BODY}

;\n\n return (\n
\n
\n

{title || FALLBACK_TITLE}

\n
\n {body ? renderedBody : fallbackBody}\n
\n
\n setCollapsed(!collapsed)}\n >\n Benefits of giving to The Marshall Project\n
\n \n {!collapsed && (\n
    \n
  • \n A tri-annual \"Impact Report\" on the difference our journalism\n has made.\n
  • \n
  • \n An annual analysis on criminal justice reform by\n Editor-in-Chief Susan Chira.\n
  • \n
  • \n Early access and discounted or free tickets to criminal\n justice-related special events.\n
  • \n
\n )}\n
\n
\n
\n \n );\n}\n","import { Component } from 'react';\n\nexport default class MoneySelector extends Component {\n constructor(props) {\n super(props);\n this.state = { open: false, ignoreFocus: false };\n }\n\n onChange(event) {\n let value = parseInt(event.target.value.replace('$', ''), 10);\n if (isNaN(value)) {\n value = '';\n }\n if (value < 0) {\n value = Math.abs(value);\n }\n this.props.onChange(value);\n }\n\n handleFocus(event) {\n if (this.state.ignoreFocus) {\n this.setState({ ignoreFocus: false });\n } else {\n this.setState({ open: true });\n }\n }\n\n handleBlur(event) {\n this.setState({ open: false });\n }\n\n handleSelection(value) {\n if (value === 'other') {\n this.setState({ open: false, ignoreFocus: true }, () => {\n _.delay(() => {\n this.input.focus();\n }, 1);\n });\n } else {\n this.props.onChange(value);\n }\n }\n\n getOptionValues() {\n if (this.props.frequency === 'monthly') {\n return {\n 15: '$15',\n 25: '$25',\n 35: '$35',\n other: 'Other',\n };\n } else {\n return {\n 50: '$50',\n 100: '$100',\n 250: '$250',\n 1000: '$1,000',\n other: 'Other',\n };\n }\n }\n\n render() {\n const optionValues = this.getOptionValues();\n const options = Object.keys(optionValues).map((key) => {\n return (\n \n {optionValues[key]}\n \n );\n });\n const optionsMarkup = (\n
\n {options}\n
\n );\n\n let className = '';\n if (this.props.errors && this.props.errors.donationAmount) {\n className = 'error';\n }\n\n return (\n
\n {\n this.input = i;\n }}\n autoComplete=\"off\"\n type=\"number\"\n value={this.props.value}\n name=\"amount\"\n placeholder=\"\"\n onChange={this.onChange.bind(this)}\n onFocus={this.handleFocus.bind(this)}\n onBlur={this.handleBlur.bind(this)}\n />\n $\n {this.state.open && optionsMarkup}\n
\n );\n }\n}\n","/**\n * @param {object} props\n * @param {boolean} props.desired\n * @param {React.MouseEventHandler} props.onToggle\n */\nexport default function BenefitOption({ desired, onToggle }) {\n const text = desired ? 'Not interested?' : 'Changed your mind?';\n\n return (\n \n \n ({text})\n \n \n );\n}\n","export const MONTHLY_THRESHOLD = 60;\nexport const ONE_TIME_THRESHOLD = 75;\n\nexport function getAnnualTotal(amount, frequency) {\n const multiplier = frequency === 'monthly' ? 12 : 1;\n return amount * multiplier;\n}\n\nexport function getAdditionalForBenefit(amount, frequency) {\n const multiplier = frequency === 'monthly' ? 12 : 1;\n return (\n (getBenefitThreshold(frequency) - getAnnualTotal(amount, frequency)) /\n multiplier\n );\n}\n\nexport function receivingBenefit(amount, frequency) {\n return getAnnualTotal(amount, frequency) >= getBenefitThreshold(frequency);\n}\n\nexport function getAmountWithFees(amount, coverFees) {\n const numericAmount = parseInt(amount, 10);\n if (coverFees) {\n return (\n numericAmount + Math.round((numericAmount * 0.029 + 0.3) * 100) / 100\n );\n } else {\n return numericAmount;\n }\n}\n\nexport function formatMoney(amount) {\n const number = Number(amount);\n if (Number.isInteger(number)) {\n return number.toFixed(0);\n } else if (Number.isNaN(number)) {\n return amount;\n } else {\n return number.toFixed(2);\n }\n}\n\nfunction getBenefitThreshold(frequency) {\n if (frequency == 'once' || frequency == 'annually') {\n return ONE_TIME_THRESHOLD;\n } else {\n return MONTHLY_THRESHOLD;\n }\n}\n","import { Component } from 'react';\nimport BenefitOption from './benefitoption.js';\nimport { getAdditionalForBenefit, receivingBenefit } from './shared.js';\n\nexport default class MembershipBenefitPanel extends Component {\n getAdditionalString() {\n const num = getAdditionalForBenefit(\n this.props.amount,\n this.props.frequency\n );\n return Math.ceil(num * 100) / 100;\n }\n\n getAdditionalFrequency() {\n if (this.props.frequency === 'monthly') {\n return 'per month';\n }\n\n return '';\n }\n\n render() {\n let className = '';\n let message;\n let shouldDisplayOption = false;\n if (!this.props.benefitDesired) {\n shouldDisplayOption = true;\n message = You have chosen not to get a tote bag.;\n } else if (this.props.amount == '') {\n message = '';\n } else if (receivingBenefit(this.props.amount, this.props.frequency)) {\n shouldDisplayOption = true;\n className = 'highlighted';\n message = You get a tote bag!;\n } else {\n message = (\n \n Give ${this.getAdditionalString()} more{' '}\n {this.getAdditionalFrequency()} to get a tote bag.\n \n );\n }\n\n return (\n
\n
\n {message}{' '}\n {shouldDisplayOption && (\n \n )}\n
\n
\n );\n }\n}\n","import { Component } from 'react';\n\nexport default class Button extends Component {\n constructor(props) {\n super(props);\n this.state = {};\n }\n\n handleKeyPress(event) {\n if (event.keyCode === 10 || event.keyCode === 13) {\n this.props.onClick();\n }\n }\n\n render() {\n const extraProps = {};\n\n if (this.props.id) {\n extraProps.id = this.props.id;\n }\n\n if (this.props.disabled) {\n extraProps.disabled = this.props.disabled;\n }\n\n return (\n \n {this.props.text}\n \n );\n }\n}\n","import { Component } from 'react';\nimport Button from '../shared/button.js';\n\nexport default class RecurringNudge extends Component {\n render() {\n return (\n
\n

\n Thank you for becoming a member of The Marshall Project. Showing your\n support through a monthly donation makes our future more secure, which\n means that we can continue to publish journalism with impact.\n

\n

\n Would you please consider a monthly contribution to sustain our work?\n

\n
\n \n \n
\n
\n );\n }\n}\n","import { Component } from 'react';\n\nexport default class CustomSelect extends Component {\n constructor(props) {\n super(props);\n this.state = { open: false };\n }\n\n handleSelection(key) {\n this.setState({ open: false });\n this.props.onChange(key);\n }\n\n handleFocus() {\n this.setState({ open: true });\n }\n\n handleBlur() {\n this.setState({ open: false });\n }\n\n render() {\n const options = Object.keys(this.props.options).map((key) => {\n return (\n \n {this.props.options[key]}\n \n );\n });\n const optionsMarkup = (\n
{options}
\n );\n return (\n
\n \n {this.state.open && optionsMarkup}\n \n
\n );\n }\n}\n","import CustomSelect from '../shared/customselect.js';\n\nexport const FREQUENCY_OPTIONS = {\n annually: 'annually',\n monthly: 'monthly',\n once: 'once',\n};\n\n/**\n *\n * @param {object} props\n * @param {string} props.value\n * @param {(frequency: string) => void} props.onChange\n */\nexport default function FrequencySelector({ value, onChange }) {\n return (\n \n );\n}\n","import Button from '../shared/button.js';\n\nexport default function NextButton(props) {\n return (\n
\n
\n );\n}\n","export function createValidator(rules) {\n return (values = {}) => {\n const errors = {};\n Object.keys(rules).forEach((field) => {\n const fieldRules = rules[field];\n const fieldErrors = unique(fieldRules\n .map((rule) => rule(values[field], field, values))\n .filter((error) => Boolean(error)));\n const fieldError = `${fieldErrors.join(', ')}${fieldErrors.length ? '.' : ''}`;\n\n if (fieldError) {\n errors[field] = fieldError;\n }\n });\n\n return errors;\n };\n}\n\n\nexport function required(value) {\n const errorMessage = `is required`;\n\n if (!value && typeof value !== 'number') {\n return errorMessage;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return errorMessage;\n }\n\n if (typeof value === 'string' && value.trim() === '') {\n return errorMessage;\n }\n\n return false;\n}\n\n\nexport function isNumber(value) {\n const errorMessage = `must be a number`;\n\n if (typeof value === 'string') {\n value = parseInt(value, 10);\n }\n\n if (isNaN(value)) {\n return errorMessage;\n }\n\n if (typeof value !== 'number') {\n return errorMessage;\n }\n\n return false;\n}\n\n\nexport function min(num) {\n return (value, fieldName) => {\n const numberError = isNumber(value, fieldName);\n if (numberError) {\n return numberError;\n }\n\n if (typeof value === 'string') {\n value = parseInt(value, 10);\n }\n\n if (value < num) {\n return `must be at least ${num}`;\n }\n\n return false;\n };\n}\n\n\nexport function max(num) {\n return (value, fieldName) => {\n const numberError = isNumber(value, fieldName);\n if (numberError) {\n return numberError;\n }\n\n if (typeof value === 'string') {\n value = parseInt(value, 10);\n }\n\n if (value > num) {\n return `${fieldName} must be at most ${num}`;\n }\n\n return false;\n };\n}\n\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nexport function isEmail(value) {\n const errorMessage = `is not valid`;\n\n if (!EMAIL_RE.test(value)) {\n return errorMessage;\n }\n\n return false;\n}\n\n\nfunction unique(arr) {\n const hash = {};\n return arr.filter((val) => {\n const alreadyPresent = hash[val];\n hash[val] = true;\n return !alreadyPresent;\n });\n}\n","import { Component } from 'react';\nimport MoneySelector from './moneyselector.js';\nimport MembershipBenefitPanel from './membershipbenefitpanel.js';\nimport RecurringNudge from './recurringnudge.js';\nimport FrequencySelector, { FREQUENCY_OPTIONS } from './frequencyselector.js';\nimport NextButton from './nextbutton.js';\nimport { createValidator, required, min } from '../shared/validators.js';\nimport { trackEvent } from '../analytics/helpers.js';\nimport { getUrlParameter, isNullOrUndefined } from '../../shared/utils';\nimport { formatMoney } from './shared.js';\n\nconst DEFAULT_MONTHLY_VALUE = 15; // dollars\nconst DEFAULT_ANNUAL_VALUE = 50;\nconst DEFAULT_ONCE_VALUE = 100;\nconst MINIMUM_ONCE_DONATION_AMOUNT = 5;\nconst MINIMUM_RECURRING_DONATION_AMOUNT = 3;\n\nconst recurringValidator = createValidator({\n donationAmount: [required, min(MINIMUM_RECURRING_DONATION_AMOUNT)],\n});\n\nconst onceValidator = createValidator({\n donationAmount: [required, min(MINIMUM_ONCE_DONATION_AMOUNT)],\n});\n\nexport default class SupportIntent extends Component {\n constructor(props) {\n super(props);\n this.state = this.getInitialState(props);\n }\n\n getInitialState(props) {\n let amount =\n parseInt(getUrlParameter('amount'), 10) || props.savedDonationAmount;\n let urlPeriod = getUrlParameter('period') || props.savedDonationFrequency;\n\n if (isNaN(amount) || amount === 0) {\n amount = this.getDefaultAmount(urlPeriod);\n }\n\n if (amount < 0) {\n amount = Math.abs(amount);\n }\n\n if (isNullOrUndefined(FREQUENCY_OPTIONS[urlPeriod])) {\n urlPeriod = undefined;\n }\n\n return {\n donationAmount: amount,\n donationFrequency: urlPeriod || 'monthly',\n benefitDesired: true,\n amountSet: false,\n coverFees: props.coverFees,\n };\n }\n\n getDefaultAmount(frequency) {\n if (frequency === 'annually') {\n return DEFAULT_ANNUAL_VALUE;\n } else if (frequency === 'once') {\n return DEFAULT_ONCE_VALUE;\n } else {\n return DEFAULT_MONTHLY_VALUE;\n }\n }\n\n getRecommendedRecurringAmount() {\n return Math.max(5, Math.ceil(this.state.donationAmount / 12));\n }\n\n getTotesEnabled() {\n return this.props.enableTotes == 'true';\n }\n\n validate(properties) {\n const validator =\n properties.donationFrequency === FREQUENCY_OPTIONS.once\n ? onceValidator\n : recurringValidator;\n const errors = validator(properties);\n this.setState({ errors: errors });\n return errors;\n }\n\n valid() {\n return !this.state.errors || Object.keys(this.state.errors).length === 0;\n }\n\n updateAmount(amount) {\n const newState = Object.assign({}, this.state, {\n donationAmount: amount,\n amountSet: true,\n });\n this.setState(newState);\n this.validate(newState);\n }\n\n updateFrequency(frequency, cb = undefined) {\n this.setState((state, props) => {\n const updatedState = {\n donationFrequency: frequency,\n };\n\n if (!state.amountSet) {\n updatedState.donationAmount = this.getDefaultAmount(frequency);\n }\n\n return updatedState;\n }, cb);\n }\n\n handleNudgeAgreement() {\n const amount = this.getRecommendedRecurringAmount();\n trackEvent('checkout', 'agreed-recurring', '', amount);\n this.updateAmount(amount);\n this.updateFrequency(FREQUENCY_OPTIONS.monthly, () => this.handleNext());\n }\n\n handleNudgeDecline() {\n trackEvent('checkout', 'decline-recurring', '', this.state.donationAmount);\n this.handleNext();\n }\n\n handleCoverFeesChange(event) {\n this.setState({ coverFees: event.target.checked });\n }\n\n toggleBenefitDesired() {\n this.setState({\n benefitDesired: !this.state.benefitDesired,\n });\n }\n\n handleNext() {\n const errors = this.validate(this.state);\n if (this.valid()) {\n this.props.onComplete(this.state);\n }\n }\n\n coverFeesOption() {\n return (\n
\n \n
\n );\n }\n\n render() {\n let className = '';\n if (!this.props.active && this.props.complete) {\n className += ' support-section-complete';\n }\n\n return (\n
\n {this.props.active && this.renderActive()}\n {!this.props.active && this.props.complete && this.renderComplete()}\n
\n );\n }\n\n renderActive() {\n return (\n
\n \n Yes, I will contribute{' '}\n \n \n \n {this.coverFeesOption()}\n {this.getTotesEnabled() && (\n \n )}\n {this.renderCTA()}\n {this.getTotesEnabled() && (\n
\n \n
\n )}\n
\n );\n }\n\n renderComplete() {\n return (\n
\n

Contribution

\n \n Contributing ${formatMoney(this.props.savedDonationAmount)}{' '}\n {this.props.savedDonationFrequency}.\n \n
\n );\n }\n\n renderCTA() {\n if (\n this.state.donationFrequency == FREQUENCY_OPTIONS.once &&\n this.valid()\n ) {\n return (\n \n );\n } else if (!this.valid()) {\n return (\n

\n \n We do not accept less than ${MINIMUM_RECURRING_DONATION_AMOUNT} for\n recurring donations or less than ${MINIMUM_ONCE_DONATION_AMOUNT} for\n one-time donations.\n \n

\n );\n } else {\n return (\n \n );\n }\n }\n}\n","import { Component } from 'react';\n\nexport default class FormField extends Component {\n constructor(props) {\n super(props);\n this.state = { touched: props.element };\n }\n\n componentDidMount() {\n if (this.props.autoFocus) {\n this.input.focus();\n }\n }\n\n handleBlur() {\n this.setState({ touched: true });\n }\n\n render() {\n let className = `minimal-field ${this.props.className}`;\n const error = this.props.errors && this.props.errors[this.props.name];\n let label = this.props.label || this.props.name;\n\n if (error) {\n className += ' error';\n label += ' ' + error;\n }\n\n let input;\n let id = this.props.name + '-field';\n if (!this.props.element) {\n input = (\n (this.input = input)}\n name={this.props.name}\n />\n );\n } else {\n input = this.props.children;\n }\n\n return (\n
\n {input}\n \n
\n );\n }\n}\n","// packages\nimport cx from 'classnames';\n\n/**\n * @param {object} props\n * @param {string} props.className\n * @param {boolean} props.disabled\n * @param {Record} props.errors\n * @param {string} props.label\n * @param {string} props.name\n * @param {React.ChangeEvent} props.onChange\n * @param {{name: string, value: string}[]} props.options\n * @param {string} props.value\n * @returns {JSX.Element}\n */\nexport default function SelectFormField({\n className,\n disabled = false,\n errors = {},\n label = name,\n name,\n onChange,\n options,\n value,\n}) {\n const id = `${name}-field`;\n const error = errors[name];\n\n if (error) {\n label += ` ${error}`;\n }\n\n return (\n
\n
\n \n \n {options.map((option) => (\n \n ))}\n \n \n
\n \n
\n );\n}\n","// packages\nimport { useState } from 'react';\nimport cx from 'classnames';\n\n// local\nimport FormField from '../shared/formfield.js';\nimport SelectFormField from '../shared/selectformfield.js';\nimport NextButton from './nextbutton.js';\nimport { useCountries, useSubdivisions } from './hooks.js';\nimport { createValidator, required, isEmail } from '../shared/validators.js';\n\nconst validator = createValidator({\n firstName: [required],\n lastName: [required],\n email: [required, isEmail],\n zip: [required],\n});\n\nconst shippingValidator = createValidator({\n firstName: [required],\n lastName: [required],\n email: [required, isEmail],\n address1: [required],\n city: [required],\n state: [required],\n country: [required],\n zip: [required],\n});\n\n// some countries do not have states/provinces/regions\nconst noSubdivisionsShippingValidator = createValidator({\n firstName: [required],\n lastName: [required],\n email: [required, isEmail],\n address1: [required],\n city: [required],\n country: [required],\n zip: [required],\n});\n\n/**\n * @param {object} props\n * @param {boolean} props.active\n * @param {boolean} props.complete\n * @param {Record} props.contactInfo\n * @param {(values: object) => void} props.onComplete\n * @param {boolean} props.receivingBenefit\n */\nexport default function ContactInfoForm({\n active,\n complete,\n contactInfo,\n onComplete,\n receivingBenefit,\n}) {\n const [values, setValues] = useState(contactInfo);\n const [errors, setErrors] = useState({});\n\n const countries = useCountries();\n const subdivisions = useSubdivisions(values.country);\n const noSubdivisions = subdivisions.length === 0;\n\n /**\n * @param {React.ChangeEvent} event\n */\n function handleChange(event) {\n const { name, value } = event.target;\n\n const newValues = Object.assign({}, values, {\n [name]: value,\n });\n\n // we need to un-set \"state\" if \"country\" has changed\n if (values.country !== newValues.country) {\n newValues.state = '';\n }\n\n setValues(newValues);\n }\n\n // Returns an object of { fieldName: 'Error message' } or false if valid.\n function validate(values) {\n let errors;\n\n if (receivingBenefit) {\n if (noSubdivisions) {\n errors = noSubdivisionsShippingValidator(values);\n } else {\n errors = shippingValidator(values);\n }\n } else {\n errors = validator(values);\n }\n\n setErrors(errors);\n\n return errors;\n }\n\n /**\n *\n * @param {React.FormEvent} event\n */\n function handleNext(event) {\n event.preventDefault();\n\n const errors = validate(values);\n\n if (Object.keys(errors).length === 0) {\n onComplete(values);\n }\n }\n\n const className = cx('contact-info-form', {\n 'shipping-benefits': receivingBenefit,\n 'support-section-complete': !active && complete,\n });\n\n return (\n
\n

Contact Info

\n {active && (\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n )}\n {!active && complete && }\n
\n );\n}\n\n/**\n *\n * @param {object} props\n * @param {Record} props.contactInfo\n */\nfunction ContactFormComplete({ contactInfo: savedInfo }) {\n return (\n
\n
{compactJoin([savedInfo.firstName, savedInfo.lastName], ' ')}
\n
{compactJoin([savedInfo.email, savedInfo.phone], ' ยท ')}
\n
{compactJoin([savedInfo.address1, savedInfo.address2], ', ')}
\n
\n {compactJoin([savedInfo.city, savedInfo.state, savedInfo.zip], ', ')}\n
\n
{savedInfo.country}
\n
\n );\n}\n\nfunction compactJoin(list, separator) {\n const compactList = list.filter((x) => !!x);\n return compactList.join(separator);\n}\n","// packages\nimport { useEffect, useState } from 'react';\n\n// local\nimport http from '$shared/http.js';\n\nexport function useCountries() {\n const [countries, setCountries] = useState([]);\n\n useEffect(() => {\n http\n .get('/donate/countries')\n .json()\n .then((data) => {\n setCountries(data);\n });\n }, []);\n\n return countries;\n}\n\nexport function useSubdivisions(countryCode) {\n const [subdivisions, setSubdivisions] = useState([]);\n\n useEffect(() => {\n http\n .get(`/donate/countries/${countryCode}`)\n .json()\n .then((data) => {\n setSubdivisions(data);\n });\n }, [countryCode]);\n\n return subdivisions;\n}\n","import { Component } from 'react';\n\nexport default class ProgressLogo extends Component {\n constructor(props) {\n super(props);\n this.state = { logoPhase: 0 };\n this.timeout = window.setTimeout(this.animateLogos.bind(this), 300);\n }\n\n animateLogos() {\n this.setState({ logoPhase: (this.state.logoPhase + 1) % 6 });\n this.timeout = window.setTimeout(this.animateLogos.bind(this), 300);\n }\n\n componentWillUnmount() {\n window.clearTimeout(this.timeout);\n }\n\n render() {\n return (\n
\n
\n \n {this.state.logoPhase === 0 && (\n \n \n \n \n \n \n )}\n {(this.state.logoPhase === 1 || this.state.logoPhase === 5) && (\n \n \n \n \n \n \n \n \n \n \n )}\n {(this.state.logoPhase === 2 || this.state.logoPhase === 4) && (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n {this.state.logoPhase === 3 && (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n \n
\n
\n );\n }\n}\n","import React, { useEffect, useState } from 'react';\nimport {\n PaymentElement,\n LinkAuthenticationElement,\n useStripe,\n useElements,\n} from '@stripe/react-stripe-js';\n\nimport Button from '../shared/button.js';\nimport ProgressLogo from './progresslogo.js';\nimport { getAmountWithFees, formatMoney } from './shared.js';\n\nexport default function StripeForm(props) {\n const stripe = useStripe();\n const elements = useElements();\n\n const [email, setEmail] = useState('');\n const [message, setMessage] = useState(null);\n const [isLoading, setIsLoading] = useState(false);\n\n const handleSubmit = async (e) => {\n e.preventDefault();\n\n if (!stripe || !elements) {\n // Stripe.js hasn't yet loaded.\n // Make sure to disable form submission until Stripe.js has loaded.\n return;\n }\n\n setIsLoading(true);\n\n const { error } = await stripe.confirmPayment({\n elements,\n confirmParams: {\n return_url: `${window.location.origin}/donate/newsletters`,\n },\n });\n\n // This point will only be reached if there is an immediate error when\n // confirming the payment. Otherwise, your customer will be redirected to\n // your `return_url`. For some payment methods like iDEAL, your customer will\n // be redirected to an intermediate site first to authorize the payment, then\n // redirected to the `return_url`.\n if (error.type === 'card_error') {\n setMessage(error.message);\n } else if (error.type === 'validation_error') {\n // These are displayed in the stripe UI.\n } else {\n setMessage(`An unexpected error occurred. ${error.message}`);\n }\n\n setIsLoading(false);\n };\n\n const getButtonText = function () {\n const amountString = formatMoney(\n getAmountWithFees(props.amount, props.coverFees)\n );\n let text = `Contribute $${amountString}`;\n\n if (props.frequency !== 'Once') {\n text += ' ' + props.frequency;\n }\n\n return text;\n };\n\n const stripeOptions = {\n defaultValues: {\n billingDetails: {\n name: `${props.contactInfo.firstName} ${props.contactInfo.lastName}`,\n email: props.contactInfo.email,\n phone: props.contactInfo.phone,\n address: {\n line1: props.contactInfo.address1,\n line2: props.contactInfo.address2,\n country: props.contactInfo.country,\n state: props.contactInfo.state,\n city: props.contactInfo.city,\n postal_code: props.contactInfo.zip,\n },\n },\n },\n };\n\n return (\n
\n \n \n {isLoading && }\n {/* Show any error or success messages */}\n {message && (\n
\n {message}\n
\n )}\n \n );\n}\n","import { Component } from 'react';\n\nimport StripeForm from './stripeform.js';\nimport PayPalForm from './paypalform.js';\n\nexport default class PaymentForm extends Component {\n render() {\n let className = '';\n if (!this.props.active && this.state.complete) {\n className += ' support-section-complete';\n }\n\n return (\n
\n
\n

Payment

\n
\n {this.props.active && this.renderActive()}\n {!this.props.active && this.state.complete && this.renderComplete()}\n
\n );\n }\n\n renderActive() {\n return (\n
\n \n
\n );\n }\n\n renderComplete() {\n const card = this.props.savedPaymentToken.card;\n return `${card.brand} ending in ${card.last4}`;\n }\n}\n","import cx from 'classnames';\n\nexport default function SupportSection({\n active,\n complete,\n onActivate,\n noEdit,\n children,\n}) {\n if (!active && !complete) {\n return
;\n }\n\n const controls = (\n \n );\n\n return (\n \n
{children}
\n {!active && complete && !noEdit && controls}\n
\n );\n}\n","import { trackEvent } from '../analytics/helpers.js';\n\n/**\n * Track a step of the checkout process using Google Analytics and their\n * recommended events. See https://developers.google.com/analytics/devguides/collection/ga4/reference/events?sjid=8256709344012883295-NA&client_type=gtag#purchase\n *\n * @param {string} step - The step of the checkout process\n * @param {Object} currentState - The current state of the checkout process\n * @param {number} currentState.donationAmount - The amount of the donation\n * @param {string} currentState.donationFrequency - The frequency of the\n * donation\n * @param {string} currentState.benefitDesired - Whether the donor wants to\n * receive a benefit\n * @param {string[]} currentState.subscriptions - The subscriptions the donor\n * wants to sign up for\n */\nexport function trackCheckoutStep(step, currentState) {\n if (step === 'intent') {\n trackEvent('begin_checkout', formatEventData(currentState));\n } else if (step === 'contact') {\n trackEvent('add_shipping_info', formatEventData(currentState));\n } else if (step === 'payment') {\n trackEvent('add_payment_info', {\n payment_type: 'Stripe',\n ...formatEventData(currentState),\n });\n } else if (step === 'review') {\n trackEvent('purchase', {\n newsletters: currentState.subscriptions,\n cover_fees: currentState.coverFees,\n ...formatEventData(currentState),\n });\n }\n}\n\n/**\n * Format the data for a GA4 event.\n * @param {Object} currentState - The current state of the checkout process\n * @param {number} currentState.donationAmount - The amount of the donation\n * @param {string} currentState.donationFrequency - The frequency of the\n * donation\n * @param {string} currentState.benefitDesired - Whether the donor wants to\n * receive a benefit\n * @returns {Object} - The formatted data\n * @private\n */\nfunction formatEventData(currentState) {\n return {\n currency: 'USD',\n value: currentState.donationAmount,\n donation_frequency: currentState.donationFrequency,\n benefit_desired: currentState.benefitDesired,\n items: [\n {\n item_name: `Donate ${currentState.donationFrequency}`,\n },\n ],\n };\n}\n","import {\n getUrlParameter,\n getBootstrapData,\n isNullOrUndefined,\n} from '$shared/utils.js';\n\nexport function getInitialState() {\n const notice = getBootstrapData('donate_error', true) || null;\n const inboundVia = getUrlParameter('via') || 'unknown';\n\n // Cover fees should always start as false, even if it was agreed to\n // initially and this is a page refresh. The backend stores the amount\n // that will actually be paid, not the amount without the fees, so the\n // amount being passed in here either already includes the fees and they\n // shouldn't be included again, or it doesn't because the donor didn't\n // opt in and it should be remain that way.\n const coverFees = false;\n\n return {\n coverFees,\n notice,\n inboundVia,\n error: null,\n ...getContactInfo(),\n ...getPaymentState(),\n ...getDonationState(),\n ...getInitialStepState(),\n };\n}\n\nfunction getInitialStepState() {\n const correctionStep = getUrlParameter('donate_step') || null;\n let step = 'intent';\n let completedSteps = [];\n\n if (correctionStep === 'contact') {\n step = 'contact';\n completedSteps = ['intent'];\n } else if (correctionStep === 'payment') {\n step = 'payment';\n completedSteps = ['intent', 'contact'];\n }\n\n return {\n step,\n completedSteps,\n };\n}\n\nfunction getDonationState() {\n const donation = getBootstrapData('donation', true) || {};\n let donationAmount = Number(donation.amount);\n if (Number.isNaN(donationAmount)) {\n donationAmount = 15;\n }\n\n let benefitDesired = donation.benefit_desired;\n if (isNullOrUndefined(benefitDesired)) {\n benefitDesired = true;\n }\n\n return {\n donationFrequency: donation.frequency || 'monthly',\n donationAmount,\n benefitDesired,\n };\n}\n\nfunction getContactInfo() {\n const donor = getBootstrapData('donor', true) || {};\n return {\n contactInfo: {\n firstName: donor.first_name || '',\n lastName: donor.last_name || '',\n email: donor.email || '',\n phone: donor.phone || '',\n address1: donor.address1 || '',\n address2: donor.address2 || '',\n country: donor.country || 'US', // default to US for now\n state: donor.state || '',\n city: donor.city || '',\n zip: donor.zip || '',\n },\n };\n}\n\nfunction getPaymentState() {\n const payment = getBootstrapData('payment', true) || {};\n\n return {\n paymentIntentId: payment.platform_id || null,\n clientSecret: getUrlParameter('client_secret') || null,\n };\n}\n","// packages\nimport { Component } from 'react';\nimport { loadStripe } from '@stripe/stripe-js';\nimport { Elements } from '@stripe/react-stripe-js';\nimport scrollToComponent from 'react-scroll-to-component';\n\n// local\nimport Pitch from './pitch.js';\nimport SupportIntent from './supportintent.js';\nimport ContactInfoForm from './contactinfoform.js';\nimport PaymentForm from './paymentform.js';\nimport SupportSection from './supportsection.js';\nimport { trackEvent } from '../analytics/helpers.js';\nimport { trackCheckoutStep } from './analytics.js';\nimport http from '$shared/http.js';\nimport { isMobileViewport } from '$shared/utils.js';\nimport { receivingBenefit, getAmountWithFees } from './shared.js';\nimport { getInitialState } from './state.js';\n\nconst STEPS = ['intent', 'contact', 'payment', 'complete'];\n\nconst stripePromise = loadStripe(window.TMPStripePublishableKey);\n\nexport default class SupportPage extends Component {\n constructor(props) {\n super(props);\n this.state = getInitialState();\n }\n\n markStepComplete(step) {\n let completedSteps = this.state.completedSteps;\n let firstCompletion = false;\n\n // Send GA virtual page view if this is the first time we've completed this step\n if (!completedSteps.includes(step)) {\n completedSteps = [...completedSteps, step];\n firstCompletion = true;\n }\n const nextStep = STEPS.find((step) => !completedSteps.includes(step));\n\n this.setState({ completedSteps, step: nextStep }, () => {\n trackCheckoutStep(step, this.state);\n this.scrollToSection(nextStep);\n });\n }\n\n handleActivate(section) {\n this.setState({ step: section }, () => {\n this.scrollToSection(section);\n });\n trackEvent('edit_completed_checkout_section', { section });\n }\n\n scrollToSection(section) {\n if (!isMobileViewport()) {\n return;\n }\n scrollToComponent(this[section], {\n align: 'top',\n offset: -80,\n duration: 300,\n });\n }\n\n intentComplete(data) {\n this.setState(\n {\n donationAmount: data.donationAmount,\n donationFrequency: data.donationFrequency,\n benefitDesired: data.benefitDesired,\n coverFees: data.coverFees,\n },\n () => this.fetchPaymentIntent()\n );\n this.markStepComplete('intent');\n }\n\n contactInfoComplete(info) {\n this.setState(\n {\n contactInfo: info,\n },\n () => this.save()\n );\n this.markStepComplete('contact');\n }\n\n fetchPaymentIntent() {\n http\n .post('/donate/payment-intent', {\n json: {\n amount: getAmountWithFees(\n this.state.donationAmount,\n this.state.coverFees\n ),\n frequency: this.state.donationFrequency,\n paymentIntentId: this.state.paymentIntentId,\n },\n })\n .json()\n .then((data) => {\n if (data.clientSecret) {\n this.setState({\n clientSecret: data.clientSecret,\n paymentIntentId: data.id,\n });\n }\n })\n .catch(async (error) => {\n const data = await error.response.json();\n\n console.log('Error fetching payment intent', data);\n this.setState({\n clientSecret: null,\n error: data.error || 'Something went wrong processing your donation.',\n });\n });\n }\n\n save() {\n http\n .post('/donate/save-details', {\n json: {\n inboundVia: this.state.inboundVia,\n amount: getAmountWithFees(\n this.state.donationAmount,\n this.state.coverFees\n ),\n coverFees: this.state.coverFees,\n paymentIntentId: this.state.paymentIntentId,\n email: this.state.contactInfo.email,\n contactInfo: this.state.contactInfo,\n frequency: this.state.donationFrequency.toLowerCase(),\n benefitDesired: this.state.benefitDesired,\n },\n })\n .json()\n .then(() => {\n this.setState({\n error: null,\n });\n\n window.history.pushState(\n null,\n '',\n `/donate?payment_intent=${this.state.paymentIntentId}&client_secret=${this.state.clientSecret}&donate_step=payment`\n );\n })\n .catch(async (error) => {\n let errorMessage;\n try {\n const data = await error.response.json();\n errorMessage = data.error;\n } catch (e) {\n errorMessage = 'Something went wrong processing your donation.';\n }\n\n this.setState({\n error: errorMessage,\n });\n });\n }\n\n getStripeOptions() {\n return {\n clientSecret: this.state.clientSecret,\n appearance: {\n theme: 'night',\n variables: {\n colorPrimary: '#ff0b3a',\n colorDanger: '#ff0b3a',\n },\n },\n };\n }\n\n render() {\n return (\n
\n {this.renderNotice()}\n {!this.state.error && this.renderSections()}\n
\n );\n }\n\n renderSections() {\n return (\n
\n {this.state.step === 'intent' && (\n \n )}\n \n \n \n \n \n \n \n \n {this.state.clientSecret && (\n \n )}\n \n \n
\n );\n }\n\n renderNotice() {\n if (this.state.error) {\n return (\n
\n
{this.state.error}
\n

\n If the problem persists please contact{' '}\n \n support@themarshallproject.org\n \n

\n
\n );\n } else if (this.state.notice) {\n return (\n
\n
{this.state.notice}
\n

\n Please correct the problem below. If the problem persists please\n contact{' '}\n \n support@themarshallproject.org\n \n

\n
\n );\n }\n }\n}\n","import React from 'react';\nimport { render } from 'react-dom';\n\nimport SupportPage from './supportpage.js';\n\nconst container = document.getElementById('support-app-js');\n\nrender(\n \n \n ,\n container\n);\n","// packages\nimport ky from 'ky';\n\n/**\n * Returns the CSRF token from the meta tag. This is injected by Rails using\n * the `csrf_meta_tags` helper.\n *\n * @returns {string}\n */\nexport function getCsrfToken() {\n return document\n .querySelector(\"meta[name='csrf-token']\")\n ?.getAttribute('content');\n}\n\n/**\n * Audits whether a given URL is on the same origin as the current page. We do\n * not want to send the CSRF token to different origins because sometimes third-party\n * services will throw errors if they receive a header they don't expect.\n *\n * @private\n * @param {string} url\n * @returns {boolean}\n */\nfunction isUrlSameOrigin(url) {\n // it is a relative URL so same origin\n if (!url.startsWith('http')) {\n return true;\n }\n\n try {\n // if the hostname matches, it's the same origin\n return new URL(url).hostname === window.location.hostname;\n } catch (_) {\n // if something goes wrong with the URL parsing we err on the side of\n // caution and assume it's the same origin\n return true;\n }\n}\n\n/**\n * @param {Request} request\n */\nfunction applyCsrfTokenToRequest(request) {\n // only need the CSRF token for non-GET requests\n if (request.method !== 'GET') {\n // send CSRF token only with same origin requests\n if (isUrlSameOrigin(request.url)) {\n request.headers.set('X-CSRF-Token', getCsrfToken());\n }\n }\n}\n\nexport default ky.create({\n hooks: { beforeRequest: [applyCsrfTokenToRequest] },\n});\n","export function ensure(name, object, requiredKeys) {\n const errors = [];\n\n requiredKeys.forEach((key) => {\n if (isUndefined(object[key])) {\n errors.push(`Required key ${key} missing from options`);\n }\n });\n\n if (errors.length > 0) {\n throw new Error(`Error calling ${name}:\\n${errors.join('\\n')}`);\n }\n}\n\nexport function isNullOrUndefined(value) {\n return value === null || value === undefined;\n}\n\nexport function isUndefined(value) {\n return value === undefined;\n}\n\nexport function getBootstrapData(key, optional = false) {\n const value = window.TMPBootstrapData[key];\n\n if (!optional && isUndefined(value)) {\n throw new Error(`Required bootstrap value ${key} is absent \\\n did you forget to call set_bootstrap_data in the controller?`);\n }\n\n return value;\n}\n\nexport function abstractMethod(name) {\n throw new Error(\n `${name} is an abstract method and must be implemented in the child class`\n );\n}\n\nexport function getDomain(url) {\n const a = document.createElement('a');\n a.href = url;\n return a.hostname.replace('//www.', '//');\n}\n\nexport function isMobileViewport() {\n return window.innerWidth <= 768;\n}\n\n// Lifted from https://davidwalsh.name/query-string-javascript\nexport function getUrlParameter(name) {\n name = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n const regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)');\n const results = regex.exec(location.search);\n return results === null\n ? ''\n : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n}\n\n// Lifted from https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript\nexport function uuidv4() {\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\n (\n c ^\n (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))\n ).toString(16)\n );\n}\n\nexport function renderClassToElement(klass, selector, options = {}) {\n const $els = $(selector);\n\n if ($els.length > 0) {\n $els.each((index, el) => {\n const instance = new klass({ el });\n if (!options.skipRender) {\n instance.render();\n }\n });\n }\n}\n\nexport function whenElementExists(selectors, fn) {\n if (document.querySelector(selectors)) {\n fn();\n }\n}\n\nexport function dynamicRenderClassToElement(\n selectors,\n loadFn,\n { skipRender } = {}\n) {\n const els = document.querySelectorAll(selectors);\n const count = els.length;\n\n // we have one, keep going\n if (count > 0) {\n loadFn().then(({ default: Class }) => {\n for (let idx = 0; idx < count; idx++) {\n const el = els[idx];\n const instance = new Class({ el });\n\n if (!skipRender) {\n instance.render();\n }\n }\n });\n }\n}\n\nexport function loadScript(url) {\n const tag = document.createElement('script');\n tag.src = url;\n tag.async = true;\n document.body.append(tag);\n}\n"],"names":["window","dataLayer","gtag","push","arguments","ga","q","trackEvent","eventName","eventData","category","action","label","value","options","event_name","event_category","event_action","event_label","event_value","convertLegacyEvent","e","console","warn","trackParselyConversion","parselyConversionEventQueue","capture","type","PARSELY","loaded","report","conversions","log","TMPBootstrapData","parselyConversion","conversion","onload","forEach","event","trackParselyNewsletterConversion","TMPAnalytics","trackConversion","FALLBACK_TITLE","FALLBACK_BODY","Pitch","copyOptions","collapsed","setCollapsed","useState","title","body","renderedBody","dangerouslySetInnerHTML","__html","fallbackBody","className","onClick","closed","MoneySelector","Component","constructor","props","super","this","state","open","ignoreFocus","onChange","parseInt","target","replace","isNaN","Math","abs","handleFocus","setState","handleBlur","handleSelection","_","delay","input","focus","getOptionValues","frequency","other","render","optionValues","Object","keys","map","key","onMouseDown","bind","optionsMarkup","errors","donationAmount","ref","i","autoComplete","name","placeholder","onFocus","onBlur","BenefitOption","desired","onToggle","text","MONTHLY_THRESHOLD","ONE_TIME_THRESHOLD","getAnnualTotal","amount","receivingBenefit","getBenefitThreshold","getAmountWithFees","coverFees","numericAmount","round","formatMoney","number","Number","isInteger","toFixed","MembershipBenefitPanel","getAdditionalString","num","multiplier","getAdditionalForBenefit","ceil","getAdditionalFrequency","message","shouldDisplayOption","benefitDesired","toggleBenefitDesired","Button","handleKeyPress","keyCode","extraProps","id","disabled","role","tabIndex","onKeyDown","RecurringNudge","onAgree","recurringAmount","onDecline","CustomSelect","readOnly","FREQUENCY_OPTIONS","annually","monthly","once","FrequencySelector","NextButton","createValidator","rules","values","field","fieldErrors","arr","hash","filter","val","alreadyPresent","unique","rule","error","Boolean","fieldError","join","length","required","errorMessage","Array","isArray","trim","isNumber","min","fieldName","numberError","EMAIL_RE","isEmail","test","recurringValidator","onceValidator","SupportIntent","getInitialState","savedDonationAmount","urlPeriod","savedDonationFrequency","getDefaultAmount","donationFrequency","amountSet","getRecommendedRecurringAmount","max","getTotesEnabled","enableTotes","validate","properties","valid","updateAmount","newState","assign","updateFrequency","cb","updatedState","handleNudgeAgreement","handleNext","handleNudgeDecline","handleCoverFeesChange","checked","onComplete","coverFeesOption","viewBox","points","active","complete","renderActive","renderComplete","renderCTA","src","FormField","touched","element","componentDidMount","autoFocus","children","htmlFor","SelectFormField","option","validator","firstName","lastName","email","zip","shippingValidator","address1","city","country","noSubdivisionsShippingValidator","ContactInfoForm","contactInfo","setValues","setErrors","countries","setCountries","useEffect","http","json","then","data","useCountries","subdivisions","countryCode","setSubdivisions","useSubdivisions","noSubdivisions","handleChange","newValues","preventDefault","onSubmit","phone","address2","form","ContactFormComplete","savedInfo","compactJoin","list","separator","x","ProgressLogo","logoPhase","timeout","setTimeout","animateLogos","componentWillUnmount","clearTimeout","xmlns","StripeForm","stripe","useStripe","elements","useElements","setEmail","setMessage","isLoading","setIsLoading","stripeOptions","defaultValues","billingDetails","address","line1","line2","postal_code","PaymentElement","getButtonText","async","confirmPayment","confirmParams","return_url","location","origin","PaymentForm","card","savedPaymentToken","brand","last4","SupportSection","onActivate","noEdit","controls","formatEventData","currentState","currency","donation_frequency","benefit_desired","items","item_name","getInitialStepState","correctionStep","step","completedSteps","getDonationState","donation","getContactInfo","donor","first_name","last_name","getPaymentState","paymentIntentId","platform_id","clientSecret","STEPS","stripePromise","TMPStripePublishableKey","SupportPage","notice","inboundVia","markStepComplete","firstCompletion","includes","nextStep","find","payment_type","newsletters","subscriptions","cover_fees","trackCheckoutStep","scrollToSection","handleActivate","section","align","offset","duration","intentComplete","fetchPaymentIntent","contactInfoComplete","info","save","catch","response","toLowerCase","history","pushState","getStripeOptions","appearance","theme","variables","colorPrimary","colorDanger","renderNotice","renderSections","Elements","paymentToken","href","container","document","getElementById","dataset","getCsrfToken","querySelector","getAttribute","hooks","beforeRequest","request","method","url","startsWith","URL","hostname","isUrlSameOrigin","headers","set","ensure","object","requiredKeys","isUndefined","Error","isNullOrUndefined","getBootstrapData","optional","abstractMethod","isMobileViewport","innerWidth","getUrlParameter","results","RegExp","exec","search","decodeURIComponent","uuidv4","c","crypto","getRandomValues","Uint8Array","toString","renderClassToElement","klass","selector","$els","$","each","index","el","instance","skipRender","whenElementExists","selectors","fn","dynamicRenderClassToElement","loadFn","els","querySelectorAll","count","default","Class","idx","loadScript","tag","createElement","append"],"sourceRoot":""}