{"version":3,"sources":["webpack:///./node_modules/@polarnopyret/interactive-payment-gateway-adapter/index.tsx"],"names":["setLoading","isLoading","dispatch","type","detail","e","CustomEvent","ex","document","createEvent","initCustomEvent","dispatchEvent","props","state","model","snippet","JSON","parse","loadComponent","infoChangedHandler","bind","lockHandler","unlockHandler","failedHandler","reloadHandler","componentWillReceiveProps","nextProps","this","setState","Component","componentName","componentWillMount","window","addEventListener","componentWillUnmount","removeEventListener","cover","parentElement","removeChild","shouldComponentUpdate","nextState","onInfoChanged","reloadCart","visibleElement","keepGatewayEnabled","onLockInput","createElement","style","position","top","left","bottom","right","zIndex","backgroundColor","display","justifyContent","alignItems","inner","border","appendChild","body","rejectCurrentPurchase","isCompletingPurchase","onPaymentFailed","errors","onUnlockInput","then","completePurchase","amount","Promise","reject","resolve","componentDidMount","componentDidUpdate","element","prevElement","dataset","innerHTML","loadScript","el","parent","next","nextSibling","newEl","i","attributes","length","a","setAttribute","name","value","onLoad","insertBefore","scripts","Array","prototype","slice","call","querySelectorAll","script","src","async","defer","Function","text","render","email","ref"],"mappings":"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","file":"assets/13.chunk.9eeee5d15f42781da869.js","sourcesContent":["import * as React from 'react';\r\nimport { resolveComponentAndChildComponents, resolveSyncIfLoadedOrThrow } from '@polarnopyret/scope/resolve-component';\r\n\r\nexport type ChangeType = {\r\n email: string;\r\n firstName: string;\r\n lastName: string;\r\n postalCode: string;\r\n phoneNumber: string;\r\n identificationNumber: string;\r\n};\r\n\r\ntype PropType = {\r\n snippet: string;\r\n isLoading: boolean;\r\n onInfoChanged: (change: ChangeType) => void;\r\n onLockInput?: (visibleElement: HTMLElement, keepGatewayEnabled: boolean) => void;\r\n onUnlockInput?: () => void;\r\n onPaymentFailed?: (messages: string[]) => void;\r\n email?: string;\r\n reloadCart?: () => Promise;\r\n};\r\n\r\ntype StateType = {\r\n Component?: React.ComponentClass | React.StatelessComponent;\r\n model?: { componentName: string; };\r\n};\r\n\r\nfunction setLoading(isLoading: boolean) {\r\n console.info((isLoading ? 'Suspending' : 'Resuming') + ' interactive payment');\r\n dispatch('interactive-payment-set-loading', isLoading);\r\n}\r\n\r\nfunction dispatch(type: string, detail: any) {\r\n var e;\r\n try {\r\n e = new CustomEvent(type, { detail });\r\n }\r\n catch (ex) {\r\n e = document.createEvent('CustomEvent');\r\n e.initCustomEvent(type, true, false, detail);\r\n }\r\n document.dispatchEvent(e);\r\n}\r\n\r\nexport default class InteractivePaymentGatewayAdapter extends React.Component {\r\n cover: HTMLElement;\r\n element: HTMLElement;\r\n prevElement: HTMLElement;\r\n isCompletingPurchase: boolean;\r\n rejectCurrentPurchase: () => void;\r\n constructor(props: PropType) {\r\n super(props);\r\n\r\n this.state = { model: props.snippet && props.snippet[0] === '{' ? JSON.parse(props.snippet) : null };\r\n if (this.state.model) {\r\n this.loadComponent(this.state.model);\r\n }\r\n this.infoChangedHandler = this.infoChangedHandler.bind(this);\r\n this.lockHandler = this.lockHandler.bind(this);\r\n this.unlockHandler = this.unlockHandler.bind(this);\r\n this.failedHandler = this.failedHandler.bind(this);\r\n this.reloadHandler = this.reloadHandler.bind(this);\r\n }\r\n componentWillReceiveProps(nextProps: PropType) {\r\n if (nextProps.isLoading !== this.props.isLoading) {\r\n setLoading(nextProps.isLoading);\r\n }\r\n if (nextProps.snippet && nextProps.snippet[0] === '{') {\r\n const model = JSON.parse(nextProps.snippet);\r\n this.setState({ model });\r\n if (this.state.Component && (!this.state.model || this.state.model.componentName != model.componentName)) {\r\n this.setState({ Component: null });\r\n }\r\n this.loadComponent(model);\r\n } else {\r\n this.setState({ model: null, Component: null });\r\n }\r\n }\r\n componentWillMount() {\r\n if (window.document) {\r\n document.addEventListener('interactive-payment-info-changed', this.infoChangedHandler);\r\n document.addEventListener('interactive-payment-lock', this.lockHandler);\r\n document.addEventListener('interactive-payment-unlock', this.unlockHandler);\r\n document.addEventListener('interactive-payment-failed', this.failedHandler);\r\n document.addEventListener('interactive-payment-reload', this.reloadHandler);\r\n }\r\n }\r\n componentWillUnmount() {\r\n document.removeEventListener('interactive-payment-info-changed', this.infoChangedHandler);\r\n document.removeEventListener('interactive-payment-lock', this.lockHandler);\r\n document.removeEventListener('interactive-payment-unlock', this.unlockHandler);\r\n document.removeEventListener('interactive-payment-failed', this.failedHandler);\r\n document.removeEventListener('interactive-payment-reload', this.reloadHandler);\r\n if (this.cover) {\r\n this.cover.parentElement.removeChild(this.cover);\r\n this.cover = null;\r\n }\r\n }\r\n shouldComponentUpdate(nextProps: PropType, nextState: StateType) {\r\n if (this.state.model) {\r\n return true;\r\n } else {\r\n return this.props.snippet !== nextProps.snippet;\r\n }\r\n }\r\n infoChangedHandler(e: CustomEvent) {\r\n this.props.onInfoChanged(e.detail);\r\n }\r\n reloadHandler() {\r\n if (this.props.reloadCart) {\r\n this.props.reloadCart();\r\n } else {\r\n throw 'No reload handler has been specified';\r\n }\r\n }\r\n lockHandler(e: CustomEvent) {\r\n console.log('Interactive gateway lock');\r\n const visibleElement = e.detail && e.detail.visibleElement;\r\n const keepGatewayEnabled = !!(e.detail && e.detail.keepGatewayEnabled);\r\n if (this.props.onLockInput) {\r\n this.props.onLockInput(visibleElement, keepGatewayEnabled);\r\n } else {\r\n if (keepGatewayEnabled) {\r\n console.warn('Gateway requested to lock the page with the gateway still visible, but no onLockInput callback was specified for the adapter');\r\n }\r\n const cover = document.createElement('div');\r\n cover.style.position = 'fixed';\r\n cover.style.top = cover.style.left = cover.style.bottom = cover.style.right = '0';\r\n cover.style.zIndex = '10000';\r\n cover.style.backgroundColor = 'rgba(255, 255, 255, 0.8)';\r\n\r\n if (visibleElement) {\r\n cover.style.display = 'flex';\r\n cover.style.justifyContent = 'center';\r\n cover.style.alignItems = 'center';\r\n\r\n var inner = document.createElement('div');\r\n inner.style.backgroundColor = 'white';\r\n inner.style.border = 'solid 1px black';\r\n inner.appendChild(visibleElement);\r\n\r\n cover.appendChild(inner);\r\n }\r\n\r\n document.body.appendChild(cover);\r\n this.cover = cover;\r\n }\r\n }\r\n failedHandler(e: CustomEvent) {\r\n if (this.rejectCurrentPurchase) {\r\n this.rejectCurrentPurchase();\r\n this.isCompletingPurchase = false;\r\n this.rejectCurrentPurchase = null;\r\n }\r\n if (this.props.onPaymentFailed) {\r\n this.props.onPaymentFailed((e.detail && e.detail.errors) || []);\r\n }\r\n }\r\n unlockHandler(e: CustomEvent) {\r\n console.log('Interactive gateway unlock');\r\n if (this.props.onLockInput) {\r\n this.props.onUnlockInput();\r\n } else if (this.cover) {\r\n this.cover.parentElement.removeChild(this.cover);\r\n this.cover = null;\r\n }\r\n }\r\n loadComponent(model: { componentName: string }) {\r\n resolveComponentAndChildComponents(model).then(() => {\r\n if (this.state.model && this.state.model.componentName === model.componentName) {\r\n this.setState({ Component: resolveSyncIfLoadedOrThrow(model.componentName) });\r\n }\r\n });\r\n }\r\n completePurchase(amount: number) {\r\n if (this.isCompletingPurchase) {\r\n return Promise.reject('Cannot perform two purchases at the same time');\r\n }\r\n return new Promise((resolve, reject) => {\r\n this.rejectCurrentPurchase = reject;\r\n dispatch('interactive-payment-complete-purchase', { amount });\r\n });\r\n }\r\n componentDidMount() {\r\n this.componentDidUpdate();\r\n }\r\n async componentDidUpdate() {\r\n if (this.element && (this.element !== this.prevElement || this.props.snippet !== this.element.dataset['snippet'])) {\r\n console.log('Rendered interactive checkout');\r\n this.element.innerHTML = this.props.snippet;\r\n this.element.dataset['snippet'] = this.props.snippet;\r\n\r\n const loadScript = (el: HTMLScriptElement) => {\r\n const parent = el.parentElement;\r\n const next = el.nextSibling;\r\n parent.removeChild(el);\r\n return new Promise(resolve => {\r\n const newEl = document.createElement('script');\r\n for (let i = 0; i < el.attributes.length; i++) {\r\n const a = el.attributes[i];\r\n newEl.setAttribute(a.name, a.value);\r\n }\r\n\r\n const onLoad = () => {\r\n newEl.removeEventListener('load', onLoad);\r\n resolve();\r\n };\r\n newEl.addEventListener('load', onLoad);\r\n\r\n next ? parent.insertBefore(newEl, next) : parent.appendChild(newEl);\r\n });\r\n };\r\n\r\n // Scripts do not get executed by just adding them to an inner element that is dynamically added to the DOM\r\n const scripts = Array.prototype.slice.call(this.element.querySelectorAll('script')) as HTMLScriptElement[];\r\n for (let script of scripts) {\r\n if (script.src) {\r\n if (script.async || script.defer) {\r\n loadScript(script); // async/deferred so we can safely execute the next scripts\r\n } else {\r\n await loadScript(script);\r\n }\r\n } else {\r\n new Function(script.text)();\r\n }\r\n }\r\n\r\n if (this.props.isLoading) {\r\n setLoading(true);\r\n }\r\n }\r\n this.prevElement = this.element;\r\n }\r\n render() {\r\n if (!this.props.snippet) {\r\n return
;\r\n } else if (this.state.model) {\r\n const Component = this.state.Component;\r\n return Component ? :
;\r\n } else {\r\n return
this.element = e} />;\r\n }\r\n }\r\n}\r\n"],"sourceRoot":""}