@lmapp/react-native-cloudpayments
Version:
π ΠΠΎΡΠ½ΡΠΉ SDK Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΏΠ»Π°ΡΠ΅ΠΆΠ΅ΠΉ CloudPayments Π² React Native. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Apple Pay, Google Pay, Π‘ΠΠ, Π±Π°Π½ΠΊΠΎΠ²ΡΠΊΠΈΡ ΠΊΠ°ΡΡ. ΠΠΎΠ»Π½Π°Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ TypeScript. iOS 12+ ΠΈ Android 21+
219 lines (212 loc) β’ 8.52 kB
text/typescript
/**
* @fileoverview Union ΡΠΈΠΏΡ ΠΈ mapped ΡΠΈΠΏΡ Π΄Π»Ρ CloudPayments SDK
* @description Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ
, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ΠΈ Π΄Π»Ρ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈ ΠΎΡΠ²Π΅ΡΠΎΠ²
* @author Leonid Molchanov
* @since 1.0.0
*/
import type { EPaymentFormEventName } from './enums';
import type { IBaseEventData } from './base';
import type {
IPaymentFormUIEvent,
IPaymentFormTransactionEvent,
IPaymentFormEvent,
IPaymentEvent,
ICardEvent,
IThreeDSEvent,
} from './events';
// ============================================================================
// UNION TYPES AND MAPPED TYPES
// ============================================================================
/**
* ΠΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ
ΡΠΎΠ±ΡΡΠΈΠΉ ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΠΎΠΉ ΡΠΎΡΠΌΡ
*
* @description Union ΡΠΈΠΏ, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡΠΈΠΉ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΠΈΠΏΡ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΠΎΠΉ ΡΠΎΡΠΌΡ.
* ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠΎΠ±ΡΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡ
* ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ
Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΈΠΏΠ° ΡΠΎΠ±ΡΡΠΈΡ.
*
* @example ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ°Π·Π½ΡΡ
ΡΠΈΠΏΠΎΠ² ΡΠΎΠ±ΡΡΠΈΠΉ
* ```typescript
* import { eventEmitter } from '@lmapp/react-native-cloudpayments';
*
* const handlePaymentFormEvent = (eventData: TPaymentFormEventData) => {
* if ('action' in eventData) {
* // ΠΡΠΎ UI ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠΎΠ±ΡΡΠΈΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ
* if (eventData.action === EPaymentFormAction.TRANSACTION) {
* // ΠΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ
* const transactionEvent = eventData as IPaymentFormTransactionEvent;
* console.log('Π‘ΡΠ°ΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ:', transactionEvent.status);
* } else {
* // ΠΡΠΎ UI ΡΠΎΠ±ΡΡΠΈΠ΅
* const uiEvent = eventData as IPaymentFormUIEvent;
* console.log('UI Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅:', uiEvent.action);
* }
* }
* };
* ```
*
* @since 1.0.0
*/
export type TPaymentFormEventData =
| IPaymentFormUIEvent
| IPaymentFormTransactionEvent;
/**
* ΠΠ°ΠΏΠΏΠΈΠ½Π³ Π½Π°Π·Π²Π°Π½ΠΈΠΉ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΊ ΠΈΡ
ΡΠΈΠΏΠ°ΠΌ Π΄Π°Π½Π½ΡΡ
*
* @description ΠΠ½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠΈΠΏ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΡΠΎΠ³ΠΎΠΉ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ.
* ΠΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠΎΠ±ΡΡΠΈΡ ΠΈΠ· EPaymentFormEventName ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ
.
* ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ generic ΡΠΈΠΏΠ° TCloudPaymentsEventData.
*
* @internal
* @since 1.0.0
*/
type EventDataMap = {
/** ΠΠ±ΡΠ΅Π΅ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΠΎΠΉ ΡΠΎΡΠΌΡ */
[EPaymentFormEventName.PAYMENT_FORM]: IPaymentFormEvent;
/** Π‘ΠΎΠ±ΡΡΠΈΡ ΠΏΠ»Π°ΡΠ΅ΠΆΠ΅ΠΉ */
[EPaymentFormEventName.PAYMENT]: IPaymentEvent;
/** Π‘ΠΎΠ±ΡΡΠΈΡ ΠΊΠ°ΡΡ */
[EPaymentFormEventName.CARD]: ICardEvent;
/** Π‘ΠΎΠ±ΡΡΠΈΡ 3DS */
[EPaymentFormEventName.THREE_DS]: IThreeDSEvent;
};
/**
* Π’ΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ generic ΡΠΈΠΏ Π΄Π»Ρ ΡΠΎΠ±ΡΡΠΈΠΉ CloudPayments
*
* @description ΠΠ»Π΅Π³Π°Π½ΡΠ½ΡΠΉ generic ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΡΡΠΎΠ³ΡΡ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ
* ΡΠΎΠ±ΡΡΠΈΠΉ SDK. ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΈΠΏ ΡΠΎΠ±ΡΡΠΈΡ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ,
* ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΠ»ΡΡΡΠ°Ρ developer experience.
*
* @template K - Π’ΠΈΠΏ ΡΠΎΠ±ΡΡΠΈΡ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΡ EPaymentFormEventName
*
* @example Π’ΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅
* ```typescript
* import { eventEmitter, EPaymentFormEventName } from '@lmapp/react-native-cloudpayments';
*
* // TypeScript Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ²Π΅Π΄Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ
* eventEmitter.addListener(
* EPaymentFormEventName.PAYMENT_SUCCESS,
* (eventData: TCloudPaymentsEventData<typeof EPaymentFormEventName.PAYMENT_SUCCESS>) => {
* // eventData.data ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ IPaymentSuccessEventData
* console.log('ID ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ:', eventData.data.transactionId);
* console.log('Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅:', eventData.data.message);
* }
* );
* ```
*
* @example Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ ΡΠΈΠΏΠ°
* ```typescript
* const handleAnyEvent = (eventData: TCloudPaymentsEventData) => {
* switch (eventData.eventName) {
* case EPaymentFormEventName.PAYMENT_SUCCESS:
* // TypeScript Π·Π½Π°Π΅Ρ, ΡΡΠΎ data ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ IPaymentSuccessEventData
* console.log('Π£ΡΠΏΠ΅Ρ
! ID:', eventData.data.transactionId);
* break;
* case EPaymentFormEventName.PAYMENT_FAILED:
* // TypeScript Π·Π½Π°Π΅Ρ, ΡΡΠΎ data ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ IPaymentFailedEventData
* console.log('ΠΡΠΈΠ±ΠΊΠ°:', eventData.data.message);
* break;
* case EPaymentFormEventName.PAYMENT_PROGRESS:
* // TypeScript Π·Π½Π°Π΅Ρ, ΡΡΠΎ data ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ IPaymentProgressEventData
* console.log('ΠΡΠΎΠ³ΡΠ΅ΡΡ:', eventData.data.stage);
* break;
* default:
* console.log('ΠΡΡΠ³ΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅:', eventData.eventName);
* }
* };
* ```
*
* @example Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ EventEmitter
* ```typescript
* import { EventEmitter } from 'react-native';
*
* class TypedPaymentEventEmitter extends EventEmitter {
* emit<K extends EPaymentFormEventName>(
* eventName: K,
* eventData: TCloudPaymentsEventData<K>
* ): boolean {
* return super.emit(eventName, eventData);
* }
*
* addListener<K extends EPaymentFormEventName>(
* eventName: K,
* listener: (eventData: TCloudPaymentsEventData<K>) => void
* ): this {
* return super.addListener(eventName, listener);
* }
* }
* ```
*
* @since 1.0.0
*/
export type TCloudPaymentsEventData<
K extends EPaymentFormEventName = EPaymentFormEventName,
> = IBaseEventData<EventDataMap[K]> & { eventName: K };
/**
* Π’ΠΈΠΏ Π΄Π»Ρ ΡΡΠ°ΡΡΡΠ° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Intent
*
* @description ΠΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ HTTP ΡΡΠ°ΡΡΡ ΠΊΠΎΠ΄ ΠΎΡΠ²Π΅ΡΠ° ΠΏΡΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ
* ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΠΎΠ³ΠΎ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡ (Intent). ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
* Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΎΠΏΠ»Π°ΡΡ.
*
* @example ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΡΠ°ΡΡΡΠ° Intent
* ```typescript
* import { PaymentService, EPaymentMethodType } from '@lmapp/react-native-cloudpayments';
*
* const waitForIntentCompletion = async () => {
* try {
* const status: TIntentWaitStatus = await PaymentService.getIntentWaitStatus(
* paymentData,
* EPaymentMethodType.TPAY
* );
*
* switch (status) {
* case 200:
* console.log('ΠΠ»Π°ΡΠ΅ΠΆ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½');
* break;
* case 400:
* console.log('ΠΡΠΈΠ±ΠΊΠ° Π² Π΄Π°Π½Π½ΡΡ
Π·Π°ΠΏΡΠΎΡΠ°');
* break;
* case 402:
* console.log('ΠΠ»Π°ΡΠ΅ΠΆ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½');
* break;
* case 408:
* console.log('ΠΡΠ΅Π²ΡΡΠ΅Π½ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ');
* break;
* case 500:
* console.log('ΠΡΠΈΠ±ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°');
* break;
* default:
* console.log('ΠΠ΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ ΡΡΠ°ΡΡΡ:', status);
* }
* } catch (error) {
* console.log('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΡΡΠ°ΡΡΡΠ°:', error);
* }
* };
* ```
*
* @example Polling ΡΡΠ°ΡΡΡΠ° Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΎΠΌ
* ```typescript
* const pollIntentStatus = async (intentId: string): Promise<TIntentWaitStatus> => {
* const maxAttempts = 30; // 30 ΠΏΠΎΠΏΡΡΠΎΠΊ
* const interval = 2000; // 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ
*
* for (let attempt = 0; attempt < maxAttempts; attempt++) {
* const status: TIntentWaitStatus = await checkIntentStatus(intentId);
*
* // Π€ΠΈΠ½Π°Π»ΡΠ½ΡΠ΅ ΡΡΠ°ΡΡΡΡ
* if (status === 200 || status === 402 || status >= 500) {
* return status;
* }
*
* // ΠΠ΄Π΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΏΠΎΠΏΡΡΠΊΠΎΠΉ
* await new Promise(resolve => setTimeout(resolve, interval));
* }
*
* return 408; // Timeout
* };
* ```
*
* @see {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/Status} HTTP ΡΡΠ°ΡΡΡ ΠΊΠΎΠ΄Ρ
* @since 1.0.0
*/
export type TIntentWaitStatus = number;