UNPKG

react-native-unit-components

Version:

Unit React Native components

136 lines 5.1 kB
import React, { useEffect, useRef, useState } from 'react'; import { WebComponent } from '../../webComponent/WebComponent'; import { PageMessage } from '../../messages/webMessages/pageMessage'; import { Platform } from 'react-native'; import { UnitComponentsMessage } from '../../messages/webMessages/unitComponentsMessages'; import { getACHDebitParams, getACHDebitScript, injectUnitPlaidResponse } from './UNACHDebitComponent.utils'; import { openLink } from 'react-native-plaid-link-sdk'; import { PaymentMessage } from '../../messages/webMessages/paymentsMessage'; import { RESPONSE_KEYS } from '../../messages/webMessages/onLoadMessage'; import AppInfo from '../../utils/AppInfo'; import { PresentationMode, WebComponentType } from '../../types/internal/webComponent.types'; import { withReduxStore } from '../../helpers/store/helpers'; import { PlaidMessage } from '../../messages/webMessages/plaidMessages'; import { UNBaseView } from '../../nativeComponents/UNBaseView'; import { ensureArray } from '../../utils/onLoadMessages.utils'; const UNACHDebitComponent = props => { const [height, setHeight] = useState(0); const [appPackageName, setAppPackageName] = useState(''); const [linkToken, setLinkToken] = useState(''); const webRef = useRef(null); const [presentationMode, setPresentationMode] = useState(PresentationMode.Inherit); useEffect(() => { const setPackageNameForAndroid = async () => { if (Platform.OS === 'android') { const packageName = await AppInfo.getAppIdentifier(); setAppPackageName(packageName); } }; setPackageNameForAndroid(); }, []); const handleUnitOnLoad = response => { if (!props.onLoad) { return; } if (RESPONSE_KEYS.errors in response) { props.onLoad(response); return; } if (RESPONSE_KEYS.account in response && RESPONSE_KEYS.counterpartyAccount in response) { const account = response[RESPONSE_KEYS.account].data; // ACHOnLoadResponse; const achOnload = { data: { [RESPONSE_KEYS.account]: ensureArray(account), [RESPONSE_KEYS.counterpartyAccount]: response[RESPONSE_KEYS.counterpartyAccount].data } }; props.onLoad(achOnload); return; } console.error('On Load Error: unexpected response type'); return; }; const handleWebViewMessage = message => { if (!message || !message.details) return; switch (message.type) { case PaymentMessage.INITIAL_STAGE_BACK_BUTTON_CLICKED: { props.onInitialStageBackButtonClicked && props.onInitialStageBackButtonClicked(); break; } case PaymentMessage.FINAL_STAGE_DONE_BUTTON_CLICKED: { props.onFinalStageDoneButtonClicked && props.onFinalStageDoneButtonClicked(); break; } case PaymentMessage.PAYMENT_CREATED: { const achDebitEvent = message.details; props.onPaymentCreated && props.onPaymentCreated(achDebitEvent.data); break; } case UnitComponentsMessage.UNIT_ON_LOAD: handleUnitOnLoad(message.details); break; case PageMessage.PAGE_HEIGHT: { const currentHeight = message.details.height; setHeight(currentHeight); if (presentationMode === PresentationMode.Inherit && currentHeight === 0) { setPresentationMode(PresentationMode.Default); } break; } case PlaidMessage.UNIT_PLAID_TOKEN_CREATED: { const linkTokenEvent = message.details; const linkTokenData = linkTokenEvent.linkToken; setLinkToken(linkTokenData.attributes.linkToken); break; } case UnitComponentsMessage.UNIT_REQUEST_EXTERNAL_SDK: { const externalSdkType = message.details.type; if (externalSdkType !== 'plaid') return; linkToken && openLink({ tokenConfig: { noLoadingState: false, token: linkToken }, onSuccess: success => { injectUnitPlaidResponse(webRef.current, success); }, onExit: exit => { console.log(exit); } }).catch(e => { console.error(e); }); break; } } }; const style = presentationMode === PresentationMode.Inherit ? { flex: 1 } : { height: height }; return /*#__PURE__*/React.createElement(UNBaseView, { style: style, onLoadError: handleUnitOnLoad, fallback: /*#__PURE__*/React.createElement(React.Fragment, null) }, /*#__PURE__*/React.createElement(WebComponent, { ref: webRef, type: WebComponentType.achDebitPayment, presentationMode: presentationMode, params: getACHDebitParams(props), script: getACHDebitScript(appPackageName), onMessage: message => handleWebViewMessage(message), isScrollable: true, theme: props.theme, language: props.language })); }; export default withReduxStore(UNACHDebitComponent); //# sourceMappingURL=UNACHDebitComponent.js.map