@jimrising/easymerchantsdk-react-native 1.3.9 → 1.4.2

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 (80) hide show
  1. package/.idea/caches/deviceStreaming.xml +77 -0
  2. package/README.md +140 -81
  3. package/android/.gradle/8.10/checksums/checksums.lock +0 -0
  4. package/android/.gradle/8.10/checksums/md5-checksums.bin +0 -0
  5. package/android/.gradle/8.10/checksums/sha1-checksums.bin +0 -0
  6. package/android/.gradle/8.10/fileHashes/fileHashes.lock +0 -0
  7. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  8. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  9. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  10. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  11. package/android/.gradle/buildOutputCleanup/cache.properties +1 -1
  12. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/results.bin +1 -0
  13. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/BuildConfig.dex +0 -0
  14. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule$1.dex +0 -0
  15. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule$2.dex +0 -0
  16. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule.dex +0 -0
  17. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkPackage.dex +0 -0
  18. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  19. package/android/build/.transforms/e9a664a11ce12edf79cd87b1e07aa243/results.bin +1 -0
  20. package/android/build/.transforms/e9a664a11ce12edf79cd87b1e07aa243/transformed/classes/classes_dex/classes.dex +0 -0
  21. package/android/build/generated/source/buildConfig/debug/com/reactlibrary/BuildConfig.java +10 -0
  22. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +7 -0
  23. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  24. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  25. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  26. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  27. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  28. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
  29. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
  30. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  31. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  32. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  33. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
  34. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/BuildConfig.class +0 -0
  35. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$1.class +0 -0
  36. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$2.class +0 -0
  37. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule.class +0 -0
  38. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkPackage.class +0 -0
  39. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +2 -0
  40. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +7 -0
  41. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +7 -0
  42. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  43. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  44. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/BuildConfig.class +0 -0
  45. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkModule$1.class +0 -0
  46. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkModule$2.class +0 -0
  47. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkModule.class +0 -0
  48. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkPackage.class +0 -0
  49. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  50. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +1 -0
  51. package/android/build/outputs/logs/manifest-merger-debug-report.txt +17 -0
  52. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNEasymerchantsdkModule$1.class.uniqueId2 +0 -0
  53. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNEasymerchantsdkModule$2.class.uniqueId0 +0 -0
  54. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNEasymerchantsdkModule.class.uniqueId3 +0 -0
  55. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNEasymerchantsdkPackage.class.uniqueId1 +0 -0
  56. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  57. package/android/build.gradle +4 -1
  58. package/android/src/main/java/com/reactlibrary/RNEasymerchantsdkModule.java +158 -36
  59. package/android/src/main/java/com/reactlibrary/RNEasymerchantsdkPackage.java +45 -13
  60. package/ios/Classes/EasyMerchantSdk.m +106 -55
  61. package/ios/Classes/EasyMerchantSdk.swift +199 -77
  62. package/ios/Classes/EasyPayViewController.swift +1 -1
  63. package/ios/CustomComponents/DatePickerHandler.swift +15 -4
  64. package/ios/EnvironmentConfig.swift +32 -30
  65. package/ios/Models/Request.swift +176 -14
  66. package/ios/Models/Result.swift +12 -5
  67. package/ios/Pods/ViewControllers/AdditionalInfoVC.swift +855 -366
  68. package/ios/Pods/ViewControllers/BaseVC.swift +51 -36
  69. package/ios/Pods/ViewControllers/BillingInfoVC/BillingInfoVC.swift +1985 -178
  70. package/ios/Pods/ViewControllers/CountryListVC.swift +20 -1
  71. package/ios/Pods/ViewControllers/CustomOverlay.swift +199 -0
  72. package/ios/Pods/ViewControllers/EmailVerificationVC.swift +74 -5
  73. package/ios/Pods/ViewControllers/GrailPayVC.swift +131 -107
  74. package/ios/Pods/ViewControllers/OTPVerificationVC.swift +296 -106
  75. package/ios/Pods/ViewControllers/PaymentDoneVC.swift +35 -26
  76. package/ios/Pods/ViewControllers/PaymentInformation/PaymentInfoVC.swift +1276 -545
  77. package/ios/Pods/ViewControllers/ThreeDSecurePaymentDoneVC.swift +607 -24
  78. package/ios/easymerchantsdk.podspec +1 -1
  79. package/ios/easymerchantsdk.storyboard +1388 -1165
  80. package/package.json +1 -1
