@jimrising/easymerchantsdk-react-native 2.2.8 → 2.3.0

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 (102) hide show
  1. package/.idea/caches/deviceStreaming.xml +11 -0
  2. package/README.md +305 -167
  3. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule$2.dex +0 -0
  4. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule$3.dex +0 -0
  5. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule.dex +0 -0
  6. package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  7. package/android/build/.transforms/3f3a228346492fb34e3f574e941b632f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/reactlibrary/RNEasymerchantsdkModule$2.dex +0 -0
  8. package/android/build/.transforms/3f3a228346492fb34e3f574e941b632f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/reactlibrary/RNEasymerchantsdkModule$3.dex +0 -0
  9. package/android/build/.transforms/3f3a228346492fb34e3f574e941b632f/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/reactlibrary/RNEasymerchantsdkModule.dex +0 -0
  10. package/android/build/.transforms/3f3a228346492fb34e3f574e941b632f/transformed/bundleLibRuntimeToDirRelease/desugar_graph.bin +0 -0
  11. package/android/build/.transforms/58b147bdc43284da2468dab19bc4a64d/transformed/classes/classes_dex/classes.dex +0 -0
  12. package/android/build/.transforms/e9a664a11ce12edf79cd87b1e07aa243/transformed/classes/classes_dex/classes.dex +0 -0
  13. package/android/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar +0 -0
  14. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  15. package/android/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar +0 -0
  16. package/android/build/intermediates/full_jar/release/createFullJarRelease/full.jar +0 -0
  17. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -1
  18. package/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release-artifact-dependencies.xml +4 -4
  19. package/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release-artifact-libraries.xml +4 -4
  20. package/android/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties +916 -916
  21. package/android/build/intermediates/incremental/release/mergeReleaseResources/merger.xml +3 -3
  22. package/android/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties +1 -1
  23. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$2.class +0 -0
  24. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$3.class +0 -0
  25. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule.class +0 -0
  26. package/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$2.class +0 -0
  27. package/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$3.class +0 -0
  28. package/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule.class +0 -0
  29. package/android/build/intermediates/lint-cache/lintVitalAnalyzeRelease/maven.google/com/android/tools/build/group-index.xml +22 -0
  30. package/android/build/intermediates/lint_model/release/generateReleaseLintModel/release-artifact-dependencies.xml +4 -4
  31. package/android/build/intermediates/lint_model/release/generateReleaseLintModel/release-artifact-libraries.xml +4 -4
  32. package/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release-artifact-dependencies.xml +4 -4
  33. package/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release-artifact-libraries.xml +4 -4
  34. package/android/build/intermediates/local_aar_for_lint/release/out.aar +0 -0
  35. package/android/build/intermediates/merged_res/release/mergeReleaseResources/layout/activity_payment_done_url.xml +2 -1
  36. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values-night-v8.json +2 -2
  37. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/multi-v2/values.json +38 -38
  38. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/anim-v21.json +9 -9
  39. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/anim.json +24 -24
  40. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/animator-v21.json +1 -1
  41. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/animator.json +34 -34
  42. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/color-night-v8.json +3 -3
  43. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/color-v31.json +10 -10
  44. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/color.json +153 -153
  45. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable-anydpi-v21.json +6 -6
  46. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable-hdpi-v4.json +13 -13
  47. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable-ldpi-v4.json +6 -6
  48. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable-mdpi-v4.json +12 -12
  49. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable-v21.json +4 -4
  50. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable-v23.json +7 -7
  51. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable-v29.json +1 -1
  52. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable-xhdpi-v4.json +12 -12
  53. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable-xxhdpi-v4.json +7 -7
  54. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable-xxxhdpi-v4.json +7 -7
  55. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/drawable.json +395 -395
  56. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/font.json +9 -9
  57. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/interpolator-v21.json +10 -10
  58. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/interpolator.json +11 -11
  59. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-land.json +3 -3
  60. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-sw600dp-v13.json +2 -2
  61. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-v21.json +4 -4
  62. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout-v26.json +1 -1
  63. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/layout.json +108 -108
  64. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/mipmap-anydpi-v26.json +2 -2
  65. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/mipmap-hdpi-v4.json +2 -2
  66. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/mipmap-mdpi-v4.json +2 -2
  67. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/mipmap-xhdpi-v4.json +2 -2
  68. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/mipmap-xxhdpi-v4.json +2 -2
  69. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/mipmap-xxxhdpi-v4.json +2 -2
  70. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/raw.json +46 -46
  71. package/android/build/intermediates/merged_res_blame_folder/release/mergeReleaseResources/out/single/xml.json +3 -3
  72. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkModule$2.class +0 -0
  73. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkModule$3.class +0 -0
  74. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkModule.class +0 -0
  75. package/android/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/reactlibrary/RNEasymerchantsdkModule$2.class +0 -0
  76. package/android/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/reactlibrary/RNEasymerchantsdkModule$3.class +0 -0
  77. package/android/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/reactlibrary/RNEasymerchantsdkModule.class +0 -0
  78. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  79. package/android/build/intermediates/runtime_library_classes_jar/release/bundleLibRuntimeToJarRelease/classes.jar +0 -0
  80. package/android/build/intermediates/source_set_path_map/release/mapReleaseSourceSetPaths/file-map.txt +38 -38
  81. package/android/build/intermediates/verified_library_resources/release/verifyReleaseResources/compiled/layout_activity_payment_done_url.xml.flat +0 -0
  82. package/android/build/outputs/aar/jimrising_easymerchantsdk-react-native-release.aar +0 -0
  83. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  84. package/android/build/tmp/compileReleaseJavaWithJavac/previous-compilation-data.bin +0 -0
  85. package/android/build.gradle +1 -1
  86. package/android/src/main/java/com/reactlibrary/RNEasymerchantsdkModule.java +56 -1
  87. package/ios/Classes/EasyMerchantSdk.m +124 -141
  88. package/ios/Classes/EasyMerchantSdk.swift +270 -502
  89. package/ios/Classes/EasyPayViewController.swift +18 -15
  90. package/ios/CustomComponents/TextFieldStackView.swift +16 -46
  91. package/ios/EnvironmentConfig.swift +16 -0
  92. package/ios/Example/ViewController.swift +513 -76
  93. package/ios/Models/Request.swift +365 -171
  94. package/ios/Pods/UserDefaults/UserStoreSingleton.swift +116 -12
  95. package/ios/Pods/ViewControllers/AdditionalInfoVC.swift +2 -32
  96. package/ios/Pods/ViewControllers/GrailPayVC.swift +258 -18
  97. package/ios/Pods/ViewControllers/OTPVerificationVC.swift +1 -66
  98. package/ios/Pods/ViewControllers/PaymentInformation/PaymentInfoVC.swift +585 -381
  99. package/ios/Pods/ViewControllers/ThreeDSecurePaymentDoneVC.swift +18 -9
  100. package/ios/easymerchantsdk.podspec +1 -1
  101. package/ios/easymerchantsdk.storyboard +108 -85
  102. package/package.json +1 -1
@@ -3,6 +3,7 @@
3
3
  // EasyPay
4
4
  //
5
5
  // Created by Mony's Mac on 06/09/24.
6
+ //
6
7
 
7
8
  import UIKit
8
9
 
@@ -81,6 +82,7 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
81
82
  @IBOutlet weak var imgViewCalenderIconCard: UIImageView!
82
83
  @IBOutlet weak var txtFieldEmailCardView: TextFieldStackView!
83
84
  @IBOutlet weak var viewTxtFieldEmailCardView: UIView!
85
+ @IBOutlet weak var btnChosePlanCardView: UIButton!
84
86
 
85
87
  @IBOutlet weak var btnScanCard: UIButton!
86
88
 
@@ -89,6 +91,7 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
89
91
  @IBOutlet weak var btnNextEmailView: FilledButton!
90
92
  @IBOutlet weak var viewTxtFieldEmail: UIView!
91
93
  @IBOutlet weak var OTPView: UIView!
94
+ @IBOutlet weak var btnSelectRecurringDateCardView: UIButton!
92
95
 
93
96
  //OTP View
94
97
  @IBOutlet weak var viewTextOTP1: UIView!
@@ -133,6 +136,11 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
133
136
  @IBOutlet weak var txtFieldSelectPlanSingleSavedCard: TextFieldStackView!
134
137
  @IBOutlet weak var txtFieldSelectDateSingleSavedCard: TextFieldStackView!
135
138
 
139
+ @IBOutlet weak var DropDownIconSingleSavedCard: UIImageView!
140
+ @IBOutlet weak var btnChosePlanSingleSavedCard: UIButton!
141
+
142
+ @IBOutlet weak var btnSelectRecurringDateSingleSavedCard: UIButton!
143
+
136
144
  //Update Card
137
145
  @IBOutlet weak var btnSelectUpdateCardView: UIButton!
138
146
  @IBOutlet weak var imgViewCardUpdateCardView: UIImageView!
@@ -166,6 +174,10 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
166
174
  @IBOutlet weak var txtFieldSelectDateNewCardView: TextFieldStackView!
167
175
  @IBOutlet weak var heightViewNewCardFields: NSLayoutConstraint!
168
176
 
177
+ @IBOutlet weak var btnSelectRecurringDateNewCardView: UIButton!
178
+ @IBOutlet weak var btnSelectPlanNewCardView: UIButton!
179
+ @IBOutlet weak var dropDownIconNewCardView: UIImageView!
180
+
169
181
  //Bank
170
182
  @IBOutlet weak var viewBankFields: UIView!
171
183
  @IBOutlet weak var txtFieldAccountName: UITextField!
@@ -189,9 +201,14 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
189
201
  @IBOutlet weak var txtFieldEmailAccountView: TextFieldStackView!
