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.
Files changed (147) hide show
  1. package/BankingDcbSdkReactNative.podspec +28 -0
  2. package/android/app/build/generated/source/codegen/RCTAppDependencyProvider.h +25 -0
  3. package/android/app/build/generated/source/codegen/RCTAppDependencyProvider.mm +55 -0
  4. package/android/app/build/generated/source/codegen/RCTModulesConformingToProtocolsProvider.h +18 -0
  5. package/android/app/build/generated/source/codegen/RCTModulesConformingToProtocolsProvider.mm +33 -0
  6. package/android/app/build/generated/source/codegen/RCTThirdPartyComponentsProvider.h +16 -0
  7. package/android/app/build/generated/source/codegen/RCTThirdPartyComponentsProvider.mm +62 -0
  8. package/android/app/build/generated/source/codegen/ReactAppDependencyProvider.podspec +34 -0
  9. package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeAsyncStorageModuleSpec.java +59 -0
  10. package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeBlobUtilsSpec.java +280 -0
  11. package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeRNCWebViewModuleSpec.java +42 -0
  12. package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeRNPermissionsSpec.java +87 -0
  13. package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSafeAreaContextSpec.java +65 -0
  14. package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeScreensModuleSpec.java +35 -0
  15. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerDelegate.java +26 -0
  16. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerInterface.java +17 -0
  17. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerDelegate.java +36 -0
  18. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerInterface.java +20 -0
  19. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCWebViewManagerDelegate.java +301 -0
  20. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCWebViewManagerInterface.java +107 -0
  21. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerDelegate.java +84 -0
  22. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerInterface.java +35 -0
  23. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java +101 -0
  24. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java +42 -0
  25. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSFullWindowOverlayManagerDelegate.java +32 -0
  26. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSFullWindowOverlayManagerInterface.java +17 -0
  27. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSModalScreenManagerDelegate.java +128 -0
  28. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSModalScreenManagerInterface.java +51 -0
  29. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSafeAreaViewManagerDelegate.java +36 -0
  30. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSafeAreaViewManagerInterface.java +20 -0
  31. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +26 -0
  32. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +17 -0
  33. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerDelegate.java +26 -0
  34. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java +17 -0
  35. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerDelegate.java +26 -0
  36. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java +17 -0
  37. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +140 -0
  38. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +55 -0
  39. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenNavigationContainerManagerDelegate.java +26 -0
  40. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenNavigationContainerManagerInterface.java +17 -0
  41. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +121 -0
  42. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +48 -0
  43. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +35 -0
  44. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +19 -0
  45. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHostManagerDelegate.java +26 -0
  46. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackHostManagerInterface.java +17 -0
  47. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java +26 -0
  48. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java +17 -0
  49. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +106 -0
  50. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +40 -0
  51. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSplitViewHostManagerDelegate.java +57 -0
  52. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSplitViewHostManagerInterface.java +27 -0
  53. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSplitViewScreenManagerDelegate.java +32 -0
  54. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSSplitViewScreenManagerInterface.java +18 -0
  55. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSStackScreenManagerDelegate.java +35 -0
  56. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNSStackScreenManagerInterface.java +19 -0
  57. package/android/app/build/generated/source/codegen/jni/BankingDcbSdkReactNative-generated.cpp +22 -0
  58. package/android/app/build/generated/source/codegen/jni/BankingDcbSdkReactNative.h +24 -0
  59. package/android/app/build/generated/source/codegen/jni/CMakeLists.txt +36 -0
  60. package/android/app/build/generated/source/codegen/jni/RNCWebViewSpec-generated.cpp +38 -0
  61. package/android/app/build/generated/source/codegen/jni/RNCWebViewSpec.h +31 -0
  62. package/android/app/build/generated/source/codegen/jni/RNPermissionsSpec-generated.cpp +104 -0
  63. package/android/app/build/generated/source/codegen/jni/RNPermissionsSpec.h +31 -0
  64. package/android/app/build/generated/source/codegen/jni/ReactNativeBlobUtilSpec-generated.cpp +320 -0
  65. package/android/app/build/generated/source/codegen/jni/ReactNativeBlobUtilSpec.h +31 -0
  66. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/BankingDcbSdkReactNativeJSI-generated.cpp +17 -0
  67. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/BankingDcbSdkReactNativeJSI.h +19 -0
  68. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/ComponentDescriptors.cpp +22 -0
  69. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/ComponentDescriptors.h +24 -0
  70. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/EventEmitters.cpp +16 -0
  71. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/EventEmitters.h +17 -0
  72. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/Props.cpp +19 -0
  73. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/Props.h +18 -0
  74. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/ShadowNodes.cpp +17 -0
  75. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/ShadowNodes.h +23 -0
  76. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/States.cpp +16 -0
  77. package/android/app/build/generated/source/codegen/jni/react/renderer/components/BankingDcbSdkReactNative/States.h +19 -0
  78. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.cpp +22 -0
  79. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.h +24 -0
  80. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/EventEmitters.cpp +258 -0
  81. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/EventEmitters.h +277 -0
  82. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/Props.cpp +101 -0
  83. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/Props.h +507 -0
  84. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/RNCWebViewSpecJSI-generated.cpp +35 -0
  85. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/RNCWebViewSpecJSI.h +80 -0
  86. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ShadowNodes.cpp +17 -0
  87. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ShadowNodes.h +32 -0
  88. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/States.cpp +16 -0
  89. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/States.h +29 -0
  90. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNPermissionsSpec/RNPermissionsSpecJSI-generated.cpp +106 -0
  91. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNPermissionsSpec/RNPermissionsSpecJSI.h +226 -0
  92. package/android/app/build/generated/source/codegen/jni/react/renderer/components/ReactNativeBlobUtilSpec/ReactNativeBlobUtilSpecJSI-generated.cpp +449 -0
  93. package/android/app/build/generated/source/codegen/jni/react/renderer/components/ReactNativeBlobUtilSpec/ReactNativeBlobUtilSpecJSI.h +503 -0
  94. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnasyncstorage/rnasyncstorageJSI-generated.cpp +72 -0
  95. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnasyncstorage/rnasyncstorageJSI.h +116 -0
  96. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/ComponentDescriptors.cpp +31 -0
  97. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/ComponentDescriptors.h +33 -0
  98. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/EventEmitters.cpp +499 -0
  99. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/EventEmitters.h +422 -0
  100. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/Props.cpp +307 -0
  101. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/Props.h +1391 -0
  102. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/ShadowNodes.cpp +26 -0
  103. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/ShadowNodes.h +131 -0
  104. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/States.cpp +16 -0
  105. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/States.h +137 -0
  106. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/rnscreensJSI-generated.cpp +22 -0
  107. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rnscreens/rnscreensJSI.h +64 -0
  108. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ComponentDescriptors.cpp +22 -0
  109. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ComponentDescriptors.h +24 -0
  110. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/EventEmitters.cpp +40 -0
  111. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/EventEmitters.h +47 -0
  112. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/Props.cpp +33 -0
  113. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/Props.h +85 -0
  114. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ShadowNodes.cpp +17 -0
  115. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ShadowNodes.h +32 -0
  116. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/States.cpp +16 -0
  117. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/States.h +29 -0
  118. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/safeareacontextJSI-generated.cpp +26 -0
  119. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/safeareacontextJSI.h +71 -0
  120. package/android/app/build/generated/source/codegen/jni/rnasyncstorage-generated.cpp +62 -0
  121. package/android/app/build/generated/source/codegen/jni/rnasyncstorage.h +31 -0
  122. package/android/app/build/generated/source/codegen/jni/rnscreens-generated.cpp +29 -0
  123. package/android/app/build/generated/source/codegen/jni/rnscreens.h +31 -0
  124. package/android/app/build/generated/source/codegen/jni/safeareacontext-generated.cpp +32 -0
  125. package/android/app/build/generated/source/codegen/jni/safeareacontext.h +31 -0
  126. package/lib/module/helpers/banking_dcb_react_native.js +71 -13
  127. package/lib/module/helpers/banking_dcb_react_native.js.map +1 -1
  128. package/lib/module/helpers/utils/Constants.js +9 -7
  129. package/lib/module/helpers/utils/Constants.js.map +1 -1
  130. package/lib/module/helpers/utils/webviewCallback.js +11 -0
  131. package/lib/module/helpers/utils/webviewCallback.js.map +1 -1
  132. package/lib/module/helpers/webview.js +120 -60
  133. package/lib/module/helpers/webview.js.map +1 -1
  134. package/lib/typescript/src/helpers/banking_dcb_react_native.d.ts +2 -2
  135. package/lib/typescript/src/helpers/banking_dcb_react_native.d.ts.map +1 -1
  136. package/lib/typescript/src/helpers/utils/Constants.d.ts +2 -0
  137. package/lib/typescript/src/helpers/utils/Constants.d.ts.map +1 -1
  138. package/lib/typescript/src/helpers/utils/webviewCallback.d.ts +10 -1
  139. package/lib/typescript/src/helpers/utils/webviewCallback.d.ts.map +1 -1
  140. package/lib/typescript/src/helpers/webview.d.ts +8 -0
  141. package/lib/typescript/src/helpers/webview.d.ts.map +1 -1
  142. package/package.json +4 -4
  143. package/src/helpers/banking_dcb_react_native.tsx +135 -18
  144. package/src/helpers/utils/Constants.tsx +10 -9
  145. package/src/helpers/utils/webviewCallback.tsx +32 -16
  146. package/src/helpers/webview.tsx +142 -65
  147. package/PartnerReactNativeSdk.podspec +0 -31
@@ -1,4 +1,7 @@
1
- import { WebView as RNWebView } from 'react-native-webview';
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 IntentLauncher, { IntentConstant } from 'react-native-intent-launcher';
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
- } as const;
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
- } as const;
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
- console.log('new changes deployed');
71
- if (Platform.OS !== 'android') return false;
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
- if (app === 'yahoo') {
75
- // Yahoo needed explicit component in Flutter, keep that
76
- await IntentLauncher.startActivity({
77
- action: 'android.intent.action.MAIN',
78
- category: 'android.intent.category.LAUNCHER',
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
- return true;
93
- } catch (e) {
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 scheme like in previous step
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 (e2) {
106
- console.log('Linking fallback failed for', app, e2);
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 _analyticsLogger = new AnalyticsLogger();
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
- if (url === 'about:blank' || url === 'about:srcdoc') {
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
- if (message.includes('RATE_LIMIT_USER')) {
376
- window.ReactNativeWebView.postMessage(JSON.stringify({
377
- type: 'RATE_LIMIT_ERROR'
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
- true;
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