UNPKG

react-native-moyasar-sdk

Version:

Official React Native Moyasar SDK - Integrate Credit Cards, Apple Pay, Samsung Pay, and STC Pay with simple interfaces for a seamless payment experience in your React Native app

93 lines (90 loc) 3.98 kB
"use strict"; import { Alert } from 'react-native'; import { debugLog, errorLog } from "../helpers/debug_log.js"; import { validateField } from "../helpers/validation.js"; import { PaymentRequest } from "../models/api/api_requests/payment_request.js"; import { StcPayRequestSource } from "../models/api/sources/stc_pay/stc_pay_request_source.js"; import { StcPayResponseSource } from "../models/api/sources/stc_pay/stc_pay_response_source.js"; import { isMoyasarError, UnexpectedError } from "../models/errors/moyasar_errors.js"; import { PaymentStatus } from "../models/payment_status.js"; import { createPayment, sendOtp } from "./payment_service.js"; import { OtpValidator } from "./validators/otp_validator.js"; import { PhoneNumberValidator } from "./validators/phone_number_validator.js"; import { getConfiguredLocalizations } from "../localizations/i18n.js"; export class StcPayService { payment = null; phoneNumberValidator = new PhoneNumberValidator(); otpValidator = new OtpValidator(); /** * @returns {Promise<boolean>} True if the payment process is initiated and should proceed to OTP entry. */ async beginStcPayment(paymentConfig, phonerNumber, onPaymentResult) { debugLog('Moyasar SDK: Begin STC payment process...'); if (!validateField(phonerNumber, this.phoneNumberValidator)) { debugLog('Moyasar SDK: Invalid phone number'); // TODO: Alert user about invalid fields return false; } const stcPayRequestSource = new StcPayRequestSource({ mobile: phonerNumber }); const paymentRequest = new PaymentRequest({ givenId: paymentConfig.givenId, amount: paymentConfig.amount, currency: paymentConfig.currency, description: paymentConfig.description, metadata: paymentConfig.metadata, source: stcPayRequestSource }); const response = await createPayment(paymentRequest, paymentConfig.publishableApiKey); if (isMoyasarError(response)) { errorLog(`Moyasar SDK: STC Payment failed with error: ${response}`); onPaymentResult(response); return false; } if (response.status == PaymentStatus.failed) { debugLog('Moyasar SDK: STC payment failed'); if (response.source.message?.includes('Mobile number is not registered')) { debugLog(`Moyasar SDK: Phone number is not registered`); const { t } = getConfiguredLocalizations(); Alert.alert(t('phoneNumberNotRegisteredTitle'), t('phoneNumberNotRegisteredBody')); } else { onPaymentResult(response); } return false; } debugLog(`Moyasar SDK: STC Payment created with status: ${response.status}`); if (response.status != PaymentStatus.initiated) { onPaymentResult(response); return false; } this.payment = response; return true; } async submitStcPaymentOtp(otp, onPaymentResult) { debugLog('Moyasar SDK: Submitting STC payment OTP...'); if (!validateField(otp, this.otpValidator)) { debugLog('Moyasar SDK: Invalid OTP'); // TODO: Alert user about invalid fields return; } const currentPayment = this.payment; if (currentPayment == null || !(currentPayment.source instanceof StcPayResponseSource)) { errorLog('Moyasar SDK: STC Payment OTP submission failed'); onPaymentResult(new UnexpectedError('STC Payment OTP submission failed', currentPayment)); return; } const response = await sendOtp(otp, currentPayment.source.transactionUrl); // TODO: Refactor to handle `instanceof PaymentResponse` to check for success rather than `isMoyasarError` if (isMoyasarError(response)) { errorLog(`Moyasar SDK: STC Payment OTP submission response failed with error: ${response}`); onPaymentResult(response); return; } debugLog(`Moyasar SDK: STC Payment succeeded after OTP with status: ${response.status}`); onPaymentResult(response); } } //# sourceMappingURL=stc_pay_service.js.map