react-native-plaid-link-sdk
Version:
React Native Plaid Link SDK (New Architecture & Expo)
169 lines (142 loc) • 3.88 kB
text/typescript
import { Platform } from "react-native";
import {
LinkExit,
LinkEvent,
LinkSuccess,
LinkTokenConfiguration,
PlaidLinkSession,
LayerTokenConfiguration,
PlaidLayerSession,
PlaidHeadlessSession,
SubmissionData,
FinanceKitSyncBehavior,
} from "./ReactNativePlaidLinkSdk.types";
import NativePlaidModule from "./ReactNativePlaidLinkSdkModule";
type Subscription = ReturnType<typeof NativePlaidModule.addListener>;
let successSub: Subscription | null = null;
let exitSub: Subscription | null = null;
let eventSub: Subscription | null = null;
function cleanupListeners() {
successSub?.remove();
exitSub?.remove();
eventSub?.remove();
successSub = null;
exitSub = null;
eventSub = null;
}
export async function createPlaidLinkSession(
config: LinkTokenConfiguration,
): Promise<PlaidLinkSession> {
cleanupListeners();
successSub = NativePlaidModule.addListener(
"PlaidLink.onSuccess",
(success: LinkSuccess) => {
config.onSuccess(success);
cleanupListeners();
},
);
exitSub = NativePlaidModule.addListener(
"PlaidLink.onExit",
(exit: LinkExit) => {
config.onExit(exit);
cleanupListeners();
},
);
eventSub = NativePlaidModule.addListener(
"PlaidLink.onEvent",
(event: LinkEvent) => {
config.onEvent(event);
},
);
await NativePlaidModule.createPlaidLinkSession(config.token);
return {
open: (fullScreen = false) => NativePlaidModule.openLinkSession(fullScreen),
};
}
export async function createPlaidLayerSession(
config: LayerTokenConfiguration,
): Promise<PlaidLayerSession> {
cleanupListeners();
successSub = NativePlaidModule.addListener(
"PlaidLink.onSuccess",
(success: LinkSuccess) => {
config.onSuccess(success);
cleanupListeners();
},
);
exitSub = NativePlaidModule.addListener(
"PlaidLink.onExit",
(exit: LinkExit) => {
config.onExit?.(exit);
cleanupListeners();
},
);
eventSub = NativePlaidModule.addListener(
"PlaidLink.onEvent",
(event: LinkEvent) => {
config.onEvent?.(event);
},
);
await NativePlaidModule.createPlaidLayerSession(config.token);
return {
open: () => NativePlaidModule.openLayerSession(),
submit: (data: SubmissionData) =>
NativePlaidModule.submitLayerData(
data.phoneNumber,
data.dateOfBirth,
data.params,
),
};
}
export async function createPlaidHeadlessSession(
config: LinkTokenConfiguration,
): Promise<PlaidHeadlessSession> {
cleanupListeners();
successSub = NativePlaidModule.addListener(
"PlaidLink.onSuccess",
(success: LinkSuccess) => {
config.onSuccess(success);
cleanupListeners();
},
);
exitSub = NativePlaidModule.addListener(
"PlaidLink.onExit",
(exit: LinkExit) => {
config.onExit(exit);
cleanupListeners();
},
);
eventSub = NativePlaidModule.addListener(
"PlaidLink.onEvent",
(event: LinkEvent) => {
config.onEvent(event);
},
);
await NativePlaidModule.createPlaidHeadlessSession(config.token);
if (config.onLoad) {
config.onLoad();
}
return {
start: () => NativePlaidModule.startHeadlessSession(),
};
}
export async function syncFinanceKit(config: {
token: string;
requestAuthorizationIfNeeded?: boolean;
syncBehavior?: FinanceKitSyncBehavior;
}): Promise<void> {
if (Platform.OS === "android") {
throw new Error("FinanceKit is only available on iOS");
}
await NativePlaidModule.syncFinanceKit(
config.token,
config.requestAuthorizationIfNeeded ?? true,
config.syncBehavior ?? FinanceKitSyncBehavior.LIVE,
);
}
export {
PlaidEmbeddedSearchView,
type PlaidEmbeddedSearchViewProps,
} from "./PlaidEmbeddedSearchView";
export { default } from "./ReactNativePlaidLinkSdkModule";
export * from "./ReactNativePlaidLinkSdk.types";