@rnw-community/react-native-payments
Version:
Accept Payments with Apple Pay and Android Pay using the Payment Request API.
83 lines (66 loc) • 3.13 kB
text/typescript
import { isDefined } from '@rnw-community/shared';
import { PaymentsErrorEnum } from '../../enum/payments-error.enum.js';
import { DOMException } from '../../error/dom.exception.js';
import { PaymentsError } from '../../error/payments.error.js';
import { NativePayments } from '../native-payments/native-payments.js';
import type { PaymentValidationErrors } from '../../@standard/w3c/payment-validation-errors.js';
import type { PaymentComplete } from '../../enum/payment-complete.enum.js';
import type { PaymentResponseDetailsInterface } from '../../interface/payment-response-details.interface.js';
import type { PaymentResponseJsonInterface } from '../../interface/payment-response-json.interface.js';
import type { Maybe } from '@rnw-community/shared';
/*
* https://www.w3.org/TR/payment-request/#paymentresponse-interface
*/
export class PaymentResponse {
private completeCalled = false;
private retryCalled = false;
constructor(
// https://www.w3.org/TR/payment-request/#dom-paymentresponse-requestid
readonly requestId: string,
// https://www.w3.org/TR/payment-request/#dom-paymentresponse-methodname
readonly methodName: string,
// https://www.w3.org/TR/payment-request/#dom-paymentresponse-details
readonly details: PaymentResponseDetailsInterface,
readonly shippingOption: Maybe<string> = null
) {}
// https://www.w3.org/TR/payment-request/#complete-method
async complete(result: PaymentComplete): Promise<void> {
if (this.completeCalled || this.retryCalled) {
throw new DOMException(PaymentsErrorEnum.InvalidStateError);
}
this.completeCalled = true;
// TODO: Implement logic https://www.w3.org/TR/payment-request/#complete-method
return NativePayments.complete(result);
}
// https://www.w3.org/TR/payment-request/#dom-paymentresponse-retry
async retry(errorFields?: PaymentValidationErrors): Promise<undefined> {
if (this.completeCalled) {
throw new DOMException(PaymentsErrorEnum.InvalidStateError);
}
if (this.retryCalled) {
throw new DOMException(PaymentsErrorEnum.InvalidStateError);
}
const { retry } = NativePayments;
if (!isDefined(retry)) {
throw new DOMException(PaymentsErrorEnum.NotSupportedError);
}
this.retryCalled = true;
await retry(this.requestId, errorFields ?? {}).catch(() => {
throw new PaymentsError(`Failed retrying PaymentRequest`);
});
// eslint-disable-next-line no-undefined
return undefined;
}
toJSON(): PaymentResponseJsonInterface {
return {
requestId: this.requestId,
methodName: this.methodName,
details: this.details,
shippingAddress: this.details.shippingAddress ?? null,
shippingOption: this.shippingOption,
payerEmail: this.details.payerEmail ?? null,
payerName: this.details.payerName ?? null,
payerPhone: this.details.payerPhone ?? null,
};
}
}