UNPKG

@lmapp/react-native-cloudpayments

Version:

πŸš€ ΠœΠΎΡ‰Π½Ρ‹ΠΉ SDK для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ CloudPayments Π² React Native. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Apple Pay, Google Pay, Π‘Π‘ΠŸ, банковских ΠΊΠ°Ρ€Ρ‚. Полная типизация TypeScript. iOS 12+ ΠΈ Android 21+

118 lines (104 loc) β€’ 4.11 kB
/** * @fileoverview Π₯ΡƒΠΊ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CloudPayments SDK * @description Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ…ΡƒΠΊ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ управлСния состояниСм SDK * @author Leonid Molchanov * @since 1.0.0 */ import { useCallback, useEffect, useRef } from 'react'; import { init } from '../../index'; import { EPaymentFormErrorCode } from '../../types'; import type { IUseCloudPaymentsCoreOptions, IUseCloudPaymentsCoreReturn, } from './types'; // ============================================================================ // HOOK IMPLEMENTATION // ============================================================================ /** * Π₯ΡƒΠΊ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CloudPayments SDK * * @description УправляСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ SDK ΠΈ прСдоставляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ статусС. * АвтоматичСски ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ SDK ΠΏΡ€ΠΈ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° (Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° автоинициализация). * * @param publicId - ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΌΠ΅Ρ€Ρ‡Π°Π½Ρ‚Π° CloudPayments * @param options - ΠžΠΏΡ†ΠΈΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρ…ΡƒΠΊΠ° * @returns ΠžΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ статусом * * @example Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ использованиС * ```typescript * const { isInitialized, initializeSDK } = useCloudPaymentsCore( * 'pk_test_1234567890abcdef' * ); * * // SDK автоматичСски инициализируСтся ΠΏΡ€ΠΈ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ * console.log('SDK ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½:', isInitialized); * ``` * * @example Ручная инициализация * ```typescript * const { isInitialized, initializeSDK } = useCloudPaymentsCore( * 'pk_test_1234567890abcdef', * { autoInitialize: false } * ); * * const handleManualInit = async () => { * if (!isInitialized) { * await initializeSDK(); * } * }; * ``` * * @since 1.0.0 */ export const useCloudPaymentsCore = ( publicId: string, options: IUseCloudPaymentsCoreOptions = {} ): IUseCloudPaymentsCoreReturn => { // ============================================================================ // STATE & REFS // ============================================================================ const isInitializedRef = useRef<boolean>(false); const { autoInitialize = true } = options; // ============================================================================ // FUNCTIONS // ============================================================================ /** * Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ SDK */ const initializeSDK = useCallback(async (): Promise<void> => { if (isInitializedRef.current) { return; } try { await init(publicId); isInitializedRef.current = true; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Ошибка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ SDK'; // ВыбрасываСм ΠΎΡˆΠΈΠ±ΠΊΡƒ с ΠΊΠΎΠ΄ΠΎΠΌ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ const sdkError = new Error(errorMessage); (sdkError as any).code = EPaymentFormErrorCode.SERVICE_UNINITIALIZED; throw sdkError; } }, [publicId]); // ============================================================================ // EFFECTS // ============================================================================ /** * АвтоматичСская инициализация SDK ΠΏΡ€ΠΈ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ */ useEffect(() => { if (autoInitialize) { initializeSDK().catch((error) => { console.error('Ошибка Π°Π²Ρ‚ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CloudPayments SDK:', error); }); } }, [autoInitialize, initializeSDK]); // ============================================================================ // RETURN // ============================================================================ return { isInitialized: isInitializedRef.current, initializeSDK, }; };