190
202
  @IBOutlet weak var viewTxtFieldEmailAccountView: UIView!
191
203
 
204
+ @IBOutlet weak var dropDownIconViewBankFields: UIImageView!
205
+ @IBOutlet weak var btnSelectPlanViewBankFields: UIButton!
206
+
192
207
  @IBOutlet weak var viewSaveCardForFutureCardView: UIStackView!
193
208
  @IBOutlet weak var heightViewBankFields: NSLayoutConstraint!
194
209
 
210
+ @IBOutlet weak var btnSelectRecurringDateViewBankFields: UIButton!
211
+
195
212
  //GrailPay
196
213
  @IBOutlet weak var grailPayBankLinkView: UIView!
197
214
  @IBOutlet weak var viewGrailPaySavedBank: UIStackView!
@@ -216,6 +233,10 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
216
233
  @IBOutlet weak var txtFieldEmailGrailPayView: TextFieldStackView!
217
234
  @IBOutlet weak var viewTxtFieldEmailGrailPayView: UIView!
218
235
 
236
+ @IBOutlet weak var btnSelectPlanGrailPayBankView: UIButton!
237
+ @IBOutlet weak var dropDownIconGrailPayBankView: UIImageView!
238
+ @IBOutlet weak var btnSelectRecurringDateGrailPayView: UIButton!
239
+
219
240
  //New GrailPay Account
220
241
  @IBOutlet weak var viewAddNewGrailPayAccount: UIView!
221
242
  @IBOutlet weak var lblGrailPayNewAccount: UILabel!
@@ -241,6 +262,11 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
241
262
  @IBOutlet weak var imgViewBankIconGrailPayNewBank: UIImageView!
242
263
  @IBOutlet weak var viewSaveAccountForFututeNewGrailPayAccountView: UIStackView!
243
264
 
265
+ @IBOutlet weak var btnSelectPlanNewGrailPayBankView: UIButton!
266
+ @IBOutlet weak var dropDownIconNewGrailPayBankView: UIImageView!
267
+ @IBOutlet weak var btnSelectRecurringDateNewGrailPayView: UIButton!
268
+
269
+
244
270
  //SavedBank
245
271
  @IBOutlet weak var viewSingleSavedAccount: UIView!
246
272
  @IBOutlet weak var viewTermAndConditionsSingleAccountView: UIStackView!
@@ -260,6 +286,11 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
260
286
  @IBOutlet weak var txtFieldSelectPlanSingleSavedBankView: TextFieldStackView!
261
287
  @IBOutlet weak var txtFieldSelectDateSingleSavedBankView: TextFieldStackView!
262
288
 
289
+ @IBOutlet weak var dropDownIconSingleSavedBankView: UIImageView!
290
+ @IBOutlet weak var btnSelectPlanSingleSavedBankView: UIButton!
291
+
292
+ @IBOutlet weak var btnSelectRecurringDateSavedBankView: UIButton!
293
+
263
294
  //New Bank
264
295
  @IBOutlet weak var viewNewBankAccount: UIView!
265
296
  @IBOutlet weak var txtFieldAccountNameNewAccountView: UITextField!
@@ -288,6 +319,10 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
288
319
  @IBOutlet weak var lblAgreeToTheNewAccountView: UILabel!
289
320
  @IBOutlet weak var lblTermsAndConditionsNewAccountView: UILabel!
290
321
 
322
+ @IBOutlet weak var dropDownIconNewBankAccountView: UIImageView!
323
+ @IBOutlet weak var btnSelectPlanNewBankAccountView: UIButton!
324
+ @IBOutlet weak var btnSelectRecurringDateNewBankView: UIButton!
325
+
291
326
  //Crypto
292
327
  @IBOutlet weak var viewCrypto: UIView!
293
328
  @IBOutlet weak var viewCryptoTryAgain: UIView!
@@ -412,29 +447,190 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
412
447
 
413
448
  private var isErrorScreenPresented = false
414
449
 
450
+ // Add a loader property
451
+ private let loadingIndicator: UIActivityIndicatorView = {
452
+ let indicator = UIActivityIndicatorView(style: .large)
453
+ indicator.translatesAutoresizingMaskIntoConstraints = false
454
+ indicator.hidesWhenStopped = true
455
+ indicator.color = .white // Adjust based on theme if needed
456
+ return indicator
457
+ }()
458
+
415
459
  //MARK: - View Did Load
