@rnw-community/react-native-payments
Version:
Accept Payments with Apple Pay and Android Pay using the Payment Request API.
71 lines • 3.1 kB
JavaScript
;
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