UNPKG

@exodus/react-native-payments

Version:

[![react-native version](https://img.shields.io/badge/react--native-0.41-0ba7d3.svg?style=flat-square)](http://facebook.github.io/react-native/releases/0.40) [![npm](https://img.shields.io/npm/v/react-native-payments.svg?style=flat-square)](https://www.np

88 lines (87 loc) 3.27 kB
import { Platform } from 'react-native'; import { SHIPPING_ADDRESS_CHANGE_EVENT, SHIPPING_OPTION_CHANGE_EVENT } from './constants'; import PaymentRequest from './PaymentRequest'; import NativePayments from './NativePayments'; import { validateTotal, validateDisplayItems, convertDetailAmountsToString } from './helpers'; import { DOMException } from './errors'; const noop = () => { }; function isPromise(value) { if (!value.then) { return false; } return typeof value.then === 'function'; } export default class PaymentRequestUpdateEvent { name; target; _waitForUpdate; constructor(name, target) { if (name !== SHIPPING_ADDRESS_CHANGE_EVENT && name !== SHIPPING_OPTION_CHANGE_EVENT) { throw new Error(`Only "${SHIPPING_ADDRESS_CHANGE_EVENT}" and "${SHIPPING_OPTION_CHANGE_EVENT}" event listeners are supported.`); } this.name = name; this.target = target; this._waitForUpdate = false; this._handleDetailsChange = this._handleDetailsChange.bind(this); this._resetEvent = this._resetEvent.bind(this); } _handleDetailsChange(value) { const target = this.target; validateTotal(value.total, DOMException); validateDisplayItems(value.displayItems, DOMException); const details = Object.assign(Object.create(null), value); target._details = details; const normalizedDetails = convertDetailAmountsToString(target._details); return (NativePayments.handleDetailsUpdate(normalizedDetails) .then(this._resetEvent) .then(() => { if (Platform.OS !== 'ios') { return; } if (target._details.shippingOptions && target._details.shippingOptions[0]) { target._handleShippingOptionChange({ selectedShippingOptionId: target._details.shippingOptions[0].id }); } }) .catch(e => { this._resetEvent(); throw new Error('AbortError'); })); } _resetEvent() { this._waitForUpdate = false; this.target._updating = false; noop(); } updateWith(PaymentDetailsModifierOrPromise) { let event = this; let target = this.target; if (!(target instanceof PaymentRequest)) { throw new Error('TypeError'); } if (event._waitForUpdate === true) { throw new Error('InvalidStateError'); } if (target._state !== 'interactive') { throw new Error('InvalidStateError'); } if (target._updating === true) { throw new Error('InvalidStateError'); } noop(); event._waitForUpdate = true; target._updating = true; noop(); if (isPromise(PaymentDetailsModifierOrPromise)) { const promise = PaymentDetailsModifierOrPromise; return promise.then(this._handleDetailsChange); } if (typeof PaymentDetailsModifierOrPromise === 'object') { const paymentDetailsModifier = PaymentDetailsModifierOrPromise; return this._handleDetailsChange(paymentDetailsModifier); } } }