416
460
  override func viewDidLoad() {
417
461
  super.viewDidLoad()
418
- logOut()
419
462
 
420
- // Then: safely start new API call
421
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
422
- self.request?.paymentIntentApi { success in
423
- if success {
424
- print("Payment Intent completed")
463
+ // Add and center the loader
464
+ view.addSubview(loadingIndicator)
465
+ NSLayoutConstraint.activate([
466
+ loadingIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor),
467
+ loadingIndicator.centerYAnchor.constraint(equalTo: view.centerYAnchor)
468
+ ])
469
+
470
+ // Start loader
471
+ loadingIndicator.startAnimating()
472
+
473
+ // Avoid clearing persisted Hosted Checkout values on first open
474
+ // logOut()
475
+
476
+ // /// Check if paymentIntent and clientToken are available
477
+ // DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
478
+ // if let clientToken = self.request.clientToken,
479
+ // !clientToken.isEmpty {
480
+ //
481
+ // // Save clientToken in singleton
482
+ // UserStoreSingleton.shared.clientToken = clientToken
483
+ // print("Saved clientToken in UserStoreSingleton: \(clientToken)")
484
+ //
485
+ // // Case 1: Already exist → Directly call hostedCheckout
486
+ // print("Skipping paymentIntentApi, using existing values")
487
+ // self.request.hostedCheckoutsApi { success in
488
+ // DispatchQueue.main.async {
489
+ // if success {
490
+ // self.setupUI()
491
+ // } else {
492
+ // print("Hosted Checkout failed. Blocking SDK UI.")
493
+ //
494
+ // // Stop flow and notify failure
495
+ // let result = SDKResult(
496
+ // type: .error,
497
+ // chargeData: ["status": false, "message": "Hosted Checkout failed"],
498
+ // billingInfo: nil,
499
+ // additionalInfo: nil
500
+ // )
501
+ // NotificationCenter.default.post(name: NSNotification.Name("EasyPayResult"), object: result)
502
+ // self.dismiss(animated: true)
503
+ // }
504
+ // }
505
+ // }
506
+ // }
507
+ // else {
508
+ // // Case 2: No values → Call paymentIntentApi first
509
+ // print("Calling paymentIntentApi")
510
+ // self.request.paymentIntentApi { success in
511
+ // DispatchQueue.main.async {
512
+ // if success {
513
+ // print("Payment Intent completed")
514
+ // self.setupUI()
515
+ // } else {
516
+ // print("Payment Intent failed. Blocking SDK UI.")
517
+ //
518
+ // // Stop flow and notify failure
519
+ // let result = SDKResult(
520
+ // type: .error,
521
+ // chargeData: ["status": false, "message": "Payment Intent failed"],
522
+ // billingInfo: nil,
523
+ // additionalInfo: nil
524
+ // )
525
+ // NotificationCenter.default.post(name: NSNotification.Name("EasyPayResult"), object: result)
526
+ // self.dismiss(animated: true)
527
+ // }
528
+ // }
529
+ // }
530
+ // }
531
+ // }
532
+
533
+
534
+ // Re-save theme and client token after logOut to preserve them
535
+ if let themeConfiguration = request.appearanceSettings {
536
+ UserStoreSingleton.shared.updateThemeConfiguration(with: themeConfiguration)
537
+ }
538
+ if let clientToken = request.clientToken {
539
+ UserStoreSingleton.shared.clientToken = clientToken
540
+ }
541
+
542
+ // Perform API call
543
+ DispatchQueue.main.async {
544
+ if let clientToken = self.request.clientToken, !clientToken.isEmpty {
545
+ // Case 1: Client token exists → Call hostedCheckoutsApi
546
+ print("Calling hostedCheckoutsApi")
547
+ self.request.hostedCheckoutsApi { success in
425
548
  DispatchQueue.main.async {
426
- self.lblEasyMerchantOne.text = "POWERED BY \(UserStoreSingleton.shared.companyName?.uppercased() ?? "")"
549
+ // Stop loader
550
+ self.loadingIndicator.stopAnimating()
551
+
552
+ if success {
553
+ print("Hosted Checkout completed")
554
+ // Hydrate fresh values saved by hostedCheckoutsApi before building UI
555
+ if let savedAmount = UserStoreSingleton.shared.amount,
556
+ let parsedAmount = Double(savedAmount) {
557
+ self.amount = parsedAmount
558
+ self.request.amount = parsedAmount
559
+ }
560
+ // Hydrate recurring and payment method data saved by Hosted Checkout
561
+ if let savedIsRecurring = UserStoreSingleton.shared.isRecurring,
562
+ savedIsRecurring == "1" {
563
+ self.request.is_recurring = true
564
+ if let cycles = UserStoreSingleton.shared.allowCycles,
565
+ let num = Int(cycles) {
566
+ self.request.numOfCycle = num
567
+ }
568
+ if let intervals = UserStoreSingleton.shared.interval {
569
+ let parts = intervals
570
+ .split(separator: ",")
571
+ .map { String($0).trimmingCharacters(in: .whitespaces) }
572
+ self.request.recurringIntervals = parts.compactMap { RecurringIntervals(rawValue: $0) }
573
+ }
574
+ if let startType = UserStoreSingleton.shared.startDateType {
575
+ self.request.recurringStartDateType = RecurringStartDateType(rawValue: startType)
576
+ }
577
+ if let startDate = UserStoreSingleton.shared.startDate {
578
+ self.request.recurringStartDate = startDate
579
+ }
580
+ } else {
581
+ self.request.is_recurring = false
582
+ self.request.numOfCycle = nil
583
+ self.request.recurringIntervals = nil
584
+ self.request.recurringStartDateType = nil
585
+ self.request.recurringStartDate = nil
586
+ }
587
+ // Hydrate selectable payment methods
588
+ if let savedMethods = UserStoreSingleton.shared.paymentMethods {
589
+ self.request.selectedPaymentMethods = savedMethods.compactMap { PaymentMethod(rawValue: $0) }
590
+ }
591
+ self.setupUI()
592
+ } else {
593
+ print("Hosted Checkout failed. Blocking SDK UI.")
594
+ // Notify failure
595
+ let result = SDKResult(
596
+ type: .error,
597
+ chargeData: ["status": false, "message": "Hosted Checkout failed"],
598
+ billingInfo: nil,
599
+ additionalInfo: nil
600
+ )
601
+ NotificationCenter.default.post(name: NSNotification.Name("EasyPayResult"), object: result)
602
+ self.dismiss(animated: true)
603
+ }
604
+ }
605
+ }
606
+ } else {
607
+ // Case 2: No client token → Call paymentIntentApi
608
+ print("Calling paymentIntentApi")
609
+ self.request.paymentIntentApi { success in
610
+ DispatchQueue.main.async {
611
+ // Stop loader
612
+ self.loadingIndicator.stopAnimating()
613
+
614
+ if success {
615
+ print("Payment Intent completed")
616
+ self.setupUI()
617
+ } else {
618
+ print("Payment Intent failed. Blocking SDK UI.")
619
+ // Notify failure
620
+ let result = SDKResult(
621
+ type: .error,
622
+ chargeData: ["status": false, "message": "Payment Intent failed"],
623
+ billingInfo: nil,
624
+ additionalInfo: nil
625
+ )
626
+ NotificationCenter.default.post(name: NSNotification.Name("EasyPayResult"), object: result)
627
+ self.dismiss(animated: true)
628
+ }
427
629
  }
428
- // Continue flow
429
- } else {
430
- print("Payment Intent failed")
431
- // Handle failure
432
630
  }
433
631
  }
434
632
  }
435
633
 
436
- // request.printAsJSON()
437
-
438
634
  viewAppearanceOn()
439
635
 
440
636
  uiFinishingTouchElements()
@@ -616,6 +812,23 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
616
812
 
617
813
  }
618
814
 
815
+ private func setupUI() {
816
+ // Update merchant label
817
+ lblEasyMerchantOne.text = "POWERED BY \(UserStoreSingleton.shared.companyName?.uppercased() ?? "")"
818
+
819
+ // Apply visibility and layout settings
820
+ viewAppearanceOn()
821
+
822
+ // Apply theme settings
823
+ uiFinishingTouchElements()
824
+
825
+ // Force layout update
826
+ DispatchQueue.main.async {
827
+ self.view.setNeedsLayout()
828
+ self.view.layoutIfNeeded()
829
+ }
830
+ }
831
+
619
832
  //MARK: - View Wiil Appear
620
833
  override func viewWillAppear(_ animated: Bool) {
621
834
  uiFinishingTouchElements()
@@ -649,59 +862,270 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
649
862
  self.viewCrypto.isHidden = true
650
863
 
651
864
  if request.is_recurring == true {
652
- self.txtFieldChosePlanCard.isHidden = false
653
- if request.recurringStartDateType == .custom {
654
- self.txtFieldStartDateCard.isHidden = false
655
- self.txtFieldSelectDateSingleSavedCard.isHidden = false
656
- self.txtFieldSelectDateNewCardView.isHidden = false
657
- self.txtFieldSelectDateViewBankFields.isHidden = false
658
- self.txtFieldSelectDateSingleSavedBankView.isHidden = false
659
- self.txtFieldSelectDateNewAccountView.isHidden = false
660
- self.txtFieldSelectDateGrailPayBankView.isHidden = false
661
- self.txtFieldSelectDateNewGrailPayBankView.isHidden = false
662
-
663
- if request.saveAccount == false {
664
- self.heightViewBankFields.constant = 800
665
- self.heightViewNewAccountFields.constant = 850
666
- } else {
667
- self.heightViewBankFields.constant = 846
668
- self.heightViewNewAccountFields.constant = 900
669
- }
670
-
671
- if request.saveCard == false {
672
- self.heightViewNewCardFields.constant = 606
673
- } else {
674
- self.heightViewNewCardFields.constant = 658
675
- }
676
-
677
- self.heightSubViewNewAccountFields.constant = 870
678
- } else {
679
- self.txtFieldStartDateCard.isHidden = true
680
- self.txtFieldSelectDateSingleSavedCard.isHidden = true
681
- self.txtFieldSelectDateNewCardView.isHidden = true
682
- self.txtFieldSelectDateViewBankFields.isHidden = true
683
- self.txtFieldSelectDateSingleSavedBankView.isHidden = true
684
- self.txtFieldSelectDateNewAccountView.isHidden = true
685
- self.txtFieldSelectDateGrailPayBankView.isHidden = true
686
- self.txtFieldSelectDateNewGrailPayBankView.isHidden = true
687
-
688
- if request.saveAccount == false {
689
- self.heightViewBankFields.constant = 710
690
- self.heightViewNewAccountFields.constant = 752
691
- } else {
692
- self.heightViewBankFields.constant = 750
693
- self.heightViewNewAccountFields.constant = 806
694
- }
695
-
696
- if request.saveCard == false {
697
- self.heightViewNewCardFields.constant = 600
698
- } else {
699
- self.heightViewNewCardFields.constant = 563
700
- }
701
-
702
- self.heightSubViewNewAccountFields.constant = 755
703
- }
704
865
 
866
+ // Check if there is only one recurring interval
867
+ if let intervals = request.recurringIntervals, intervals.count == 1, let singleInterval = intervals.first {
868
+ // Set the text field to the single interval's display name
869
+ self.txtFieldChosePlanCard.text = singleInterval.displayName
870
+ self.txtFieldChosePlanCard.isUserInteractionEnabled = false
871
+ self.txtFieldChosePlanCard.isEnabled = false
872
+ self.btnChosePlanCardView.isEnabled = false
873
+ self.imgViewChosePlanCardDropIcon.isHidden = true
874
+
875
+ self.txtFieldSelectPlanSingleSavedCard.text = singleInterval.displayName
876
+ self.txtFieldSelectPlanSingleSavedCard.isUserInteractionEnabled = false
877
+ self.txtFieldSelectPlanSingleSavedCard.isEnabled = false
878
+ self.btnChosePlanSingleSavedCard.isEnabled = false
879
+ self.DropDownIconSingleSavedCard.isHidden = true
880
+
881
+ self.txtFieldSelectPlanNewCardView.text = singleInterval.displayName
882
+ self.txtFieldSelectPlanNewCardView.isUserInteractionEnabled = false
883
+ self.txtFieldSelectPlanNewCardView.isEnabled = false
884
+ self.btnSelectPlanNewCardView.isEnabled = false
885
+ self.dropDownIconNewCardView.isHidden = true
886
+
887
+ self.txtFieldSelectPlanViewBankFields.text = singleInterval.displayName
888
+ self.txtFieldSelectPlanViewBankFields.isUserInteractionEnabled = false
889
+ self.txtFieldSelectPlanViewBankFields.isEnabled = false
890
+ self.btnSelectPlanViewBankFields.isEnabled = false
891
+ self.dropDownIconViewBankFields.isHidden = true
892
+
893
+ self.txtFieldChosePlanGrailPayBankView.text = singleInterval.displayName
894
+ self.txtFieldChosePlanGrailPayBankView.isUserInteractionEnabled = false
895
+ self.txtFieldChosePlanGrailPayBankView.isEnabled = false
896
+ self.btnSelectPlanGrailPayBankView.isEnabled = false
897
+ self.dropDownIconGrailPayBankView.isHidden = true
898
+
899
+ self.txtFieldChosePlanNewGrailPayBankView.text = singleInterval.displayName
900
+ self.txtFieldChosePlanNewGrailPayBankView.isUserInteractionEnabled = false
901
+ self.txtFieldChosePlanNewGrailPayBankView.isEnabled = false
902
+ self.btnSelectPlanNewGrailPayBankView.isEnabled = false
903
+ self.dropDownIconNewGrailPayBankView.isHidden = true
904
+
905
+ self.txtFieldSelectPlanSingleSavedBankView.text = singleInterval.displayName
906
+ self.txtFieldSelectPlanSingleSavedBankView.isUserInteractionEnabled = false
907
+ self.txtFieldSelectPlanSingleSavedBankView.isEnabled = false
908
+ self.btnSelectPlanSingleSavedBankView.isEnabled = false
909
+ self.dropDownIconSingleSavedBankView.isHidden = true
910
+
911
+ self.txtFieldSelectPlanNewAccountView.text = singleInterval.displayName
912
+ self.txtFieldSelectPlanNewAccountView.isUserInteractionEnabled = false
913
+ self.txtFieldSelectPlanNewAccountView.isEnabled = false
914
+ self.btnSelectPlanNewBankAccountView.isEnabled = false
915
+ self.dropDownIconNewBankAccountView.isHidden = true
916
+ } else {
917
+ // For multiple intervals, keep the button enabled and text field editable
918
+ self.btnChosePlanCardView.isEnabled = true
919
+ self.txtFieldChosePlanCard.isUserInteractionEnabled = true
920
+ self.txtFieldChosePlanCard.isEnabled = true
921
+ self.txtFieldChosePlanCard.text = ""
922
+ self.imgViewChosePlanCardDropIcon.isHidden = false
923
+
924
+ self.btnChosePlanSingleSavedCard.isEnabled = true
925
+ self.txtFieldSelectPlanSingleSavedCard.isUserInteractionEnabled = true
926
+ self.txtFieldSelectPlanSingleSavedCard.isEnabled = true
927
+ self.txtFieldSelectPlanSingleSavedCard.text = ""
928
+ self.DropDownIconSingleSavedCard.isHidden = false
929
+
930
+ self.btnSelectPlanNewCardView.isEnabled = true
931
+ self.txtFieldSelectPlanNewCardView.isUserInteractionEnabled = true
932
+ self.txtFieldSelectPlanNewCardView.isEnabled = true
933
+ self.txtFieldSelectPlanNewCardView.text = ""
934
+ self.dropDownIconNewCardView.isHidden = false
935
+
936
+ self.btnSelectPlanViewBankFields.isEnabled = true
937
+ self.txtFieldSelectPlanViewBankFields.isUserInteractionEnabled = true
938
+ self.txtFieldSelectPlanViewBankFields.isEnabled = true
939
+ self.txtFieldSelectPlanViewBankFields.text = ""
940
+ self.dropDownIconViewBankFields.isHidden = false
941
+
942
+ self.btnSelectPlanGrailPayBankView.isEnabled = true
943
+ self.txtFieldChosePlanGrailPayBankView.isUserInteractionEnabled = true
944
+ self.txtFieldChosePlanGrailPayBankView.isEnabled = true
945
+ self.txtFieldChosePlanGrailPayBankView.text = ""
946
+ self.dropDownIconGrailPayBankView.isHidden = false
947
+
948
+ self.btnSelectPlanNewGrailPayBankView.isEnabled = true
949
+ self.txtFieldChosePlanNewGrailPayBankView.isUserInteractionEnabled = true
950
+ self.txtFieldChosePlanNewGrailPayBankView.isEnabled = true
951
+ self.txtFieldChosePlanNewGrailPayBankView.text = ""
952
+ self.dropDownIconNewGrailPayBankView.isHidden = false
953
+
954
+ self.btnSelectPlanSingleSavedBankView.isEnabled = true
955
+ self.txtFieldSelectPlanSingleSavedBankView.isUserInteractionEnabled = true
956
+ self.txtFieldSelectPlanSingleSavedBankView.isEnabled = true
957
+ self.txtFieldSelectPlanSingleSavedBankView.text = ""
958
+ self.dropDownIconSingleSavedBankView.isHidden = false
959
+
960
+ self.btnSelectPlanNewBankAccountView.isEnabled = true
961
+ self.txtFieldSelectPlanNewAccountView.isUserInteractionEnabled = true
962
+ self.txtFieldSelectPlanNewAccountView.isEnabled = true
963
+ self.txtFieldSelectPlanNewAccountView.text = ""
964
+ self.dropDownIconNewBankAccountView.isHidden = false
965
+ }
966
+
967
+ // Set the start date for txtFieldStartDateCard
968
+ if let startDate = UserStoreSingleton.shared.startDate {
969
+ let dateFormatter = DateFormatter()
970
+ dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" // input format
971
+ if let date = dateFormatter.date(from: startDate) {
972
+ dateFormatter.dateFormat = "dd/MM/yyyy" // output format
973
+ self.txtFieldStartDateCard.text = dateFormatter.string(from: date)
974
+ self.txtFieldSelectDateSingleSavedCard.text = dateFormatter.string(from: date)
975
+ self.txtFieldSelectDateNewCardView.text = dateFormatter.string(from: date)
976
+ self.txtFieldSelectDateViewBankFields.text = dateFormatter.string(from: date)
977
+ self.txtFieldSelectDateSingleSavedBankView.text = dateFormatter.string(from: date)
978
+ self.txtFieldSelectDateNewAccountView.text = dateFormatter.string(from: date)
979
+ self.txtFieldSelectDateGrailPayBankView.text = dateFormatter.string(from: date)
980
+ self.txtFieldSelectDateNewGrailPayBankView.text = dateFormatter.string(from: date)
981
+ }
982
+ }
983
+
984
+ if request.recurringStartDateType == .fixed {
985
+ self.btnSelectRecurringDateCardView.isEnabled = false
986
+ self.txtFieldStartDateCard.isUserInteractionEnabled = false
987
+ self.txtFieldStartDateCard.isEnabled = false
988
+
989
+ self.btnSelectRecurringDateSingleSavedCard.isEnabled = false
990
+ self.txtFieldSelectDateSingleSavedCard.isUserInteractionEnabled = false
991
+ self.txtFieldSelectDateSingleSavedCard.isEnabled = false
992
+
993
+ self.btnSelectRecurringDateNewCardView.isEnabled = false
994
+ self.txtFieldSelectDateNewCardView.isUserInteractionEnabled = false
995
+ self.txtFieldSelectDateNewCardView.isEnabled = false
996
+
997
+ self.btnSelectRecurringDateViewBankFields.isEnabled = false
998
+ self.txtFieldSelectDateViewBankFields.isUserInteractionEnabled = false
999
+ self.txtFieldSelectDateViewBankFields.isEnabled = false
1000
+
1001
+ self.btnSelectRecurringDateGrailPayView.isEnabled = false
1002
+ self.txtFieldSelectDateGrailPayBankView.isUserInteractionEnabled = false
1003
+ self.txtFieldSelectDateGrailPayBankView.isEnabled = false
1004
+
1005
+ self.btnSelectRecurringDateNewGrailPayView.isEnabled = false
1006
+ self.txtFieldSelectDateNewGrailPayBankView.isUserInteractionEnabled = false
1007
+ self.txtFieldSelectDateNewGrailPayBankView.isEnabled = false
1008
+
1009
+ self.btnSelectRecurringDateSavedBankView.isEnabled = false
1010
+ self.txtFieldSelectDateSingleSavedBankView.isUserInteractionEnabled = false
1011
+ self.txtFieldSelectDateSingleSavedBankView.isEnabled = false
1012
+
1013
+ self.btnSelectRecurringDateNewBankView.isEnabled = false
1014
+ self.txtFieldSelectDateNewAccountView.isUserInteractionEnabled = false
1015
+ self.txtFieldSelectDateNewAccountView.isEnabled = false
1016
+ }
1017
+ else {
1018
+ self.btnSelectRecurringDateCardView.isEnabled = true
1019
+ self.txtFieldStartDateCard.isUserInteractionEnabled = true
1020
+ self.txtFieldStartDateCard.isEnabled = true
1021
+
1022
+ self.btnSelectRecurringDateSingleSavedCard.isEnabled = true
1023
+ self.txtFieldSelectDateSingleSavedCard.isUserInteractionEnabled = true
1024
+ self.txtFieldSelectDateSingleSavedCard.isEnabled = true
1025
+
1026
+ self.btnSelectRecurringDateNewCardView.isEnabled = true
1027
+ self.txtFieldSelectDateNewCardView.isUserInteractionEnabled = true
1028
+ self.txtFieldSelectDateNewCardView.isEnabled = true
1029
+
1030
+ self.btnSelectRecurringDateViewBankFields.isEnabled = true
1031
+ self.txtFieldSelectDateViewBankFields.isUserInteractionEnabled = true
1032
+ self.txtFieldSelectDateViewBankFields.isEnabled = true
1033
+
1034
+ self.btnSelectRecurringDateGrailPayView.isEnabled = true
1035
+ self.txtFieldSelectDateGrailPayBankView.isUserInteractionEnabled = true
1036
+ self.txtFieldSelectDateGrailPayBankView.isEnabled = true
1037
+
1038
+ self.btnSelectRecurringDateNewGrailPayView.isEnabled = true
1039
+ self.txtFieldSelectDateNewGrailPayBankView.isUserInteractionEnabled = true
1040
+ self.txtFieldSelectDateNewGrailPayBankView.isEnabled = true
1041
+
1042
+ self.btnSelectRecurringDateSavedBankView.isEnabled = true
1043
+ self.txtFieldSelectDateSingleSavedBankView.isUserInteractionEnabled = true
1044
+ self.txtFieldSelectDateSingleSavedBankView.isEnabled = true
1045
+
1046
+ self.btnSelectRecurringDateNewBankView.isEnabled = true
1047
+ self.txtFieldSelectDateNewAccountView.isUserInteractionEnabled = true
1048
+ self.txtFieldSelectDateNewAccountView.isEnabled = true
1049
+ }
1050
+
1051
+ self.txtFieldStartDateCard.isHidden = false
1052
+ self.txtFieldSelectDateSingleSavedCard.isHidden = false
1053
+ self.txtFieldSelectDateNewCardView.isHidden = false
1054
+ self.txtFieldSelectDateViewBankFields.isHidden = false
1055
+ self.txtFieldSelectDateSingleSavedBankView.isHidden = false
1056
+ self.txtFieldSelectDateNewAccountView.isHidden = false
1057
+ self.txtFieldSelectDateGrailPayBankView.isHidden = false
1058
+ self.txtFieldSelectDateNewGrailPayBankView.isHidden = false
1059
+
1060
+ if request.saveAccount == false {
1061
+ self.heightViewBankFields.constant = 802
1062
+ self.heightViewNewAccountFields.constant = 852
1063
+ } else {
1064
+ self.heightViewBankFields.constant = 848
1065
+ self.heightViewNewAccountFields.constant = 902
1066
+ }
1067
+
1068
+ if request.saveCard == false {
1069
+ self.heightViewNewCardFields.constant = 595
1070
+ } else {
1071
+ self.heightViewNewCardFields.constant = 648
1072
+ }
1073
+
1074
+ self.heightSubViewNewAccountFields.constant = 872
1075
+
1076
+ // if request.recurringStartDateType == .custom {
1077
+ // self.txtFieldStartDateCard.isHidden = false
1078
+ // self.txtFieldSelectDateSingleSavedCard.isHidden = false
1079
+ // self.txtFieldSelectDateNewCardView.isHidden = false
1080
+ // self.txtFieldSelectDateViewBankFields.isHidden = false
1081
+ // self.txtFieldSelectDateSingleSavedBankView.isHidden = false
1082
+ // self.txtFieldSelectDateNewAccountView.isHidden = false
1083
+ // self.txtFieldSelectDateGrailPayBankView.isHidden = false
1084
+ // self.txtFieldSelectDateNewGrailPayBankView.isHidden = false
1085
+ //
1086
+ // if request.saveAccount == false {
1087
+ // self.heightViewBankFields.constant = 790
1088
+ // self.heightViewNewAccountFields.constant = 840
1089
+ // } else {
1090
+ // self.heightViewBankFields.constant = 836
1091
+ // self.heightViewNewAccountFields.constant = 890
1092
+ // }
1093
+ //
1094
+ // if request.saveCard == false {
1095
+ // self.heightViewNewCardFields.constant = 595
1096
+ // } else {
1097
+ // self.heightViewNewCardFields.constant = 648
1098
+ // }
1099
+ //
1100
+ // self.heightSubViewNewAccountFields.constant = 860
1101
+ // } else {
1102
+ // self.txtFieldStartDateCard.isHidden = true
1103
+ // self.txtFieldSelectDateSingleSavedCard.isHidden = true
1104
+ // self.txtFieldSelectDateNewCardView.isHidden = true
1105
+ // self.txtFieldSelectDateViewBankFields.isHidden = true
1106
+ // self.txtFieldSelectDateSingleSavedBankView.isHidden = true
1107
+ // self.txtFieldSelectDateNewAccountView.isHidden = true
1108
+ // self.txtFieldSelectDateGrailPayBankView.isHidden = true
1109
+ // self.txtFieldSelectDateNewGrailPayBankView.isHidden = true
1110
+ //
1111
+ // if request.saveAccount == false {
1112
+ // self.heightViewBankFields.constant = 700
1113
+ // self.heightViewNewAccountFields.constant = 742
1114
+ // } else {
1115
+ // self.heightViewBankFields.constant = 740
1116
+ // self.heightViewNewAccountFields.constant = 796
1117
+ // }
1118
+ //
1119
+ // if request.saveCard == false {
1120
+ // self.heightViewNewCardFields.constant = 500
1121
+ // } else {
1122
+ // self.heightViewNewCardFields.constant = 553
1123
+ // }
1124
+ //
1125
+ // self.heightSubViewNewAccountFields.constant = 745
1126
+ // }
1127
+
1128
+ self.txtFieldChosePlanCard.isHidden = false
705
1129
  self.txtFieldSelectPlanSingleSavedCard.isHidden = false
706
1130
  self.txtFieldSelectPlanNewCardView.isHidden = false
707
1131
  self.txtFieldSelectPlanViewBankFields.isHidden = false
@@ -729,11 +1153,11 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
729
1153
  self.txtFieldSelectDateNewGrailPayBankView.isHidden = true
730
1154
 
731
1155
  if request.saveAccount == false {
732
- self.heightViewBankFields.constant = 604
733
- self.heightViewNewAccountFields.constant = 644
1156
+ self.heightViewBankFields.constant = 616
1157
+ self.heightViewNewAccountFields.constant = 656
734
1158
  } else {
735
- self.heightViewBankFields.constant = 644
736
- self.heightViewNewAccountFields.constant = 704
1159
+ self.heightViewBankFields.constant = 656
1160
+ self.heightViewNewAccountFields.constant = 716
737
1161
  }
738
1162
 
739
1163
  if request.saveCard == false {
@@ -742,7 +1166,7 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
742
1166
  self.heightViewNewCardFields.constant = 458
743
1167
  }
744
1168
 
745
- self.heightSubViewNewAccountFields.constant = 650
1169
+ self.heightSubViewNewAccountFields.constant = 662
746
1170
  }
747
1171
 
748
1172
  if selectedPaymentMethod == "Card" {
@@ -793,12 +1217,13 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
793
1217
  btnNextTopCon.constant = 0
794
1218
  if request.is_recurring == true {
795
1219
  txtFieldSelectPlanSingleSavedCard.isHidden = false
796
- if request.recurringStartDateType == .custom {
797
- txtFieldSelectDateSingleSavedCard.isHidden = false
798
- }
799
- else {
800
- txtFieldSelectDateSingleSavedCard.isHidden = true
801
- }
1220
+ txtFieldSelectDateSingleSavedCard.isHidden = false
1221
+ // if request.recurringStartDateType == .custom {
1222
+ // txtFieldSelectDateSingleSavedCard.isHidden = false
1223
+ // }
1224
+ // else {
1225
+ // txtFieldSelectDateSingleSavedCard.isHidden = true
1226
+ // }
802
1227
  }
803
1228
  else {
804
1229
  txtFieldSelectPlanSingleSavedCard.isHidden = true
@@ -883,12 +1308,13 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
883
1308
  self.btnPayNowSingleAccountView.isHidden = false
884
1309
  if request.is_recurring == true {
885
1310
  self.txtFieldSelectPlanSingleSavedBankView.isHidden = false
886
- if request.recurringStartDateType == .custom {
887
- self.txtFieldSelectDateSingleSavedBankView.isHidden = false
888
- }
889
- else {
890
- self.txtFieldSelectDateSingleSavedBankView.isHidden = true
891
- }
1311
+ self.txtFieldSelectDateSingleSavedBankView.isHidden = false
1312
+ // if request.recurringStartDateType == .custom {
1313
+ // self.txtFieldSelectDateSingleSavedBankView.isHidden = false
1314
+ // }
1315
+ // else {
1316
+ // self.txtFieldSelectDateSingleSavedBankView.isHidden = true
1317
+ // }
892
1318
  }
893
1319
  else {
894
1320
  self.txtFieldSelectPlanSingleSavedBankView.isHidden = true
@@ -942,12 +1368,12 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
942
1368
  self.viewBtnShowSavedCardHeight.constant = 0
943
1369
  self.viewBtnShowSavedCardTopCon.constant = 0
944
1370
  }
945
- // else {
946
- // self.viewBtnShowSavedCards.isHidden = false
947
- // self.lblBtnShowSaveCard.text = "Show Saved Accounts"
948
- // self.viewBtnShowSavedCardHeight.constant = 50
949
- // self.viewBtnShowSavedCardTopCon.constant = 20
950
- // }
1371
+ // else {
1372
+ // self.viewBtnShowSavedCards.isHidden = false
1373
+ // self.lblBtnShowSaveCard.text = "Show Saved Accounts"
1374
+ // self.viewBtnShowSavedCardHeight.constant = 50
1375
+ // self.viewBtnShowSavedCardTopCon.constant = 20
1376
+ // }
951
1377
 
952
1378
  self.OTPView.isHidden = true
953
1379
  self.emailView.isHidden = true
@@ -1816,16 +2242,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
1816
2242
  }
1817
2243
 
1818
2244
  @IBAction func actionBtnSelectPlanViewBankFields(_ sender: UIButton) {
1819
- guard var plans = request?.recurringIntervals, !plans.isEmpty else {
2245
+ guard let plans = request?.recurringIntervals, !plans.isEmpty else {
1820
2246
  print("No recurring intervals available.")
1821
2247
  return
1822
2248
  }
1823
2249
 
1824
- // Check if current payment method is only Bank
1825
- if request?.selectedPaymentMethods.contains(.Bank) == true {
1826
- // Remove 'daily' from plans
1827
- plans.removeAll { $0 == .daily }
1828
- }
2250
+ // // Check if current payment method is only Bank
2251
+ // if request?.selectedPaymentMethods.contains(.Bank) == true {
2252
+ // // Remove 'daily' from plans
2253
+ // plans.removeAll { $0 == .daily }
2254
+ // }
1829
2255
 
1830
2256
  // Now present the filtered plans
1831
2257
  PlanSelector.presentPlanOptions(from: self, sourceView: sender, allowedPlans: plans) { selectedPlan in
@@ -1842,16 +2268,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
1842
2268
  }
1843
2269
 
1844
2270
  @IBAction func actionBtnSelectPlanSingleSavedAccount(_ sender: UIButton) {
1845
- guard var plans = request?.recurringIntervals, !plans.isEmpty else {
2271
+ guard let plans = request?.recurringIntervals, !plans.isEmpty else {
1846
2272
  print("No recurring intervals available.")
1847
2273
  return
1848
2274
  }
1849
2275
 
1850
- // Check if current payment method is only Bank
1851
- if request?.selectedPaymentMethods.contains(.Bank) == true {
1852
- // Remove 'daily' from plans
1853
- plans.removeAll { $0 == .daily }
1854
- }
2276
+ // // Check if current payment method is only Bank
2277
+ // if request?.selectedPaymentMethods.contains(.Bank) == true {
2278
+ // // Remove 'daily' from plans
2279
+ // plans.removeAll { $0 == .daily }
2280
+ // }
1855
2281
 
1856
2282
  PlanSelector.presentPlanOptions(from: self, sourceView: sender, allowedPlans: plans) { selectedPlan in
1857
2283
  self.txtFieldSelectPlanSingleSavedBankView.text = selectedPlan
@@ -1867,16 +2293,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
1867
2293
  }
1868
2294
 
1869
2295
  @IBAction func actionBtnSelectPlanNewAccountView(_ sender: UIButton) {
1870
- guard var plans = request?.recurringIntervals, !plans.isEmpty else {
2296
+ guard let plans = request?.recurringIntervals, !plans.isEmpty else {
1871
2297
  print("No recurring intervals available.")
1872
2298
  return
1873
2299
  }
1874
2300
 
1875
- // Check if current payment method is only Bank
1876
- if request?.selectedPaymentMethods.contains(.Bank) == true {
1877
- // Remove 'daily' from plans
1878
- plans.removeAll { $0 == .daily }
1879
- }
2301
+ // // Check if current payment method is only Bank
2302
+ // if request?.selectedPaymentMethods.contains(.Bank) == true {
2303
+ // // Remove 'daily' from plans
2304
+ // plans.removeAll { $0 == .daily }
2305
+ // }
1880
2306
 
1881
2307
  PlanSelector.presentPlanOptions(from: self, sourceView: sender, allowedPlans: plans) { selectedPlan in
1882
2308
  self.txtFieldSelectPlanNewAccountView.text = selectedPlan
@@ -1969,11 +2395,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
1969
2395
  btnNextHeight.constant = 0
1970
2396
  btnNextTopCon.constant = isSelectForPay ? 0 : 8
1971
2397
 
2398
+ // // Handle recurring fields visibility
2399
+ // let showRecurringFields = isSelectForPay && request.is_recurring == true
2400
+ // let isCustomRecurring = request.recurringStartDateType == .custom
2401
+ // txtFieldSelectPlanSingleSavedCard.isHidden = !showRecurringFields
2402
+ // txtFieldSelectDateSingleSavedCard.isHidden = !(showRecurringFields && isCustomRecurring)
2403
+
1972
2404
  // Handle recurring fields visibility
1973
2405
  let showRecurringFields = isSelectForPay && request.is_recurring == true
1974
- let isCustomRecurring = request.recurringStartDateType == .custom
1975
2406
  txtFieldSelectPlanSingleSavedCard.isHidden = !showRecurringFields
1976
- txtFieldSelectDateSingleSavedCard.isHidden = !(showRecurringFields && isCustomRecurring)
2407
+ txtFieldSelectDateSingleSavedCard.isHidden = !showRecurringFields // Show for both .custom and .fixed
1977
2408
 
1978
2409
  // Set selected card based on tapped index
1979
2410
  if isSelectForPay, index < savedCards.count {
@@ -2380,16 +2811,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2380
2811
  }
2381
2812
 
2382
2813
  @IBAction func actionBtnChosePlanGrailPayBankView(_ sender: UIButton) {
2383
- guard var plans = request?.recurringIntervals, !plans.isEmpty else {
2814
+ guard let plans = request?.recurringIntervals, !plans.isEmpty else {
2384
2815
  print("No recurring intervals available.")
2385
2816
  return
2386
2817
  }
2387
2818
 
2388
- // Check if current payment method is only Bank
2389
- if request?.selectedPaymentMethods.contains(.Bank) == true {
2390
- // Remove 'daily' from plans
2391
- plans.removeAll { $0 == .daily }
2392
- }
2819
+ // // Check if current payment method is only Bank
2820
+ // if request?.selectedPaymentMethods.contains(.Bank) == true {
2821
+ // // Remove 'daily' from plans
2822
+ // plans.removeAll { $0 == .daily }
2823
+ // }
2393
2824
 
2394
2825
  PlanSelector.presentPlanOptions(from: self, sourceView: sender, allowedPlans: plans) { selectedPlan in
2395
2826
  self.txtFieldChosePlanGrailPayBankView.text = selectedPlan
@@ -2405,16 +2836,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2405
2836
  }
2406
2837
 
2407
2838
  @IBAction func actionBtnSelectPlanNewGrailPayBankView(_ sender: UIButton) {
2408
- guard var plans = request?.recurringIntervals, !plans.isEmpty else {
2839
+ guard let plans = request?.recurringIntervals, !plans.isEmpty else {
2409
2840
  print("No recurring intervals available.")
2410
2841
  return
2411
2842
  }
2412
2843
 
2413
- // Check if current payment method is only Bank
2414
- if request?.selectedPaymentMethods.contains(.Bank) == true {
2415
- // Remove 'daily' from plans
2416
- plans.removeAll { $0 == .daily }
2417
- }
2844
+ // // Check if current payment method is only Bank
2845
+ // if request?.selectedPaymentMethods.contains(.Bank) == true {
2846
+ // // Remove 'daily' from plans
2847
+ // plans.removeAll { $0 == .daily }
2848
+ // }
2418
2849
 
2419
2850
  PlanSelector.presentPlanOptions(from: self, sourceView: sender, allowedPlans: plans) { selectedPlan in
2420
2851
  self.txtFieldChosePlanNewGrailPayBankView.text = selectedPlan
@@ -2445,12 +2876,8 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2445
2876
  uRLRequest.httpMethod = "POST"
2446
2877
  uRLRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
2447
2878
 
2448
- // Add API headers
2449
- if let apiKey = EnvironmentConfig.apiKey,
2450
- let apiSecret = EnvironmentConfig.apiSecret {
2451
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
2452
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
2453
- }
2879
+ let token = UserStoreSingleton.shared.clientToken ?? ""
2880
+ uRLRequest.addValue(token, forHTTPHeaderField: "clientToken")
2454
2881
 
2455
2882
  // Prepare parameters
2456
2883
  let params: [String: Any] = [
@@ -2523,12 +2950,13 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2523
2950
 
2524
2951
  if self.request.is_recurring == true {
2525
2952
  self.txtFieldChosePlanGrailPayBankView.isHidden = false
2526
- if self.request.recurringStartDateType == .custom {
2527
- self.txtFieldSelectDateGrailPayBankView.isHidden = false
2528
- }
2529
- else {
2530
- self.txtFieldSelectDateGrailPayBankView.isHidden = true
2531
- }
2953
+ self.txtFieldSelectDateGrailPayBankView.isHidden = false
2954
+ // if self.request.recurringStartDateType == .custom {
2955
+ // self.txtFieldSelectDateGrailPayBankView.isHidden = false
2956
+ // }
2957
+ // else {
2958
+ // self.txtFieldSelectDateGrailPayBankView.isHidden = true
2959
+ // }
2532
2960
  }
2533
2961
 
2534
2962
  if let accountNumber = account["account_number"] as? String {
@@ -2591,12 +3019,8 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2591
3019
  request.httpMethod = "POST"
2592
3020
  request.addValue("application/json", forHTTPHeaderField: "Content-Type")
2593
3021
 
2594
- // Add API headers
2595
- if let apiKey = EnvironmentConfig.apiKey,
2596
- let apiSecret = EnvironmentConfig.apiSecret {
2597
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
2598
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
2599
- }
3022
+ let token = UserStoreSingleton.shared.clientToken ?? ""
3023
+ request.addValue(token, forHTTPHeaderField: "clientToken")
2600
3024
 
2601
3025
  // Save customer_id for use in charge API
2602
3026
  let customerID = UserStoreSingleton.shared.customerId ?? ""
@@ -2678,12 +3102,13 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2678
3102
 
2679
3103
  if self.request.is_recurring == true {
2680
3104
  self.txtFieldChosePlanNewGrailPayBankView.isHidden = false
2681
- if self.request.recurringStartDateType == .custom {
2682
- self.txtFieldSelectDateNewGrailPayBankView.isHidden = false
2683
- }
2684
- else {
2685
- self.txtFieldSelectDateNewGrailPayBankView.isHidden = true
2686
- }
3105
+ self.txtFieldSelectDateNewGrailPayBankView.isHidden = false
3106
+ // if self.request.recurringStartDateType == .custom {
3107
+ // self.txtFieldSelectDateNewGrailPayBankView.isHidden = false
3108
+ // }
3109
+ // else {
3110
+ // self.txtFieldSelectDateNewGrailPayBankView.isHidden = true
3111
+ // }
2687
3112
  }
2688
3113
 
2689
3114
  if let accountNumber = account["account_number"] as? String {
@@ -3117,71 +3542,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
3117
3542
  }
3118
3543
  }
3119
3544
 
3120
- // func launchGrailPay() {
3121
- // guard let grailPayParams = request.grailPayParams else {
3122
- // print("GrailPay parameters not available in request")
3123
- // return
3124
- // }
3125
- //
3126
- // GrailPayHelper.presentGrailPay(from: self, request: grailPayParams) { [weak self] result in
3127
- // guard let self = self else { return }
3128
- //
3129
- // switch result.type {
3130
- // case .success:
3131
- // if let chargeData = result.chargeData,
3132
- // let dataArray = chargeData["data"] as? [[String: Any]],
3133
- // let selectedAccount = dataArray.first {
3134
- //
3135
- // print("✅ Bank connected: \(selectedAccount)")
3136
- // self.selectedGrailPayAccountType = selectedAccount["account_type"] as? String
3137
- // self.selectedGrailPayAccountName = selectedAccount["name"] as? String
3138
- //
3139
- // if self.grailPaySource == .existingAccount {
3140
- // self.accountConnectApi(account: selectedAccount)
3141
- // self.lblGrailPayAabandonError.text = "Default account successfully set"
3142
- // self.viewGrailPayAbandon.isHidden = false
3143
- // } else if self.grailPaySource == .newAccount {
3144
- // self.newGrailPayAccountConnectApi(account: selectedAccount)
3145
- // self.lblAbandonGrailPayNewAccountView.text = "Default account successfully set"
3146
- // self.viewAbandonGrailPayNewAccountView.isHidden = false
3147
- //
3148
- // self.selectedNewGrailPayAccountType = selectedAccount["account_type"] as? String
3149
- // self.selectedNewGrailPayAccountName = selectedAccount["name"] as? String
3150
- // }
3151
- //
3152
- // if self.selectedPaymentMethod == "Bank" {
3153
- // self.viewBtnShowSavedCards.isHidden = true
3154
- // }
3155
- //
3156
- // let amountText = String(format: "$%.2f", self.request.amount ?? 0)
3157
- // let submitText = self.request.submitButtonText
3158
- // let defaultTitle = (submitText?.isEmpty == false)
3159
- // ? "\(submitText!) (\(amountText))"
3160
- // : "Pay Now (\(amountText))"
3161
- //
3162
- // if self.grailPaySource == .existingAccount {
3163
- // self.btnLinkBankAccount.setTitle(defaultTitle, for: .normal)
3164
- // } else if self.grailPaySource == .newAccount {
3165
- // self.btnLinkGrailPayAddNewAccount.setTitle(defaultTitle, for: .normal)
3166
- // }
3167
- //
3168
- // } else {
3169
- // print("⚠️ chargeData does not contain valid account data")
3170
- // self.showGrailPayError(message: "Failed to retrieve account info")
3171
- // }
3172
- //
3173
- // case .cancelled:
3174
- // print("⚠️ GrailPay cancelled")
3175
- // self.showGrailPayError(message: "User has abandoned the action")
3176
- //
3177
- // case .error:
3178
- // let errorMsg = result.error?.localizedDescription ?? "Unknown error"
3179
- // print("❌ GrailPay error: \(errorMsg)")
3180
- // self.showGrailPayError(message: errorMsg)
3181
- // }
3182
- // }
3183
- // }
3184
-
3185
3545
  func launchGrailPay() {
3186
3546
  guard let grailPayParams = request.grailPayParams else {
3187
3547
  print("GrailPay parameters not available in request")
@@ -3305,13 +3665,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
3305
3665
  print("Setting clientToken header: \(token ?? "None")")
3306
3666
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
3307
3667
 
3308
- if let apiKey = EnvironmentConfig.apiKey {
3309
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "X-Api-Key")
3310
- }
3311
- if let apiSecret = EnvironmentConfig.apiSecret {
3312
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "X-Api-Secret")
3313
- }
3314
-
3315
3668
  var params: [String: Any] = [
3316
3669
  "account_id": self.grailPayAccountID ?? "",
3317
3670
  "account_type": self.selectedGrailPayAccountType ?? "",
@@ -3518,13 +3871,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
3518
3871
  print("Setting clientToken header: \(token ?? "None")")
3519
3872
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
3520
3873
 
3521
- if let apiKey = EnvironmentConfig.apiKey {
3522
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "X-Api-Key")
3523
- }
3524
- if let apiSecret = EnvironmentConfig.apiSecret {
3525
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "X-Api-Secret")
3526
- }
3527
-
3528
3874
  let emailText = txtFieldEmailGrailPayView.text
3529
3875
  let emailPrefix = emailText.components(separatedBy: "@").first ?? ""
3530
3876
 
@@ -3748,13 +4094,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
3748
4094
  print("Setting clientToken header: \(token ?? "None")")
3749
4095
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
3750
4096
 
3751
- if let apiKey = EnvironmentConfig.apiKey {
3752
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "X-Api-Key")
3753
- }
3754
- if let apiSecret = EnvironmentConfig.apiSecret {
3755
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "X-Api-Secret")
3756
- }
3757
-
3758
4097
  var params: [String: Any] = [
3759
4098
  "account_id": self.newGrailPayAccountID ?? "",
3760
4099
  "account_type": self.selectedNewGrailPayAccountType ?? "",
@@ -3970,13 +4309,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
3970
4309
  print("Setting clientToken header: \(token ?? "None")")
3971
4310
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
3972
4311
 
3973
- if let apiKey = EnvironmentConfig.apiKey {
3974
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "X-Api-Key")
3975
- }
3976
- if let apiSecret = EnvironmentConfig.apiSecret {
3977
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "X-Api-Secret")
3978
- }
3979
-
3980
4312
  var params: [String: Any] = [
3981
4313
  "account_id": selectedbankAccounts?.account_id ?? "",
3982
4314
  "customer": selectedbankAccounts?.customer_id ?? "",
@@ -4840,7 +5172,7 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
4840
5172
  }
4841
5173
  }
4842
5174
  }
4843
-
5175
+
4844
5176
  @IBAction func actionBtnCloseSettingView(_ sender: UIButton) {
4845
5177
  settingsView.isHidden = true
4846
5178
  }
@@ -5420,13 +5752,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
5420
5752
  print("Setting clientToken header: \(token ?? "None")")
5421
5753
  request.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
5422
5754
 
5423
- // Add API headers
5424
- if let apiKey = EnvironmentConfig.apiKey,
5425
- let apiSecret = EnvironmentConfig.apiSecret {
5426
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
5427
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
5428
- }
5429
-
5430
5755
  // Define the parameters for the request
5431
5756
  let params: [String: Any] = [
5432
5757
  "card_search_value": txtFieldEmail.text ?? "",
@@ -5507,13 +5832,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
5507
5832
  print("Setting clientToken header: \(token ?? "None")")
5508
5833
  urlRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
5509
5834
 
5510
- // Add API headers
5511
- if let apiKey = EnvironmentConfig.apiKey,
5512
- let apiSecret = EnvironmentConfig.apiSecret {
5513
- urlRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
5514
- urlRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
5515
- }
5516
-
5517
5835
  // Safe access from main thread (assumes you call this from main thread)
5518
5836
  let email = self.txtFieldEmail.text ?? ""
5519
5837
  let otp = getCombinedOTP()
@@ -5665,13 +5983,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
5665
5983
  print("🔑 Setting customerToken header: \(token ?? "None")")
5666
5984
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Customer-Token")
5667
5985
 
5668
- // Add API headers
5669
- if let apiKey = EnvironmentConfig.apiKey,
5670
- let apiSecret = EnvironmentConfig.apiSecret {
5671
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
5672
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
5673
- }
5674
-
5675
5986
  let session = URLSession.shared
5676
5987
  let task = session.dataTask(with: uRLRequest) { [weak self] (data, response, error) in
5677
5988
  guard let self = self else { return }
@@ -5767,9 +6078,10 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
5767
6078
 
5768
6079
  if self.request.is_recurring == true {
5769
6080
  self.txtFieldSelectPlanSingleSavedCard.isHidden = false
5770
- if self.request.recurringStartDateType == .custom {
5771
- self.txtFieldSelectDateSingleSavedCard.isHidden = false
5772
- }
6081
+ self.txtFieldSelectDateSingleSavedCard.isHidden = false
6082
+ // if self.request.recurringStartDateType == .custom {
6083
+ // self.txtFieldSelectDateSingleSavedCard.isHidden = false
6084
+ // }
5773
6085
  } else {
5774
6086
  self.txtFieldSelectPlanSingleSavedCard.isHidden = true
5775
6087
  self.txtFieldSelectDateSingleSavedCard.isHidden = true
@@ -6529,13 +6841,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
6529
6841
  print("Setting clientToken header: \(token ?? "None")")
6530
6842
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
6531
6843
 
6532
- // Add API headers
6533
- if let apiKey = EnvironmentConfig.apiKey,
6534
- let apiSecret = EnvironmentConfig.apiSecret {
6535
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
6536
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
6537
- }
6538
-
6539
6844
  let emailPrefix = UserStoreSingleton.shared.verificationEmail?.components(separatedBy: "@").first ?? ""
6540
6845
 
6541
6846
  var params: [String: Any] = [
@@ -6948,13 +7253,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
6948
7253
  print("Setting customerToken header: \(token ?? "None")")
6949
7254
  request.addValue(token ?? "", forHTTPHeaderField: "Customer-Token")
6950
7255
 
6951
- // Add API headers
6952
- if let apiKey = EnvironmentConfig.apiKey,
6953
- let apiSecret = EnvironmentConfig.apiSecret {
6954
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
6955
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
6956
- }
6957
-
6958
7256
  // Get the text fields from the selected cell and trim whitespace
6959
7257
  let nameText = txtFieldNameOnCardUpdateCardView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
6960
7258
  let cvvText = txtFieldCVVUpdateCardView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
@@ -7115,14 +7413,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7115
7413
  print("Customer-Token is nil")
7116
7414
  }
7117
7415
 
7118
- // Add API headers
7119
- if let apiKey = EnvironmentConfig.apiKey {
7120
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
7121
- }
7122
- if let apiSecret = EnvironmentConfig.apiSecret {
7123
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
7124
- }
7125
-
7126
7416
  let session = URLSession.shared
7127
7417
  let task = session.dataTask(with: request) { [weak self] data, response, error in
7128
7418
  guard let self = self else { return }
@@ -7310,11 +7600,12 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7310
7600
 
7311
7601
  if self.request.is_recurring == true {
7312
7602
  self.txtFieldSelectPlanSingleSavedBankView.isHidden = false
7313
- if self.request.recurringStartDateType == .custom {
7314
- self.txtFieldSelectDateSingleSavedBankView.isHidden = false
7315
- } else {
7316
- self.txtFieldSelectDateSingleSavedBankView.isHidden = true
7317
- }
7603
+ self.txtFieldSelectDateSingleSavedBankView.isHidden = false
7604
+ // if self.request.recurringStartDateType == .custom {
7605
+ // self.txtFieldSelectDateSingleSavedBankView.isHidden = false
7606
+ // } else {
7607
+ // self.txtFieldSelectDateSingleSavedBankView.isHidden = true
7608
+ // }
7318
7609
  }
7319
7610
  else {
7320
7611
  self.txtFieldSelectPlanSingleSavedBankView.isHidden = true
@@ -7369,13 +7660,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7369
7660
  print("Setting clientToken header: \(token ?? "None")")
7370
7661
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
7371
7662
 
7372
- // Add API headers
7373
- if let apiKey = EnvironmentConfig.apiKey,
7374
- let apiSecret = EnvironmentConfig.apiSecret {
7375
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
7376
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
7377
- }
7378
-
7379
7663
  var params: [String: Any] = [
7380
7664
  "name": txtFieldAccountName.text ?? "",
7381
7665
  "email": txtFieldEmailAccountView.text,
@@ -7385,7 +7669,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7385
7669
  "routing_number": txtFieldRoutingNumber.text?.replacingOccurrences(of: " ", with: "") ?? "",
7386
7670
  "account_number": txtFieldAccountNumber.text?.replacingOccurrences(of: " ", with: "") ?? "",
7387
7671
  "payment_mode": "auth_and_capture",
7388
- "payment_intent": UserStoreSingleton.shared.paymentIntent ?? "",
7389
7672
  "levelIndicator": 1,
7390
7673
  "payment_method": "ach"
7391
7674
  ]
@@ -7556,13 +7839,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7556
7839
  print("Setting clientToken header: \(token ?? "None")")
7557
7840
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
7558
7841
 
7559
- // Add API headers
7560
- if let apiKey = EnvironmentConfig.apiKey,
7561
- let apiSecret = EnvironmentConfig.apiSecret {
7562
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
7563
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
7564
- }
7565
-
7566
7842
  var params: [String: Any] = [
7567
7843
  "name": !(request.name?.isEmpty ?? true) ? request.name! : (txtFieldAccountName.text ?? ""),
7568
7844
  "email": txtFieldEmailAccountView.text,
@@ -7572,7 +7848,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7572
7848
  "routing_number": txtFieldRoutingNumber.text?.replacingOccurrences(of: " ", with: "") ?? "",
7573
7849
  "account_number": txtFieldAccountNumber.text?.replacingOccurrences(of: " ", with: "") ?? "",
7574
7850
  "payment_mode": "auth_and_capture",
7575
- "payment_intent": UserStoreSingleton.shared.paymentIntent ?? "",
7576
7851
  "levelIndicator": 1,
7577
7852
  "payment_method": "ach"
7578
7853
  ]
@@ -7799,13 +8074,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7799
8074
  print("Setting clientToken header: \(token ?? "None")")
7800
8075
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
7801
8076
 
7802
- // Add API headers
7803
- if let apiKey = EnvironmentConfig.apiKey,
7804
- let apiSecret = EnvironmentConfig.apiSecret {
7805
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
7806
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
7807
- }
7808
-
7809
8077
  var params: [String: Any] = [
7810
8078
  "account_id": selectedbankAccounts?.account_id ?? "",
7811
8079
  "customer": selectedbankAccounts?.customer_id ?? "",
@@ -7964,13 +8232,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7964
8232
  print("Setting clientToken header: \(token ?? "None")")
7965
8233
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
7966
8234
 
7967
- // Add API headers
7968
- if let apiKey = EnvironmentConfig.apiKey,
7969
- let apiSecret = EnvironmentConfig.apiSecret {
7970
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
7971
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
7972
- }
7973
-
7974
8235
  var params: [String: Any] = [
7975
8236
  "account_id": selectedbankAccounts?.account_id ?? "",
7976
8237
  "customer": selectedbankAccounts?.customer_id ?? "",
@@ -8184,13 +8445,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8184
8445
  print("Setting clientToken header: \(token ?? "None")")
8185
8446
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
8186
8447
 
8187
- // Add API headers
8188
- if let apiKey = EnvironmentConfig.apiKey,
8189
- let apiSecret = EnvironmentConfig.apiSecret {
8190
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
8191
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
8192
- }
8193
-
8194
8448
  let accountName = txtFieldAccountNameNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
8195
8449
  let routingNumber = txtFieldRoutingNumberNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
8196
8450
  let accountType = txtFieldAccountTypeNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
@@ -8206,7 +8460,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8206
8460
  "routing_number": routingNumber,
8207
8461
  "account_number": accountNumber,
8208
8462
  "payment_mode": "auth_and_capture",
8209
- "payment_intent": UserStoreSingleton.shared.paymentIntent ?? "",
8210
8463
  "levelIndicator": 1,
8211
8464
  ]
8212
8465
 
@@ -8359,13 +8612,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8359
8612
  print("Setting clientToken header: \(token ?? "None")")
8360
8613
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
8361
8614
 
8362
- // Add API headers
8363
- if let apiKey = EnvironmentConfig.apiKey,
8364
- let apiSecret = EnvironmentConfig.apiSecret {
8365
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
8366
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
8367
- }
8368
-
8369
8615
  let accountName = txtFieldAccountNameNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
8370
8616
  let routingNumber = txtFieldRoutingNumberNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
8371
8617
  let accountType = txtFieldAccountTypeNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
@@ -8380,7 +8626,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8380
8626
  "routing_number": routingNumber,
8381
8627
  "account_number": accountNumber,
8382
8628
  "payment_mode": "auth_and_capture",
8383
- "payment_intent": UserStoreSingleton.shared.paymentIntent ?? "",
8384
8629
  "levelIndicator": 1,
8385
8630
  ]
8386
8631
 
@@ -8588,13 +8833,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8588
8833
  print("Setting clientToken header: \(token ?? "None")")
8589
8834
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
8590
8835
 
8591
- // Add API headers
8592
- if let apiKey = EnvironmentConfig.apiKey,
8593
- let apiSecret = EnvironmentConfig.apiSecret {
8594
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
8595
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
8596
- }
8597
-
8598
8836
  // Retrieve and trim text field values (removing leading and trailing whitespace)
8599
8837
  let accountName = txtFieldAccountNameNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
8600
8838
  let routingNumber = txtFieldRoutingNumberNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
@@ -8612,7 +8850,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8612
8850
  "routing_number": routingNumber,
8613
8851
  "account_number": accountNumber,
8614
8852
  "payment_mode": "auth_and_capture",
8615
- "payment_intent": UserStoreSingleton.shared.paymentIntent ?? "",
8616
8853
  "levelIndicator": 1,
8617
8854
  "save_account": 1,
8618
8855
  "payment_method": "ach"
@@ -8772,13 +9009,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8772
9009
  print("Setting customerToken header: \(token ?? "None")")
8773
9010
  request.addValue(token ?? "", forHTTPHeaderField: "Customer-Token")
8774
9011
 
8775
- // Add API headers
8776
- if let apiKey = EnvironmentConfig.apiKey,
8777
- let apiSecret = EnvironmentConfig.apiSecret {
8778
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
8779
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
8780
- }
8781
-
8782
9012
  let session = URLSession.shared
8783
9013
  let task = session.dataTask(with: request) { [weak self] (serviceData, serviceResponse, error) in
8784
9014
  guard let self = self else { return }
@@ -8854,13 +9084,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8854
9084
  print("Setting clientToken header: \(token ?? "None")")
8855
9085
  urlRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
8856
9086
 
8857
- // Add API headers
8858
- if let apiKey = EnvironmentConfig.apiKey,
8859
- let apiSecret = EnvironmentConfig.apiSecret {
8860
- urlRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
8861
- urlRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
8862
- }
8863
-
8864
9087
  var params: [String: Any] = [
8865
9088
  "name": UserStoreSingleton.shared.merchantName ?? "",
8866
9089
  "email": UserStoreSingleton.shared.merchantEmail ?? "",
@@ -9007,13 +9230,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
9007
9230
  print("Setting clientToken header: \(token ?? "None")")
9008
9231
  request.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
9009
9232
 
9010
- // Add API headers
9011
- if let apiKey = EnvironmentConfig.apiKey,
9012
- let apiSecret = EnvironmentConfig.apiSecret {
9013
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
9014
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
9015
- }
9016
-
9017
9233
  let session = URLSession.shared
9018
9234
  let task = session.dataTask(with: request) { [weak self] (data, response, error) in
9019
9235
  guard let self = self else { return }
@@ -9073,13 +9289,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
9073
9289
  print("Setting clientToken header: \(token ?? "None")")
9074
9290
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
9075
9291
 
9076
- // Add API headers
9077
- if let apiKey = EnvironmentConfig.apiKey,
9078
- let apiSecret = EnvironmentConfig.apiSecret {
9079
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
9080
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
9081
- }
9082
-
9083
9292
  var params: [String: Any] = [
9084
9293
  "name": cardNameTextField.text,
9085
9294
  "email": txtFieldEmailCardView.text,
@@ -9388,13 +9597,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
9388
9597
  print("Setting clientToken header: \(token ?? "None")")
9389
9598
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
9390
9599
 
9391
- // Add API headers
9392
- if let apiKey = EnvironmentConfig.apiKey,
9393
- let apiSecret = EnvironmentConfig.apiSecret {
9394
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
9395
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
9396
- }
9397
-
9398
9600
  var params: [String: Any] = [
9399
9601
  "name": nameText,
9400
9602
  "email": UserStoreSingleton.shared.verificationEmail ?? "",
@@ -9763,9 +9965,10 @@ extension PaymentInfoVC: UICollectionViewDelegate, UICollectionViewDataSource, U
9763
9965
  self.btnNextTopCon.constant = 0
9764
9966
  if self.request.is_recurring == true {
9765
9967
  self.txtFieldSelectPlanSingleSavedCard.isHidden = false
9766
- if request.recurringStartDateType == .custom {
9767
- self.txtFieldSelectDateSingleSavedCard.isHidden = false
9768
- }
9968
+ self.txtFieldSelectDateSingleSavedCard.isHidden = false
9969
+ // if request.recurringStartDateType == .custom {
9970
+ // self.txtFieldSelectDateSingleSavedCard.isHidden = false
9971
+ // }
9769
9972
  }
9770
9973
  else {
9771
9974
  self.txtFieldSelectPlanSingleSavedCard.isHidden = true
@@ -11022,3 +11225,4 @@ extension PaymentInfoVC: UITextFieldDelegate {
11022
11225
  }
11023
11226
 
11024
11227
  }
11228
+