UNPKG

react-native-priv-sdk

Version:

Official MyCover.ai SDK. Supercharge your product with MyCover AI Insurance offerings. Create embedded insurance offerings or full white label insurance applications that excite your customers.

244 lines (209 loc) 7.57 kB
import { useNavigation } from '@react-navigation/native'; import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; import type { RootStackParamList } from '../../../utils/navigatorStackList'; import customLog from '../../../utils/logger'; import PaymentRepository from '../../../data/repositories/payment_repo'; import { type GlobalStore, useGlobalStore } from '../../../store/globalStore'; import { UssdProviderModel } from '../../../models/UssdProviderModel'; import { PaymentMethod, PaymentMethodHelper, ToastStatus, } from '../../../utils/enums'; import { create } from 'zustand'; import { PurchaseDetailsResponseModel } from '../../../models/PurchaseDetailsResponseModel'; import { PurchaseinitializationModel } from '../../../models/PurchaseinitializationModel'; import type { LoadStore } from '../../../store/loadStore'; import { type FormStore, useFormStore } from '../../../store/formStore'; import globalObject from '../../../store/globalObject'; import { showToast } from '../../../components/CustomToast'; export const usePaymentStore = create((set) => ({ paymentViewModelLoading: false, setPaymentLoading: (loading: boolean) => set({ paymentViewModelLoading: loading }), })); const paymentRepository = new PaymentRepository(); export const PaymentViewModel = () => { const global = useGlobalStore((state: GlobalStore) => state); const globalForm = useFormStore((state: FormStore) => state); type NavigationProps = NativeStackNavigationProp<RootStackParamList>; const navigation = useNavigation<NavigationProps>(); const fetchUssdProviders = async ( // paymentMethod: any, loadingState: LoadStore ) => { try { loadingState.setPaymentVmLoading(true); // global.ussdProviders = await getUssdProviders(); loadingState.setPaymentVmLoading(false); // navigation.navigate('SelectBankScreen'); return true; } catch (error) { loadingState.setPaymentVmLoading(false); showToast(ToastStatus.failed, `${error}`); return false; } }; const initiateGatewayPurchase = async ( paymentMethod: PaymentMethod, loadingState: LoadStore ) => { try { loadingState.setPaymentVmLoading(true); customLog.info('PAYMENT METHOD', paymentMethod); customLog.info('PAYMENT METHOD', paymentMethod === 'ussd'); customLog.info( 'PAYMENT METHOD', paymentMethod === PaymentMethod.transfer ); const res = await paymentRepository.initiateGatewayPurchase({ paymentChannel: paymentMethod === 'ussd' ? new Map<string, any>([ ['channel', PaymentMethodHelper.getName(paymentMethod)], [ 'bank_code', global.ussdProviders.length > 0 ? globalForm.selectedBank?.type : '', ], ]) : new Map<string, any>([ ['channel', PaymentMethodHelper.getName(paymentMethod)], ]), payload: globalForm.formData, instanceId: globalObject.businessDetails?.instanceId ?? '', }); loadingState.setPaymentVmLoading(false); if (res.responseCode === 1) { const data = PurchaseinitializationModel.fromJson(res.data); navigation.navigate('AccountDetailsScreen', { purchaseDetails: data, paymentMethod, }); } else { const errorMessage = res.errors && res.errors.length > 0 ? res.errors.join(', ') : res.message; showToast(ToastStatus.failed, errorMessage); } return true; } catch (error) { loadingState.setPaymentVmLoading(false); showToast(ToastStatus.failed, `${error}`); return false; } }; const initiateWalletPurchase = async (loadingState: LoadStore) => { try { loadingState.setPaymentVmLoading(true); const res = await paymentRepository.initiateWalletPurchase({ payload: globalForm.formData, reference: globalObject.reference ?? '', }); if (res.responseCode === 1) { const purchaseRes = await paymentRepository.getPurchaseInfo( globalObject.reference ?? '' ); const data = PurchaseDetailsResponseModel.fromJson(purchaseRes.data); global.setReference(data.reference || ''); navigation.replace('PlanDetailsScreen', { purchaseDetails: data, }); } else { const errorMessage = res.errors && res.errors.length > 0 ? res.errors.join(', ') : res.message; showToast(ToastStatus.failed, errorMessage); } loadingState.setPaymentVmLoading(false); return true; } catch (error) { loadingState.setPaymentVmLoading(false); showToast(ToastStatus.failed, `${error}`); return false; } }; // const getUssdProviders = async ( // loadingState: LoadStore // ): Promise<UssdProviderModel[]> => { // try { // loadingState.setPaymentVmLoading(true); // const res = await paymentRepository.getUssdProviders(); // loadingState.setPaymentVmLoading(false); // if (res.responseCode === 1) { // return (res.data || []).map((e: any) => UssdProviderModel.fromJson(e)); // } else { // const errorMessage = // res.errors && res.errors.length > 0 // ? res.errors.join(', ') // : res.message; // showToast(ToastStatus.failed, errorMessage); // return []; // } // } catch (error) { // loadingState.setPaymentVmLoading(false); // showToast(ToastStatus.failed, `${error}`); // return []; // } // }; const verifyPayment = async ( reference: string, paymentMethod: any, purchaseDetails: PurchaseinitializationModel, loadingState: LoadStore, redirect = true ): Promise<UssdProviderModel[]> => { try { loadingState.setPaymentVmLoading(true); const res = await paymentRepository.verifyPayment(reference); if (res.responseCode === 1) { const purchaseRes = await paymentRepository.getPurchaseInfo(reference); const data = PurchaseDetailsResponseModel.fromJson(purchaseRes.data); // global.reference = ; globalObject.setReference(data.reference || ''); navigation.navigate('PaymentSuccessScreen', { purchaseDetails: data }); loadingState.setPaymentVmLoading(false); return []; } else { // const errorMessage = // res.errors && res.errors.length > 0 // ? res.errors.join(', ') // : res.message; showToast( ToastStatus.failed, 'We have not received your payment. Hang on, we will keep trying' ); loadingState.setPaymentVmLoading(false); if (redirect) { navigation.navigate('PaymentProcessingScreen', { purchaseDetails, paymentMethod, }); } return []; } } catch (error) { loadingState.setPaymentVmLoading(false); showToast(ToastStatus.failed, `${error}`); return []; } }; const navigateToLastScreen = (context: any) => { if (navigation.canGoBack()) { navigation.goBack(); setTimeout(() => { navigateToLastScreen(context); }, 300); } }; return { fetchUssdProviders, initiateGatewayPurchase, initiateWalletPurchase, verifyPayment, navigateToLastScreen, }; };