@@ -1,9 +1,9 @@
1
- //
2
- // GrailPayVC.swift
3
- // EasyPay
4
- //
5
- // Created by Mony's Mac on 02/05/25.
6
- //
1
+ ////
2
+ //// GrailPayVC.swift
3
+ //// EasyPay
4
+ ////
5
+ //// Created by Mony's Mac on 02/05/25.
6
+ ////
7
7
 
8
8
  import UIKit
9
9
  import WebKit
@@ -15,6 +15,7 @@ public class GrailPayVC: UIViewController {
15
15
  private var request: GrailPayRequest
16
16
 
17
17
  public var onCompletion: ((Result) -> Void)?
18
+ private var didHandleBankConnection = false
18
19
 
19
20
  public init(request: GrailPayRequest) {
20
21
  self.request = request
@@ -25,8 +26,6 @@ public class GrailPayVC: UIViewController {
25
26
  fatalError("init(coder:) has not been implemented")
26
27
  }
27
28
 
28
- private var didHandleBankConnection = false
29
-
30
29
  override public func viewDidLoad() {
31
30
  super.viewDidLoad()
32
31
  setupUI()
@@ -36,12 +35,26 @@ public class GrailPayVC: UIViewController {
36
35
  private func setupUI() {
37
36
  view.backgroundColor = .white
38
37
 
39
- let webConfig = WKWebViewConfiguration()
40
- webConfig.userContentController.add(self, name: "grailpayHandler")
41
- webConfig.allowsInlineMediaPlayback = true
42
- webConfig.mediaTypesRequiringUserActionForPlayback = []
38
+ let config = WKWebViewConfiguration()
39
+
40
+ // Modern iOS 14+ JavaScript enablement
41
+ if #available(iOS 14.0, *) {
42
+ let webpagePreferences = WKWebpagePreferences()
43
+ webpagePreferences.allowsContentJavaScript = true
44
+ config.defaultWebpagePreferences = webpagePreferences
45
+ } else {
46
+ // Fallback for iOS < 14
47
+ let preferences = WKPreferences()
48
+ preferences.javaScriptEnabled = true
49
+ config.preferences = preferences
50
+ }
43
51
 
44
- webView = WKWebView(frame: view.bounds, configuration: webConfig)
52
+ config.websiteDataStore = WKWebsiteDataStore.default()
53
+ config.userContentController.add(self, name: "grailpayHandler")
54
+ config.allowsInlineMediaPlayback = true
55
+ config.mediaTypesRequiringUserActionForPlayback = []
56
+
57
+ webView = WKWebView(frame: view.bounds, configuration: config)
45
58
  webView.navigationDelegate = self
46
59
  webView.uiDelegate = self
47
60
  webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
@@ -56,99 +69,102 @@ public class GrailPayVC: UIViewController {
56
69
  private func loadGrailPaySDK() {
57
70
  loadingIndicator.startAnimating()
58
71
 
59
- WKWebsiteDataStore.default().removeData(ofTypes: [WKWebsiteDataTypeCookies], modifiedSince: Date(timeIntervalSince1970: 0)) { [weak self] in
60
- guard let self = self else { return }
61
-
62
- let sdkURL = self.request.isSandbox ?
63
- "https://bank-link-widget-sandbox.grailpay.com/sdk.js" :
64
- "https://bank-link-widget.grailpay.com/sdk.js"
65
-
66
- let html = """
67
- <!DOCTYPE html>
68
- <html>
69
- <head>
70
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
71
- <script>
72
- window.sdkInitialized = false;
73
-
74
- function initializeSDK() {
75
- if (window.sdkInitialized) return;
76
-
77
- if (typeof window.grailpay === 'undefined') {
78
- window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'error', data: 'SDK not loaded' });
79
- return;
80
- }
81
-
82
- window.grailpay.init({
83
- token: '\(self.request.accessToken)',
84
- vendorId: '\(self.request.vendorId)',
85
- role: '\(self.request.role)',
86
- timeout: \(self.request.timeout),
87
- theme: {
88
- branding_name: '\(self.request.brandingName)',
89
- screens: {
90
- finder: {
91
- subtitle: '\(self.request.finderSubtitle)',
92
- searchPlaceholder: '\(self.request.searchPlaceholder)'
93
- }
72
+ let sdkURL = request.isSandbox
73
+ ? "https://bank-link-widget-sandbox.grailpay.com/sdk.js"
74
+ : "https://bank-link-widget.grailpay.com/sdk.js"
75
+
76
+ let html = """
77
+ <!DOCTYPE html>
78
+ <html>
79
+ <head>
80
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
81
+ <script>
82
+ window.sdkInitialized = false;
83
+
84
+ function initializeSDK() {
85
+ if (window.sdkInitialized) return;
86
+
87
+ if (typeof window.grailpay === 'undefined') {
88
+ window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'error', data: 'SDK not loaded' });
89
+ return;
90
+ }
91
+
92
+ window.grailpay.init({
93
+ token: '\(request.accessToken)',
94
+ vendorId: '\(request.vendorId)',
95
+ role: '\(request.role)',
96
+ timeout: \(request.timeout),
97
+ theme: {
98
+ branding_name: '\(request.brandingName)',
99
+ screens: {
100
+ finder: {
101
+ subtitle: '\(request.finderSubtitle)',
102
+ searchPlaceholder: '\(request.searchPlaceholder)'
94
103
  }
95
- },
96
- onError: function(error) {
97
- console.log("JS onError:", error);
98
- window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'error', data: error });
99
- },
100
- onBankConnected: function(data) {
101
- console.log("✅ Bank connected:", data);
102
- window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'bankConnected', data: data });
103
- },
104
- onLinkExit: function(data) {
105
- console.log("⚠️ User exited:", data);
106
- window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'linkExit', data: data });
107
104
  }
108
- }).then(function() {
109
- window.sdkInitialized = true;
110
- window.grailpay.open();
111
- }).catch(function(error) {
112
- console.log("❌ SDK init failed:", error);
105
+ },
106
+ onError: function(error) {
107
+ console.log("JS onError:", error);
113
108
  window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'error', data: error });
114
- });
115
- }
116
-
117
- function loadSDK() {
118
- const script = document.createElement('script');
119
- script.src = '\(sdkURL)';
120
- script.onload = function() {
121
- setTimeout(initializeSDK, 1000);
122
- };
123
- script.onerror = function(error) {
124
- console.log(" Failed to load SDK script");
125
- window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'error', data: 'Failed to load SDK script' });
126
- };
127
- document.head.appendChild(script);
128
- }
129
-
130
- document.addEventListener('DOMContentLoaded', loadSDK);
131
- </script>
132
- </head>
133
- <body style="margin: 0; padding: 0;"></body>
134
- </html>
135
- """
136
-
137
- let baseURL = URL(string: self.request.isSandbox ? "https://bank-link-widget-sandbox.grailpay.com" : "https://bank-link-widget.grailpay.com")
138
- self.webView.loadHTMLString(html, baseURL: baseURL)
139
- }
109
+ },
110
+ onBankConnected: function(data) {
111
+ console.log("✅ Bank connected:", data);
112
+ window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'bankConnected', data: data });
113
+ },
114
+ onLinkedDefaultAccount: function(data) {
115
+ console.log("Default Account", data);
116
+ window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'defaultAccountSelected', data: data });
117
+ },
118
+ onLinkExit: function(data) {
119
+ console.log("⚠️ User exited:", data);
120
+ window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'linkExit', data: data });
121
+ }
122
+ }).then(function() {
123
+ window.sdkInitialized = true;
124
+ window.grailpay.open();
125
+ }).catch(function(error) {
126
+ console.log("❌ SDK init failed:", error);
127
+ window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'error', data: error });
128
+ });
129
+ }
130
+
131
+ function loadSDK() {
132
+ const script = document.createElement('script');
133
+ script.src = '\(sdkURL)';
134
+ script.onload = function() {
135
+ setTimeout(initializeSDK, 1000);
136
+ };
137
+ script.onerror = function(error) {
138
+ console.log("❌ Failed to load SDK script");
139
+ window.webkit.messageHandlers.grailpayHandler.postMessage({ type: 'error', data: 'Failed to load SDK script' });
140
+ };
141
+ document.head.appendChild(script);
142
+ }
143
+
144
+ document.addEventListener('DOMContentLoaded', loadSDK);
145
+ </script>
146
+ </head>
147
+ <body style="margin:0;padding:0;"></body>
148
+ </html>
149
+ """
150
+
151
+ let baseURL = URL(string: request.isSandbox
152
+ ? "https://bank-link-widget-sandbox.grailpay.com"
153
+ : "https://bank-link-widget.grailpay.com")
154
+
155
+ webView.loadHTMLString(html, baseURL: baseURL)
140
156
  }
