@exodus/react-native-payments
Version:
[](http://facebook.github.io/react-native/releases/0.40) [](https://www.np
88 lines (87 loc) • 3.27 kB
JavaScript
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);
}
}
}