UNPKG

@rnw-community/react-native-payments

Version:

Accept Payments with Apple Pay and Android Pay using the Payment Request API.

71 lines 3.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ChangeEventDispatcher = void 0; const shared_1 = require("@rnw-community/shared"); const change_event_timeout_ms_js_1 = require("../../constant/change-event-timeout-ms.js"); const payments_error_enum_js_1 = require("../../enum/payments-error.enum.js"); const dom_exception_js_1 = require("../../error/dom.exception.js"); const warn_change_event_error_util_js_1 = require("../../util/warn-change-event-error.util.js"); const payment_method_change_event_js_1 = require("../payment-method-change-event/payment-method-change-event.js"); const payment_request_update_event_js_1 = require("../payment-request-update-event/payment-request-update-event.js"); class ChangeEventDispatcher { constructor(type, payload, isRequestActive) { this.answer = null; this.isOpen = true; this.releaseAbandoned = shared_1.emptyFn; this.abandoned = new Promise(resolve => { this.releaseAbandoned = () => { resolve(null); }; }); this.handleUpdateWith = (detailsUpdate) => { if (!this.isOpen || !this.isRequestActive()) { throw new dom_exception_js_1.DOMException(payments_error_enum_js_1.PaymentsErrorEnum.InvalidStateError); } detailsUpdate.catch(shared_1.emptyFn); this.answer = detailsUpdate; }; this.isRequestActive = isRequestActive; this.event = type === 'paymentmethodchange' ? new payment_method_change_event_js_1.PaymentMethodChangeEvent(payload.methodName ?? '', payload.methodDetails ?? null, this.handleUpdateWith) : new payment_request_update_event_js_1.PaymentRequestUpdateEvent(type, this.handleUpdateWith); } async dispatch(listeners) { const deadline = (0, shared_1.wait)(change_event_timeout_ms_js_1.changeEventTimeoutMs).then(() => null); await Promise.race([this.callListeners(listeners), this.abandoned, deadline]); this.isOpen = false; return await this.resolveAnswer(deadline); } abandon() { this.isOpen = false; this.releaseAbandoned(); } async callListeners(listeners) { for (const listener of [...listeners]) { if (this.event.isAnswered) { return; } if (listeners.includes(listener)) { // eslint-disable-next-line no-await-in-loop await this.callListener(listener); } } } async callListener(listener) { try { await listener(this.event); } catch (error) { (0, warn_change_event_error_util_js_1.warnChangeEventError)(error); } } async resolveAnswer(deadline) { if (!(0, shared_1.isDefined)(this.answer)) { return null; } return await Promise.race([this.answer, this.abandoned, deadline]); } } exports.ChangeEventDispatcher = ChangeEventDispatcher; //# sourceMappingURL=change-event-dispatcher.js.map