react-native-unit-components
Version:
Unit React Native components
88 lines (76 loc) • 4.82 kB
text/typescript
import { RequestRefreshEvent } from '../../messages/webMessages/unitMessages';
import type WebView from 'react-native-webview';
import type { UNAccountMenuAction } from '../../types/shared';
import { WebComponentType } from '../../types/internal/webComponent.types';
import { UNPayeeManagementComponentProps } from './UNPayeeManagementComponent';
import { DISPATCH_OPEN_PLAID, DISPATCH_PLAID_EXIT, DISPATCH_PLAID_RESPONSE, DISPATCH_REQUEST_REFRESH, LISTENERS } from '../../scripts/html/bodyScript';
import { LinkError, LinkSuccess } from 'react-native-plaid-link-sdk';
import { OpenPlaidEvent } from '../../messages/webMessages/plaidMessages';
export const getPayeeParams = (props: UNPayeeManagementComponentProps) => {
const menuItemsParam = props.menuItems ? `menu-items="${props.menuItems.join()}"` : '';
const queryFilterParam = props.queryFilter ? `query-filter="${props.queryFilter}"` : '';
const paginationTypeParam = props.paginationType ? `pagination-type="${props.paginationType}"` : '';
const plaidAccountFiltersParam = props.plaidAccountFilters ? `plaid-account-filters="${props.plaidAccountFilters.join()}"` : '';
const plaidLinkCustomizationNameParam = props.plaidLinkCustomizationName ? `plaid-link-customization-name="${props.plaidLinkCustomizationName}"` : '';
const counterPartiesPerPageParam = props.counterPartiesPerPage ? `counterparties-per-page="${props.counterPartiesPerPage}"` : '';
const menuPlaceholderParam = props.menuPlaceholder ? `menu-placeholder="${props.menuPlaceholder}"` : '';
const flowPlaceholderParam = props.flowPlaceholder ? `flow-placeholder="${props.flowPlaceholder}"` : '';
const payeeCreationPlaceholderParam = props.payeeCreationPlaceholder ? `payee-creation-placeholder="${props.payeeCreationPlaceholder}"` : '';
const microDepositConnectionPlaceholderParam = props.microDepositConnectionPlaceholder ? `micro-deposit-connection-placeholder="${props.microDepositConnectionPlaceholder}"` : '';
return `
customer-token="${props.customerToken}"
${menuItemsParam}
${queryFilterParam}
${paginationTypeParam}
${counterPartiesPerPageParam}
hide-title="${props.hideTitle || false}"
hide-counterparty-actions-button="${props.hideCounterpartyActionsButton || false}"
${menuPlaceholderParam}
${flowPlaceholderParam}
${payeeCreationPlaceholderParam}
${microDepositConnectionPlaceholderParam}
${plaidAccountFiltersParam}
${plaidLinkCustomizationNameParam}
style="height: 100%"
`;
};
export const getPayeeManagementScript = () => {
return `
${LISTENERS.unitCounterpartyCreated}
${LISTENERS.unitConnectedAccountCreated}
${LISTENERS.unitMicroDepositConnectionCreated}
${LISTENERS.unitMicroDepositConnectionRejected}
${LISTENERS.requestRefresh}
${DISPATCH_PLAID_RESPONSE}
${DISPATCH_PLAID_EXIT}
${DISPATCH_OPEN_PLAID}
${DISPATCH_REQUEST_REFRESH}
`;
};
export const injectOpenActionsMenuScript = (currentWeb: WebView | null) => {
currentWeb?.injectJavaScript(`dispatchOpenActionsMenu('${WebComponentType.account}')`);
};
export const injectRequestAccountActionScript = (currentWeb: WebView | null, action: UNAccountMenuAction) => {
currentWeb?.injectJavaScript(`dispatchRequestAccountAction('${action}')`);
};
export const injectRefreshEventIfNeeded = (currentWeb: WebView | null, requestRefreshEvent: RequestRefreshEvent | null) => {
if (requestRefreshEvent && requestRefreshEvent.dependencies.includes(WebComponentType.payeeManagement.valueOf())) {
currentWeb?.injectJavaScript(`dispatchRefreshEvent('${JSON.stringify(requestRefreshEvent)}')`);
}
};
export const injectUnitOpenPlaid = (currentWeb: WebView | null, openPlaidData: OpenPlaidEvent) => {
currentWeb?.injectJavaScript(`dispatchOpenPlaidEvent(${JSON.stringify({ data: openPlaidData })})`);
};
export const injectUnitPlaidResponse = (currentWeb: WebView | null, success: LinkSuccess) => {
const successObj = { data: { publicToken: success.publicToken, metadata: JSON.parse(success.metadata.metadataJson ?? '{}') } };
currentWeb?.injectJavaScript(`dispatchPlaidEvent(${JSON.stringify(successObj)})`);
};
export const injectUnitPlaidExit = (currentWeb: WebView | null, plaidLinkError: LinkError | null | undefined) => {
// Android & iOS are not consist - we will extract the needed fields from the LinkError/errorJson
const errorJson = JSON.parse(plaidLinkError?.errorJson ?? '{}');
const type = plaidLinkError?.errorType ?? errorJson['error_type'] ?? '';
const code = plaidLinkError?.errorCode ?? errorJson['error_code'] ?? '';
const message = plaidLinkError?.errorMessage ?? errorJson['error_message'] ?? '';
const error = { error_type: type, error_code: code, error_message: message };
currentWeb?.injectJavaScript(`dispatchPlaidExit(${JSON.stringify(error)})`);
};