UNPKG

@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
/** * @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;