141
157
 
142
158
  private func handleError(_ error: Error) {
143
159
  DispatchQueue.main.async {
144
160
  self.loadingIndicator.stopAnimating()
145
- let nsError = error as NSError
146
- self.onCompletion?(Result(error: nsError))
161
+ self.onCompletion?(Result(error: error as NSError))
147
162
  self.dismiss(animated: true)
148
163
  }
149
164
  }
150
165
  }
151
166
 
167
+ // MARK: - WKNavigationDelegate
152
168
  extension GrailPayVC: WKNavigationDelegate {
153
169
  public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
154
170
  loadingIndicator.stopAnimating()
@@ -159,27 +175,34 @@ extension GrailPayVC: WKNavigationDelegate {
159
175
  }
160
176
  }
161
177
 
178
+ // MARK: - WKScriptMessageHandler
162
179
  extension GrailPayVC: WKScriptMessageHandler {
163
180
  public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
164
- print("📩 JS Message received: \(message.body)")
181
+ print("JS Message received: \(message.body)")
165
182
 
166
183
  guard let body = message.body as? [String: Any],
167
184
  let type = body["type"] as? String else {
168
- print("⚠️ Malformed message")
185
+ print("Invalid message structure")
169
186
  return
170
187
  }
171
188
 
172
189
  switch type {
173
190
  case "bankConnected":
174
- guard let dataArray = body["data"] as? [[String: Any]], let firstAccount = dataArray.first else {
175
- print("⚠️ No valid accounts in bankConnected")
191
+ if let data = body["data"] {
192
+ print("All linked account data from GrailPay:", data)
193
+ }
194
+
195
+ case "defaultAccountSelected":
196
+ guard let dataG = body["data"] as? [String: Any] else {
197
+ print("No account data selected")
176
198
  return
177
199
  }
178
200
 
201
+ print("Received defaultAccountSelected: \(dataG)")
202
+
179
203
  if !didHandleBankConnection {
180
- didHandleBankConnection = true // ✅ Prevent duplicate triggers
181
- print("✅ Received bankConnected: \(firstAccount)")
182
-
204
+ didHandleBankConnection = true
205
+ let dataArray: [[String: Any]] = [dataG]
183
206
  DispatchQueue.main.async {
184
207
  self.onCompletion?(Result(type: .success, chargeData: ["data": dataArray]))
185
208
  self.dismiss(animated: true)
@@ -188,30 +211,31 @@ extension GrailPayVC: WKScriptMessageHandler {
188
211
 
189
212
  case "linkExit":
190
213
  if didHandleBankConnection {
191
- print("ℹ️ linkExit ignored because success already handled")
214
+ print("linkExit ignored (already handled)")
192
215
  return
193
216
  }
194
- print("⚠️ Received linkExit")
217
+ print("User exited linking flow")
195
218
  DispatchQueue.main.async {
196
219
  self.onCompletion?(Result(type: .cancelled))
197
220
  self.dismiss(animated: true)
198
221
  }
199
222
 
200
223
  case "error":
201
- let errorMessage = (body["data"] as? String) ?? "Unknown error"
224
+ let errorMessage = body["data"] as? String ?? "Unknown error"
225
+ print("GrailPay Error:", errorMessage)
202
226
  let error = NSError(domain: "GrailPayError", code: 0, userInfo: [NSLocalizedDescriptionKey: errorMessage])
203
- print("❌ GrailPay JS error: \(errorMessage)")
204
227
  handleError(error)
205
228
 
206
229
  default:
207
- print("ℹ️ Unknown JS message type: \(type)")
230
+ print("Unknown JS message type:", type)
208
231
  }
209
232
  }
210
233
  }
211
234
 
212
-
235
+ // MARK: - WKUIDelegate
213
236
  extension GrailPayVC: WKUIDelegate {
214
- public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
237
+ public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration,
238
+ for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
215
239
  if navigationAction.targetFrame == nil {
216
240
  webView.load(navigationAction.request)
217
241
  }