banking_dcb_sdk_react_native 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BankingDcbSdkReactNative.podspec +28 -0
- package/android/app/build/generated/source/codegen/RCTAppDependencyProvider.h +25 -0
- package/android/app/build/generated/source/codegen/RCTAppDependencyProvider.mm +55 -0
- package/android/app/build/generated/source/codegen/RCTModulesConformingToProtocolsProvider.h +18 -0
- package/android/app/build/generated/source/codegen/RCTModulesConformingToProtocolsProvider.mm +33 -0
- package/android/app/build/generated/source/codegen/RCTThirdPartyComponentsProvider.h +16 -0
- package/android/app/build/generated/source/codegen/RCTThirdPartyComponentsProvider.mm +62 -0
- package/android/app/build/generated/source/codegen/ReactAppDependencyProvider.podspec +34 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeAsyncStorageModuleSpec.java +59 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeBlobUtilsSpec.java +280 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeRNCWebViewModuleSpec.java +42 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeRNPermissionsSpec.java +87 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSafeAreaContextSpec.java +65 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeScreensModuleSpec.java +35 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerDelegate.java +26 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerInterface.java +17 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerDelegate.java +36 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerInterface.java +20 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCWebViewManagerDelegate.java +301 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCWebViewManagerInterface.java +107 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerDelegate.java +84 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerInterface.java +35 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java +101 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java +42 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSFullWindowOverlayManagerDelegate.java +32 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSFullWindowOverlayManagerInterface.java +17 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSModalScreenManagerDelegate.java +128 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSModalScreenManagerInterface.java +51 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSafeAreaViewManagerDelegate.java +36 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSafeAreaViewManagerInterface.java +20 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +26 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +17 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerDelegate.java +26 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java +17 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerDelegate.java +26 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java +17 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +140 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +55 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenNavigationContainerManagerDelegate.java +26 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenNavigationContainerManagerInterface.java +17 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +121 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +48 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +35 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +19 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHostManagerDelegate.java +26 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHostManagerInterface.java +17 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java +26 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java +17 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +106 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +40 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSplitViewHostManagerDelegate.java +57 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSplitViewHostManagerInterface.java +27 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSplitViewScreenManagerDelegate.java +32 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSplitViewScreenManagerInterface.java +18 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSStackScreenManagerDelegate.java +35 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSStackScreenManagerInterface.java +19 -0
- package/android/app/build/generated/source/codegen/jni/BankingDcbSdkReactNative-generated.cpp +22 -0
- package/android/app/build/generated/source/codegen/jni/BankingDcbSdkReactNative.h +24 -0
- package/android/app/build/generated/source/codegen/jni/CMakeLists.txt +36 -0
- package/android/app/build/generated/source/codegen/jni/RNCWebViewSpec-generated.cpp +38 -0
- package/android/app/build/generated/source/codegen/jni/RNCWebViewSpec.h +31 -0
- package/android/app/build/generated/source/codegen/jni/RNPermissionsSpec-generated.cpp +104 -0
- package/android/app/build/generated/source/codegen/jni/RNPermissionsSpec.h +31 -0
- package/android/app/build/generated/source/codegen/jni/ReactNativeBlobUtilSpec-generated.cpp +320 -0
- package/android/app/build/generated/source/codegen/jni/ReactNativeBlobUtilSpec.h +31 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/BankingDcbSdkReactNativeJSI-generated.cpp +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/BankingDcbSdkReactNativeJSI.h +19 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/ComponentDescriptors.cpp +22 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/ComponentDescriptors.h +24 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/EventEmitters.cpp +16 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/EventEmitters.h +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/Props.cpp +19 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/Props.h +18 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/ShadowNodes.cpp +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/ShadowNodes.h +23 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/States.cpp +16 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/States.h +19 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.cpp +22 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.h +24 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/EventEmitters.cpp +258 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/EventEmitters.h +277 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/Props.cpp +101 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/Props.h +507 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/RNCWebViewSpecJSI-generated.cpp +35 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/RNCWebViewSpecJSI.h +80 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ShadowNodes.cpp +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ShadowNodes.h +32 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/States.cpp +16 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/States.h +29 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNPermissionsSpec/RNPermissionsSpecJSI-generated.cpp +106 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNPermissionsSpec/RNPermissionsSpecJSI.h +226 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/ReactNativeBlobUtilSpec/ReactNativeBlobUtilSpecJSI-generated.cpp +449 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/ReactNativeBlobUtilSpec/ReactNativeBlobUtilSpecJSI.h +503 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnasyncstorage/rnasyncstorageJSI-generated.cpp +72 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnasyncstorage/rnasyncstorageJSI.h +116 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/ComponentDescriptors.cpp +31 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/ComponentDescriptors.h +33 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/EventEmitters.cpp +499 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/EventEmitters.h +422 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/Props.cpp +307 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/Props.h +1391 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/ShadowNodes.cpp +26 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/ShadowNodes.h +131 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/States.cpp +16 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/States.h +137 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/rnscreensJSI-generated.cpp +22 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/rnscreensJSI.h +64 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ComponentDescriptors.cpp +22 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ComponentDescriptors.h +24 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/EventEmitters.cpp +40 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/EventEmitters.h +47 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/Props.cpp +33 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/Props.h +85 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ShadowNodes.cpp +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ShadowNodes.h +32 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/States.cpp +16 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/States.h +29 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/safeareacontextJSI-generated.cpp +26 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/safeareacontextJSI.h +71 -0
- package/android/app/build/generated/source/codegen/jni/rnasyncstorage-generated.cpp +62 -0
- package/android/app/build/generated/source/codegen/jni/rnasyncstorage.h +31 -0
- package/android/app/build/generated/source/codegen/jni/rnscreens-generated.cpp +29 -0
- package/android/app/build/generated/source/codegen/jni/rnscreens.h +31 -0
- package/android/app/build/generated/source/codegen/jni/safeareacontext-generated.cpp +32 -0
- package/android/app/build/generated/source/codegen/jni/safeareacontext.h +31 -0
- package/lib/module/helpers/banking_dcb_react_native.js +71 -13
- package/lib/module/helpers/banking_dcb_react_native.js.map +1 -1
- package/lib/module/helpers/utils/Constants.js +9 -7
- package/lib/module/helpers/utils/Constants.js.map +1 -1
- package/lib/module/helpers/utils/webviewCallback.js +11 -0
- package/lib/module/helpers/utils/webviewCallback.js.map +1 -1
- package/lib/module/helpers/webview.js +120 -60
- package/lib/module/helpers/webview.js.map +1 -1
- package/lib/typescript/src/helpers/banking_dcb_react_native.d.ts +2 -2
- package/lib/typescript/src/helpers/banking_dcb_react_native.d.ts.map +1 -1
- package/lib/typescript/src/helpers/utils/Constants.d.ts +2 -0
- package/lib/typescript/src/helpers/utils/Constants.d.ts.map +1 -1
- package/lib/typescript/src/helpers/utils/webviewCallback.d.ts +10 -1
- package/lib/typescript/src/helpers/utils/webviewCallback.d.ts.map +1 -1
- package/lib/typescript/src/helpers/webview.d.ts +8 -0
- package/lib/typescript/src/helpers/webview.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/helpers/banking_dcb_react_native.tsx +135 -18
- package/src/helpers/utils/Constants.tsx +10 -9
- package/src/helpers/utils/webviewCallback.tsx +32 -16
- package/src/helpers/webview.tsx +142 -65
- package/PartnerReactNativeSdk.podspec +0 -31
package/src/helpers/webview.tsx
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
WebView as RNWebView,
|
|
3
|
+
type WebViewMessageEvent,
|
|
4
|
+
} from 'react-native-webview';
|
|
2
5
|
import {
|
|
3
6
|
BackHandler,
|
|
4
7
|
Platform,
|
|
@@ -30,7 +33,7 @@ import FileViewer from 'react-native-file-viewer';
|
|
|
30
33
|
import RNFS from 'react-native-fs';
|
|
31
34
|
import CookieManager from '@react-native-cookies/cookies';
|
|
32
35
|
import { AnalyticsLogger } from './analytics/analytics_logger';
|
|
33
|
-
import
|
|
36
|
+
import SendIntentAndroid from 'react-native-send-intent';
|
|
34
37
|
|
|
35
38
|
interface ExtendedWebViewProps extends WebViewProps {
|
|
36
39
|
onPermissionRequest?: (event: any) => void;
|
|
@@ -51,69 +54,70 @@ interface WebViewCustomProps {
|
|
|
51
54
|
|
|
52
55
|
type MailApp = 'gmail' | 'outlook' | 'yahoo';
|
|
53
56
|
|
|
54
|
-
const PKG = {
|
|
57
|
+
const PKG: Record<MailApp, string> = {
|
|
55
58
|
gmail: 'com.google.android.gm',
|
|
56
59
|
outlook: 'com.microsoft.office.outlook',
|
|
57
60
|
yahoo: 'com.yahoo.mobile.client.android.mail',
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const YAHOO_CLASS =
|
|
61
|
-
'com.yahoo.mobile.client.android.mail.activity.MainActivity';
|
|
61
|
+
};
|
|
62
62
|
|
|
63
|
-
const SCHEME = {
|
|
63
|
+
const SCHEME: Record<MailApp, string> = {
|
|
64
64
|
gmail: 'googlegmail://',
|
|
65
65
|
outlook: 'ms-outlook://',
|
|
66
66
|
yahoo: 'ymail://',
|
|
67
|
-
}
|
|
67
|
+
};
|
|
68
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Try to open a specific mail app, like Gmail.
|
|
71
|
+
* Returns true if something was opened, false otherwise.
|
|
72
|
+
*
|
|
73
|
+
* Order of attempts:
|
|
74
|
+
* 1. openApp(<package>) via react-native-send-intent
|
|
75
|
+
* 2. Linking.openURL(<custom scheme>) as fallback
|
|
76
|
+
*/
|
|
69
77
|
export async function openMailAppIntent(app: MailApp): Promise<boolean> {
|
|
70
|
-
|
|
71
|
-
|
|
78
|
+
if (Platform.OS !== 'android') {
|
|
79
|
+
// iOS? We don't do anything special here. Just say "not handled".
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const pkg = PKG[app];
|
|
84
|
+
const scheme = SCHEME[app];
|
|
72
85
|
|
|
86
|
+
// Step 1: Try launching the package directly.
|
|
73
87
|
try {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
packageName: PKG.yahoo,
|
|
80
|
-
className: YAHOO_CLASS,
|
|
81
|
-
flags: [IntentConstant.FLAG_ACTIVITY_NEW_TASK],
|
|
82
|
-
});
|
|
83
|
-
} else {
|
|
84
|
-
// Gmail & Outlook: let Android resolve launcher Activity
|
|
85
|
-
await IntentLauncher.startActivity({
|
|
86
|
-
action: 'android.intent.action.MAIN',
|
|
87
|
-
category: 'android.intent.category.LAUNCHER',
|
|
88
|
-
packageName: PKG[app],
|
|
89
|
-
flags: [IntentConstant.FLAG_ACTIVITY_NEW_TASK],
|
|
90
|
-
});
|
|
88
|
+
// openApp(packageName) resolves to boolean: wasOpened
|
|
89
|
+
// according to the lib docs. :contentReference[oaicite:3]{index=3}
|
|
90
|
+
const wasOpened = await SendIntentAndroid.openApp(pkg, {});
|
|
91
|
+
if (wasOpened) {
|
|
92
|
+
return true;
|
|
91
93
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
console.log('IntentLauncher.startActivity failed for', app, e);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
console.log(`SDK:LOG: [mailIntent] openApp(${pkg}) failed:`, err);
|
|
95
96
|
}
|
|
96
97
|
|
|
97
|
-
// Fallback to
|
|
98
|
+
// Step 2: Fallback to the custom scheme.
|
|
98
99
|
try {
|
|
99
|
-
const scheme = SCHEME[app];
|
|
100
100
|
const canOpen = await Linking.canOpenURL(scheme);
|
|
101
101
|
if (canOpen) {
|
|
102
102
|
await Linking.openURL(scheme);
|
|
103
103
|
return true;
|
|
104
104
|
}
|
|
105
|
-
} catch (
|
|
106
|
-
console.log(
|
|
105
|
+
} catch (err2) {
|
|
106
|
+
console.log(
|
|
107
|
+
`SDK:LOG: [mailIntent] Linking fallback (${scheme}) failed:`,
|
|
108
|
+
err2
|
|
109
|
+
);
|
|
107
110
|
}
|
|
108
111
|
|
|
109
112
|
return false;
|
|
110
113
|
}
|
|
114
|
+
|
|
111
115
|
const clearAllCookies = async () => {
|
|
112
116
|
try {
|
|
113
117
|
await CookieManager.clearAll(true);
|
|
114
|
-
console.log('clearing cookies');
|
|
118
|
+
console.log('SDK:LOG: clearing cookies');
|
|
115
119
|
} catch (e) {
|
|
116
|
-
console.error('Failed to clear cookies:', e);
|
|
120
|
+
console.error('SDK:LOG: Failed to clear cookies:', e);
|
|
117
121
|
}
|
|
118
122
|
};
|
|
119
123
|
|
|
@@ -127,7 +131,9 @@ export const WebView = ({
|
|
|
127
131
|
}: WebViewCustomProps) => {
|
|
128
132
|
const webviewRef = useRef<RNWebView | null>(null);
|
|
129
133
|
const [canGoBack, setCanGoBack] = useState(false);
|
|
130
|
-
const
|
|
134
|
+
const canGoBackRef = useRef(false);
|
|
135
|
+
const hasUserClosedRef = useRef(false);
|
|
136
|
+
|
|
131
137
|
// const [hasRedirected, setHasRedirected] = useState(false);
|
|
132
138
|
const [, setToast] = useState<{ visible: boolean; message: string } | null>(
|
|
133
139
|
null
|
|
@@ -145,7 +151,7 @@ export const WebView = ({
|
|
|
145
151
|
ToastAndroid.LONG
|
|
146
152
|
);
|
|
147
153
|
}
|
|
148
|
-
console.log('Application not found to open link');
|
|
154
|
+
console.log('SDK:LOG: Application not found to open link');
|
|
149
155
|
}
|
|
150
156
|
};
|
|
151
157
|
const showToast_with_code_message = (syntheticEvent: any) => {
|
|
@@ -186,7 +192,7 @@ export const WebView = ({
|
|
|
186
192
|
|
|
187
193
|
const downloadAndOpenFile = async (fileUrl: string) => {
|
|
188
194
|
try {
|
|
189
|
-
console.log('Starting file download...', fileUrl);
|
|
195
|
+
console.log('SDK:LOG: Starting file download...', fileUrl);
|
|
190
196
|
|
|
191
197
|
// Get cookies using CookieManager
|
|
192
198
|
let cookieString = '';
|
|
@@ -196,7 +202,7 @@ export const WebView = ({
|
|
|
196
202
|
.map((key) => `${key}=${cookies[key]?.value ?? ''}`)
|
|
197
203
|
.join('; ');
|
|
198
204
|
} catch (e) {
|
|
199
|
-
console.error('Failed to get cookies:', e);
|
|
205
|
+
console.error('SDK:LOG: Failed to get cookies:', e);
|
|
200
206
|
}
|
|
201
207
|
|
|
202
208
|
// Create a clean filename from the URL
|
|
@@ -216,7 +222,7 @@ export const WebView = ({
|
|
|
216
222
|
throw new Error('Could not determine download path');
|
|
217
223
|
}
|
|
218
224
|
|
|
219
|
-
console.log('Downloading to:', downloadPath);
|
|
225
|
+
console.log('SDK:LOG: Downloading to:', downloadPath);
|
|
220
226
|
|
|
221
227
|
const options = {
|
|
222
228
|
fromUrl: fileUrl,
|
|
@@ -228,14 +234,14 @@ export const WebView = ({
|
|
|
228
234
|
},
|
|
229
235
|
background: true,
|
|
230
236
|
begin: (res: any) => {
|
|
231
|
-
console.log('Download started with headers:', res);
|
|
237
|
+
console.log('SDK:LOG: Download started with headers:', res);
|
|
232
238
|
},
|
|
233
239
|
};
|
|
234
240
|
|
|
235
241
|
const response = await RNFS.downloadFile(options).promise;
|
|
236
242
|
|
|
237
243
|
if (response.statusCode === 200) {
|
|
238
|
-
console.log('File downloaded to:', downloadPath);
|
|
244
|
+
console.log('SDK:LOG: File downloaded to:', downloadPath);
|
|
239
245
|
|
|
240
246
|
if (Platform.OS === 'android') {
|
|
241
247
|
ToastAndroid.show('File downloaded successfully', ToastAndroid.SHORT);
|
|
@@ -253,20 +259,21 @@ export const WebView = ({
|
|
|
253
259
|
throw new Error(`Download failed with status ${response.statusCode}`);
|
|
254
260
|
}
|
|
255
261
|
} catch (error) {
|
|
256
|
-
console.error('File download/open error:', error);
|
|
262
|
+
console.error('SDK:LOG: File download/open error:', error);
|
|
257
263
|
}
|
|
258
264
|
};
|
|
259
265
|
|
|
260
266
|
const handleOnShouldStartLoadWithRequest = (event: WebViewNavigation) => {
|
|
261
267
|
const { url } = event;
|
|
262
|
-
console.log('URL:', url);
|
|
263
|
-
|
|
268
|
+
console.log('SDK:LOG: WEBVIEW URL:', url);
|
|
269
|
+
|
|
270
|
+
if (!url || url === 'about:blank' || url === 'about:srcdoc') {
|
|
264
271
|
return true;
|
|
265
272
|
}
|
|
266
273
|
|
|
267
274
|
if (Platform.OS === 'android' && url) {
|
|
268
275
|
if (url.includes('ms-outlook://')) {
|
|
269
|
-
console.log('Intent to open Outlook detected');
|
|
276
|
+
console.log('SDK:LOG: Intent to open Outlook detected');
|
|
270
277
|
openMailAppIntent('outlook').then(
|
|
271
278
|
(ok) =>
|
|
272
279
|
!ok &&
|
|
@@ -275,7 +282,7 @@ export const WebView = ({
|
|
|
275
282
|
return false; // cancel WebView navigation
|
|
276
283
|
}
|
|
277
284
|
if (url.includes('googlegmail://')) {
|
|
278
|
-
console.log('Intent to open Gmail detected');
|
|
285
|
+
console.log('SDK:LOG: Intent to open Gmail detected');
|
|
279
286
|
openMailAppIntent('gmail').then(
|
|
280
287
|
(ok) =>
|
|
281
288
|
!ok && ToastAndroid.show('Gmail app not found', ToastAndroid.SHORT)
|
|
@@ -283,7 +290,7 @@ export const WebView = ({
|
|
|
283
290
|
return false;
|
|
284
291
|
}
|
|
285
292
|
if (url.includes('ymail://')) {
|
|
286
|
-
console.log('Intent to open Yahoo Mail detected');
|
|
293
|
+
console.log('SDK:LOG: Intent to open Yahoo Mail detected');
|
|
287
294
|
openMailAppIntent('yahoo').then(
|
|
288
295
|
(ok) =>
|
|
289
296
|
!ok &&
|
|
@@ -297,10 +304,10 @@ export const WebView = ({
|
|
|
297
304
|
url?.includes('/session-expired?status=') ||
|
|
298
305
|
url?.includes('/redirect?status=')
|
|
299
306
|
) {
|
|
300
|
-
console.log('overriding url');
|
|
307
|
+
console.log('SDK:LOG: overriding url');
|
|
301
308
|
const status = getQueryParam(url, 'status');
|
|
302
309
|
|
|
303
|
-
console.log('Status thrown from webview ', status);
|
|
310
|
+
console.log('SDK:LOG: Status thrown from webview ', status);
|
|
304
311
|
|
|
305
312
|
StatusBar.setBackgroundColor('#7E7E7EFF');
|
|
306
313
|
clearAllCookies();
|
|
@@ -308,7 +315,7 @@ export const WebView = ({
|
|
|
308
315
|
return false;
|
|
309
316
|
}
|
|
310
317
|
if (url?.includes('/api/user/redirect')) {
|
|
311
|
-
console.log('overriding redirect url');
|
|
318
|
+
console.log('SDK:LOG: overriding redirect url');
|
|
312
319
|
|
|
313
320
|
StatusBar.setBackgroundColor('#7E7E7EFF');
|
|
314
321
|
clearAllCookies();
|
|
@@ -327,7 +334,7 @@ export const WebView = ({
|
|
|
327
334
|
url !== 'about:blank' &&
|
|
328
335
|
url !== 'about:srcdoc'
|
|
329
336
|
) {
|
|
330
|
-
console.log('External URL detected:', url);
|
|
337
|
+
console.log('SDK:LOG: External URL detected:', url);
|
|
331
338
|
handleExternalUrl(url);
|
|
332
339
|
return false;
|
|
333
340
|
}
|
|
@@ -336,7 +343,7 @@ export const WebView = ({
|
|
|
336
343
|
url.includes('/statements/') ||
|
|
337
344
|
url.includes('/download_statements')
|
|
338
345
|
) {
|
|
339
|
-
console.log('File download URL detected:', url);
|
|
346
|
+
console.log('SDK:LOG: File download URL detected:', url);
|
|
340
347
|
downloadAndOpenFile(url);
|
|
341
348
|
return false;
|
|
342
349
|
}
|
|
@@ -369,17 +376,44 @@ export const WebView = ({
|
|
|
369
376
|
);
|
|
370
377
|
|
|
371
378
|
// Cookie injection script
|
|
372
|
-
|
|
373
379
|
const injectedJavaScript = `
|
|
380
|
+
(function() {
|
|
381
|
+
function safePost(msg) {
|
|
382
|
+
try {
|
|
383
|
+
if (window.ReactNativeWebView) {
|
|
384
|
+
window.ReactNativeWebView.postMessage(JSON.stringify(msg));
|
|
385
|
+
}
|
|
386
|
+
} catch (e) {}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Preserve any existing window.onerror
|
|
390
|
+
var previousOnError = window.onerror || null;
|
|
374
391
|
window.onerror = function(message, source, lineno, colno, error) {
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
392
|
+
try {
|
|
393
|
+
if (String(message || '').indexOf('RATE_LIMIT_USER') !== -1 &&
|
|
394
|
+
window.ReactNativeWebView) {
|
|
395
|
+
safePost({ type: 'RATE_LIMIT_ERROR' });
|
|
396
|
+
}
|
|
397
|
+
} catch (e) {}
|
|
398
|
+
if (typeof previousOnError === 'function') {
|
|
399
|
+
try { return previousOnError.apply(this, arguments); } catch (e) {}
|
|
379
400
|
}
|
|
380
401
|
};
|
|
381
|
-
|
|
382
|
-
|
|
402
|
+
|
|
403
|
+
// Patch history.back() to notify the app
|
|
404
|
+
if (window.history && typeof window.history.back === 'function') {
|
|
405
|
+
var originalBack = window.history.back;
|
|
406
|
+
window.history.back = function() {
|
|
407
|
+
safePost({
|
|
408
|
+
type: 'HISTORY_BACK_CALLED',
|
|
409
|
+
href: window.location.href
|
|
410
|
+
});
|
|
411
|
+
return originalBack.apply(this, arguments);
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
})();
|
|
415
|
+
true;
|
|
416
|
+
`;
|
|
383
417
|
|
|
384
418
|
const requestPermission = async (permission: Permission) => {
|
|
385
419
|
try {
|
|
@@ -392,14 +426,14 @@ export const WebView = ({
|
|
|
392
426
|
|
|
393
427
|
return result === RESULTS.GRANTED;
|
|
394
428
|
} catch (error) {
|
|
395
|
-
console.error('Permission request failed:', error);
|
|
429
|
+
console.error('SDK:LOG: Permission request failed:', error);
|
|
396
430
|
return false;
|
|
397
431
|
}
|
|
398
432
|
};
|
|
399
433
|
|
|
400
434
|
const handlePermissionRequest = async (event: any) => {
|
|
401
435
|
const { resources } = event.nativeEvent;
|
|
402
|
-
console.log('Permission requested:', resources);
|
|
436
|
+
console.log('SDK:LOG: Permission requested:', resources);
|
|
403
437
|
|
|
404
438
|
const permissionsToRequest: Permission[] = [];
|
|
405
439
|
|
|
@@ -439,12 +473,52 @@ export const WebView = ({
|
|
|
439
473
|
event.nativeEvent.deny();
|
|
440
474
|
}
|
|
441
475
|
} catch (error) {
|
|
442
|
-
console.error('Permission handling failed:', error);
|
|
476
|
+
console.error('SDK:LOG: Permission handling failed:', error);
|
|
443
477
|
// @ts-ignore - deny exists on the event
|
|
444
478
|
event.nativeEvent.deny();
|
|
445
479
|
}
|
|
446
480
|
};
|
|
447
481
|
|
|
482
|
+
const handleMessage = (event: WebViewMessageEvent) => {
|
|
483
|
+
try {
|
|
484
|
+
const data = JSON.parse(event.nativeEvent.data);
|
|
485
|
+
console.log('SDK:LOG: onMessage data =');
|
|
486
|
+
|
|
487
|
+
// 1) history.back() from a "root" page → treat as USER_CLOSED
|
|
488
|
+
if (data?.type === 'HISTORY_BACK_CALLED') {
|
|
489
|
+
console.log('SDK:LOG: HISTORY_BACK_CALLED at', data.href);
|
|
490
|
+
|
|
491
|
+
if (!canGoBackRef.current && !hasUserClosedRef.current) {
|
|
492
|
+
hasUserClosedRef.current = true;
|
|
493
|
+
|
|
494
|
+
console.log(
|
|
495
|
+
'SDK:LOG: No WebView history. Treating HISTORY_BACK as USER_CLOSED'
|
|
496
|
+
);
|
|
497
|
+
|
|
498
|
+
StatusBar.setBackgroundColor('#7E7E7EFF');
|
|
499
|
+
clearAllCookies();
|
|
500
|
+
onCallback?.(WebViewCallback.redirect('USER_CLOSED'));
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
if (data?.type === 'RATE_LIMIT_ERROR') {
|
|
507
|
+
console.log('SDK:LOG: RATE_LIMIT_ERROR received from web');
|
|
508
|
+
ToastAndroid.show(
|
|
509
|
+
'Too many requests. Please try after 1 minute',
|
|
510
|
+
ToastAndroid.LONG
|
|
511
|
+
);
|
|
512
|
+
// StatusBar.setBackgroundColor('#7E7E7EFF');
|
|
513
|
+
// clearAllCookies();
|
|
514
|
+
// onCallback?.(WebViewCallback.redirect('RATE_LIMIT_ERROR'));
|
|
515
|
+
// return;
|
|
516
|
+
}
|
|
517
|
+
} catch (e) {
|
|
518
|
+
console.warn('SDK:LOG: Error parsing WebView message', e);
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
|
|
448
522
|
const handleWebViewLoadEnd = (syntheticEvent: any) => {
|
|
449
523
|
const loadedUrl = syntheticEvent?.nativeEvent?.url || url;
|
|
450
524
|
|
|
@@ -480,7 +554,9 @@ export const WebView = ({
|
|
|
480
554
|
allowsInlineMediaPlayback={true}
|
|
481
555
|
onShouldStartLoadWithRequest={handleOnShouldStartLoadWithRequest}
|
|
482
556
|
onNavigationStateChange={(navState) => {
|
|
557
|
+
console.log('SDK:LOG: NAV STATE URL:', navState.url);
|
|
483
558
|
setCanGoBack(navState.canGoBack);
|
|
559
|
+
canGoBackRef.current = navState.canGoBack;
|
|
484
560
|
}}
|
|
485
561
|
injectedJavaScript={injectedJavaScript}
|
|
486
562
|
decelerationRate={Platform.OS === 'ios' ? 'normal' : 0.9}
|
|
@@ -489,6 +565,7 @@ export const WebView = ({
|
|
|
489
565
|
setSupportMultipleWindows={false}
|
|
490
566
|
mixedContentMode="always"
|
|
491
567
|
allowsLinkPreview={true}
|
|
568
|
+
onMessage={handleMessage}
|
|
492
569
|
/>
|
|
493
570
|
</SafeAreaView>
|
|
494
571
|
);
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
require "json"
|
|
2
|
-
|
|
3
|
-
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
|
-
|
|
5
|
-
Pod::Spec.new do |s|
|
|
6
|
-
s.name = "PartnerReactNativeSdk"
|
|
7
|
-
s.version = package["version"]
|
|
8
|
-
s.summary = package["description"]
|
|
9
|
-
s.homepage = package["homepage"]
|
|
10
|
-
s.license = package["license"]
|
|
11
|
-
s.authors = package["author"]
|
|
12
|
-
|
|
13
|
-
s.platforms = { :ios => min_ios_version_supported }
|
|
14
|
-
s.source = { :git => "https://github.com/spense-fintech/partner-react-native-library.git.git", :tag => "#{s.version}" }
|
|
15
|
-
|
|
16
|
-
s.source_files = "ios/**/*.{h,m,mm,cpp}"
|
|
17
|
-
# s.private_header_files = "ios/**/*.h"
|
|
18
|
-
s.exclude_files = "ios/generated/**"
|
|
19
|
-
|
|
20
|
-
# Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
|
|
21
|
-
# See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79.
|
|
22
|
-
if respond_to?(:install_modules_dependencies, true)
|
|
23
|
-
install_modules_dependencies(s)
|
|
24
|
-
else
|
|
25
|
-
s.dependency "React-Core"
|
|
26
|
-
s.dependency "React-Codegen"
|
|
27
|
-
s.dependency "RCTRequired"
|
|
28
|
-
s.dependency "RCTTypeSafety"
|
|
29
|
-
s.dependency "ReactCommon/turbomodule/core"
|
|
30
|
-
end
|
|
31
|
-
end
|