@jimrising/easymerchantsdk-react-native 2.2.9 → 2.3.1

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 +310 -171
  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 +571 -369
  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
@@ -82,6 +82,7 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
82
82
  @IBOutlet weak var imgViewCalenderIconCard: UIImageView!
83
83
  @IBOutlet weak var txtFieldEmailCardView: TextFieldStackView!
84
84
  @IBOutlet weak var viewTxtFieldEmailCardView: UIView!
85
+ @IBOutlet weak var btnChosePlanCardView: UIButton!
85
86
 
86
87
  @IBOutlet weak var btnScanCard: UIButton!
87
88
 
@@ -90,6 +91,7 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
90
91
  @IBOutlet weak var btnNextEmailView: FilledButton!
91
92
  @IBOutlet weak var viewTxtFieldEmail: UIView!
92
93
  @IBOutlet weak var OTPView: UIView!
94
+ @IBOutlet weak var btnSelectRecurringDateCardView: UIButton!
93
95
 
94
96
  //OTP View
95
97
  @IBOutlet weak var viewTextOTP1: UIView!
@@ -134,6 +136,11 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
134
136
  @IBOutlet weak var txtFieldSelectPlanSingleSavedCard: TextFieldStackView!
135
137
  @IBOutlet weak var txtFieldSelectDateSingleSavedCard: TextFieldStackView!
136
138
 
139
+ @IBOutlet weak var DropDownIconSingleSavedCard: UIImageView!
140
+ @IBOutlet weak var btnChosePlanSingleSavedCard: UIButton!
141
+
142
+ @IBOutlet weak var btnSelectRecurringDateSingleSavedCard: UIButton!
143
+
137
144
  //Update Card
138
145
  @IBOutlet weak var btnSelectUpdateCardView: UIButton!
139
146
  @IBOutlet weak var imgViewCardUpdateCardView: UIImageView!
@@ -167,6 +174,10 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
167
174
  @IBOutlet weak var txtFieldSelectDateNewCardView: TextFieldStackView!
168
175
  @IBOutlet weak var heightViewNewCardFields: NSLayoutConstraint!
169
176
 
177
+ @IBOutlet weak var btnSelectRecurringDateNewCardView: UIButton!
178
+ @IBOutlet weak var btnSelectPlanNewCardView: UIButton!
179
+ @IBOutlet weak var dropDownIconNewCardView: UIImageView!
180
+
170
181
  //Bank
171
182
  @IBOutlet weak var viewBankFields: UIView!
172
183
  @IBOutlet weak var txtFieldAccountName: UITextField!
@@ -190,9 +201,14 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
190
201
  @IBOutlet weak var txtFieldEmailAccountView: TextFieldStackView!
191
202
  @IBOutlet weak var viewTxtFieldEmailAccountView: UIView!
192
203
 
204
+ @IBOutlet weak var dropDownIconViewBankFields: UIImageView!
205
+ @IBOutlet weak var btnSelectPlanViewBankFields: UIButton!
206
+
193
207
  @IBOutlet weak var viewSaveCardForFutureCardView: UIStackView!
194
208
  @IBOutlet weak var heightViewBankFields: NSLayoutConstraint!
195
209
 
210
+ @IBOutlet weak var btnSelectRecurringDateViewBankFields: UIButton!
211
+
196
212
  //GrailPay
197
213
  @IBOutlet weak var grailPayBankLinkView: UIView!
198
214
  @IBOutlet weak var viewGrailPaySavedBank: UIStackView!
@@ -217,6 +233,10 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
217
233
  @IBOutlet weak var txtFieldEmailGrailPayView: TextFieldStackView!
218
234
  @IBOutlet weak var viewTxtFieldEmailGrailPayView: UIView!
219
235
 
236
+ @IBOutlet weak var btnSelectPlanGrailPayBankView: UIButton!
237
+ @IBOutlet weak var dropDownIconGrailPayBankView: UIImageView!
238
+ @IBOutlet weak var btnSelectRecurringDateGrailPayView: UIButton!
239
+
220
240
  //New GrailPay Account
221
241
  @IBOutlet weak var viewAddNewGrailPayAccount: UIView!
222
242
  @IBOutlet weak var lblGrailPayNewAccount: UILabel!
@@ -242,6 +262,11 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
242
262
  @IBOutlet weak var imgViewBankIconGrailPayNewBank: UIImageView!
243
263
  @IBOutlet weak var viewSaveAccountForFututeNewGrailPayAccountView: UIStackView!
244
264
 
265
+ @IBOutlet weak var btnSelectPlanNewGrailPayBankView: UIButton!
266
+ @IBOutlet weak var dropDownIconNewGrailPayBankView: UIImageView!
267
+ @IBOutlet weak var btnSelectRecurringDateNewGrailPayView: UIButton!
268
+
269
+
245
270
  //SavedBank
246
271
  @IBOutlet weak var viewSingleSavedAccount: UIView!
247
272
  @IBOutlet weak var viewTermAndConditionsSingleAccountView: UIStackView!
@@ -261,6 +286,11 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
261
286
  @IBOutlet weak var txtFieldSelectPlanSingleSavedBankView: TextFieldStackView!
262
287
  @IBOutlet weak var txtFieldSelectDateSingleSavedBankView: TextFieldStackView!
263
288
 
289
+ @IBOutlet weak var dropDownIconSingleSavedBankView: UIImageView!
290
+ @IBOutlet weak var btnSelectPlanSingleSavedBankView: UIButton!
291
+
292
+ @IBOutlet weak var btnSelectRecurringDateSavedBankView: UIButton!
293
+
264
294
  //New Bank
265
295
  @IBOutlet weak var viewNewBankAccount: UIView!
266
296
  @IBOutlet weak var txtFieldAccountNameNewAccountView: UITextField!
@@ -289,6 +319,10 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
289
319
  @IBOutlet weak var lblAgreeToTheNewAccountView: UILabel!
290
320
  @IBOutlet weak var lblTermsAndConditionsNewAccountView: UILabel!
291
321
 
322
+ @IBOutlet weak var dropDownIconNewBankAccountView: UIImageView!
323
+ @IBOutlet weak var btnSelectPlanNewBankAccountView: UIButton!
324
+ @IBOutlet weak var btnSelectRecurringDateNewBankView: UIButton!
325
+
292
326
  //Crypto
293
327
  @IBOutlet weak var viewCrypto: UIView!
294
328
  @IBOutlet weak var viewCryptoTryAgain: UIView!
@@ -413,30 +447,190 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
413
447
 
414
448
  private var isErrorScreenPresented = false
415
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
+
416
459
  //MARK: - View Did Load
417
460
  override func viewDidLoad() {
418
461
  super.viewDidLoad()
419
- logOut()
420
462
 
421
- // // Then: safely start new API call
422
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
423
- self.request?.paymentIntentApi { success in
424
- if success {
425
- 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
426
548
  DispatchQueue.main.async {
427
- 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
+ }
428
629
  }
429
- // Continue flow
430
- } else {
431
- print("Payment Intent failed")
432
- // Handle failure
433
630
  }
434
631
  }
435
632
  }
436
633
 
437
-
438
-
439
-
440
634
  viewAppearanceOn()
441
635
 
442
636
  uiFinishingTouchElements()
@@ -618,6 +812,23 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
618
812
 
619
813
  }
620
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
+
621
832
  //MARK: - View Wiil Appear
622
833
  override func viewWillAppear(_ animated: Bool) {
623
834
  uiFinishingTouchElements()
@@ -651,59 +862,270 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
651
862
  self.viewCrypto.isHidden = true
652
863
 
653
864
  if request.is_recurring == true {
654
- self.txtFieldChosePlanCard.isHidden = false
655
- if request.recurringStartDateType == .custom {
656
- self.txtFieldStartDateCard.isHidden = false
657
- self.txtFieldSelectDateSingleSavedCard.isHidden = false
658
- self.txtFieldSelectDateNewCardView.isHidden = false
659
- self.txtFieldSelectDateViewBankFields.isHidden = false
660
- self.txtFieldSelectDateSingleSavedBankView.isHidden = false
661
- self.txtFieldSelectDateNewAccountView.isHidden = false
662
- self.txtFieldSelectDateGrailPayBankView.isHidden = false
663
- self.txtFieldSelectDateNewGrailPayBankView.isHidden = false
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
664
874
 
665
- if request.saveAccount == false {
666
- self.heightViewBankFields.constant = 802
667
- self.heightViewNewAccountFields.constant = 852
668
- } else {
669
- self.heightViewBankFields.constant = 848
670
- self.heightViewNewAccountFields.constant = 902
671
- }
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
672
880
 
673
- if request.saveCard == false {
674
- self.heightViewNewCardFields.constant = 595
675
- } else {
676
- self.heightViewNewCardFields.constant = 648
677
- }
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
678
898
 
679
- self.heightSubViewNewAccountFields.constant = 872
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
680
916
  } else {
681
- self.txtFieldStartDateCard.isHidden = true
682
- self.txtFieldSelectDateSingleSavedCard.isHidden = true
683
- self.txtFieldSelectDateNewCardView.isHidden = true
684
- self.txtFieldSelectDateViewBankFields.isHidden = true
685
- self.txtFieldSelectDateSingleSavedBankView.isHidden = true
686
- self.txtFieldSelectDateNewAccountView.isHidden = true
687
- self.txtFieldSelectDateGrailPayBankView.isHidden = true
688
- self.txtFieldSelectDateNewGrailPayBankView.isHidden = true
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
689
923
 
690
- if request.saveAccount == false {
691
- self.heightViewBankFields.constant = 712
692
- self.heightViewNewAccountFields.constant = 754
693
- } else {
694
- self.heightViewBankFields.constant = 752
695
- self.heightViewNewAccountFields.constant = 808
696
- }
924
+ self.btnChosePlanSingleSavedCard.isEnabled = true
925
+ self.txtFieldSelectPlanSingleSavedCard.isUserInteractionEnabled = true
926
+ self.txtFieldSelectPlanSingleSavedCard.isEnabled = true
927
+ self.txtFieldSelectPlanSingleSavedCard.text = ""
928
+ self.DropDownIconSingleSavedCard.isHidden = false
697
929
 
698
- if request.saveCard == false {
699
- self.heightViewNewCardFields.constant = 500
700
- } else {
701
- self.heightViewNewCardFields.constant = 553
702
- }
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
703
1045
 
704
- self.heightSubViewNewAccountFields.constant = 757
1046
+ self.btnSelectRecurringDateNewBankView.isEnabled = true
1047
+ self.txtFieldSelectDateNewAccountView.isUserInteractionEnabled = true
1048
+ self.txtFieldSelectDateNewAccountView.isEnabled = true
705
1049
  }
706
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
707
1129
  self.txtFieldSelectPlanSingleSavedCard.isHidden = false
708
1130
  self.txtFieldSelectPlanNewCardView.isHidden = false
709
1131
  self.txtFieldSelectPlanViewBankFields.isHidden = false
@@ -795,12 +1217,13 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
795
1217
  btnNextTopCon.constant = 0
796
1218
  if request.is_recurring == true {
797
1219
  txtFieldSelectPlanSingleSavedCard.isHidden = false
798
- if request.recurringStartDateType == .custom {
799
- txtFieldSelectDateSingleSavedCard.isHidden = false
800
- }
801
- else {
802
- txtFieldSelectDateSingleSavedCard.isHidden = true
803
- }
1220
+ txtFieldSelectDateSingleSavedCard.isHidden = false
1221
+ // if request.recurringStartDateType == .custom {
1222
+ // txtFieldSelectDateSingleSavedCard.isHidden = false
1223
+ // }
1224
+ // else {
1225
+ // txtFieldSelectDateSingleSavedCard.isHidden = true
1226
+ // }
804
1227
  }
805
1228
  else {
806
1229
  txtFieldSelectPlanSingleSavedCard.isHidden = true
@@ -885,12 +1308,13 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
885
1308
  self.btnPayNowSingleAccountView.isHidden = false
886
1309
  if request.is_recurring == true {
887
1310
  self.txtFieldSelectPlanSingleSavedBankView.isHidden = false
888
- if request.recurringStartDateType == .custom {
889
- self.txtFieldSelectDateSingleSavedBankView.isHidden = false
890
- }
891
- else {
892
- self.txtFieldSelectDateSingleSavedBankView.isHidden = true
893
- }
1311
+ self.txtFieldSelectDateSingleSavedBankView.isHidden = false
1312
+ // if request.recurringStartDateType == .custom {
1313
+ // self.txtFieldSelectDateSingleSavedBankView.isHidden = false
1314
+ // }
1315
+ // else {
1316
+ // self.txtFieldSelectDateSingleSavedBankView.isHidden = true
1317
+ // }
894
1318
  }
895
1319
  else {
896
1320
  self.txtFieldSelectPlanSingleSavedBankView.isHidden = true
@@ -944,12 +1368,12 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
944
1368
  self.viewBtnShowSavedCardHeight.constant = 0
945
1369
  self.viewBtnShowSavedCardTopCon.constant = 0
946
1370
  }
947
- // else {
948
- // self.viewBtnShowSavedCards.isHidden = false
949
- // self.lblBtnShowSaveCard.text = "Show Saved Accounts"
950
- // self.viewBtnShowSavedCardHeight.constant = 50
951
- // self.viewBtnShowSavedCardTopCon.constant = 20
952
- // }
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
+ // }
953
1377
 
954
1378
  self.OTPView.isHidden = true
955
1379
  self.emailView.isHidden = true
@@ -1818,16 +2242,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
1818
2242
  }
1819
2243
 
1820
2244
  @IBAction func actionBtnSelectPlanViewBankFields(_ sender: UIButton) {
1821
- guard var plans = request?.recurringIntervals, !plans.isEmpty else {
2245
+ guard let plans = request?.recurringIntervals, !plans.isEmpty else {
1822
2246
  print("No recurring intervals available.")
1823
2247
  return
1824
2248
  }
1825
2249
 
1826
- // Check if current payment method is only Bank
1827
- if request?.selectedPaymentMethods.contains(.Bank) == true {
1828
- // Remove 'daily' from plans
1829
- plans.removeAll { $0 == .daily }
1830
- }
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
+ // }
1831
2255
 
1832
2256
  // Now present the filtered plans
1833
2257
  PlanSelector.presentPlanOptions(from: self, sourceView: sender, allowedPlans: plans) { selectedPlan in
@@ -1844,16 +2268,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
1844
2268
  }
1845
2269
 
1846
2270
  @IBAction func actionBtnSelectPlanSingleSavedAccount(_ sender: UIButton) {
1847
- guard var plans = request?.recurringIntervals, !plans.isEmpty else {
2271
+ guard let plans = request?.recurringIntervals, !plans.isEmpty else {
1848
2272
  print("No recurring intervals available.")
1849
2273
  return
1850
2274
  }
1851
2275
 
1852
- // Check if current payment method is only Bank
1853
- if request?.selectedPaymentMethods.contains(.Bank) == true {
1854
- // Remove 'daily' from plans
1855
- plans.removeAll { $0 == .daily }
1856
- }
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
+ // }
1857
2281
 
1858
2282
  PlanSelector.presentPlanOptions(from: self, sourceView: sender, allowedPlans: plans) { selectedPlan in
1859
2283
  self.txtFieldSelectPlanSingleSavedBankView.text = selectedPlan
@@ -1869,16 +2293,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
1869
2293
  }
1870
2294
 
1871
2295
  @IBAction func actionBtnSelectPlanNewAccountView(_ sender: UIButton) {
1872
- guard var plans = request?.recurringIntervals, !plans.isEmpty else {
2296
+ guard let plans = request?.recurringIntervals, !plans.isEmpty else {
1873
2297
  print("No recurring intervals available.")
1874
2298
  return
1875
2299
  }
1876
2300
 
1877
- // Check if current payment method is only Bank
1878
- if request?.selectedPaymentMethods.contains(.Bank) == true {
1879
- // Remove 'daily' from plans
1880
- plans.removeAll { $0 == .daily }
1881
- }
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
+ // }
1882
2306
 
1883
2307
  PlanSelector.presentPlanOptions(from: self, sourceView: sender, allowedPlans: plans) { selectedPlan in
1884
2308
  self.txtFieldSelectPlanNewAccountView.text = selectedPlan
@@ -1971,11 +2395,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
1971
2395
  btnNextHeight.constant = 0
1972
2396
  btnNextTopCon.constant = isSelectForPay ? 0 : 8
1973
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
+
1974
2404
  // Handle recurring fields visibility
1975
2405
  let showRecurringFields = isSelectForPay && request.is_recurring == true
1976
- let isCustomRecurring = request.recurringStartDateType == .custom
1977
2406
  txtFieldSelectPlanSingleSavedCard.isHidden = !showRecurringFields
1978
- txtFieldSelectDateSingleSavedCard.isHidden = !(showRecurringFields && isCustomRecurring)
2407
+ txtFieldSelectDateSingleSavedCard.isHidden = !showRecurringFields // Show for both .custom and .fixed
1979
2408
 
1980
2409
  // Set selected card based on tapped index
1981
2410
  if isSelectForPay, index < savedCards.count {
@@ -2382,16 +2811,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2382
2811
  }
2383
2812
 
2384
2813
  @IBAction func actionBtnChosePlanGrailPayBankView(_ sender: UIButton) {
2385
- guard var plans = request?.recurringIntervals, !plans.isEmpty else {
2814
+ guard let plans = request?.recurringIntervals, !plans.isEmpty else {
2386
2815
  print("No recurring intervals available.")
2387
2816
  return
2388
2817
  }
2389
2818
 
2390
- // Check if current payment method is only Bank
2391
- if request?.selectedPaymentMethods.contains(.Bank) == true {
2392
- // Remove 'daily' from plans
2393
- plans.removeAll { $0 == .daily }
2394
- }
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
+ // }
2395
2824
 
2396
2825
  PlanSelector.presentPlanOptions(from: self, sourceView: sender, allowedPlans: plans) { selectedPlan in
2397
2826
  self.txtFieldChosePlanGrailPayBankView.text = selectedPlan
@@ -2407,16 +2836,16 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2407
2836
  }
2408
2837
 
2409
2838
  @IBAction func actionBtnSelectPlanNewGrailPayBankView(_ sender: UIButton) {
2410
- guard var plans = request?.recurringIntervals, !plans.isEmpty else {
2839
+ guard let plans = request?.recurringIntervals, !plans.isEmpty else {
2411
2840
  print("No recurring intervals available.")
2412
2841
  return
2413
2842
  }
2414
2843
 
2415
- // Check if current payment method is only Bank
2416
- if request?.selectedPaymentMethods.contains(.Bank) == true {
2417
- // Remove 'daily' from plans
2418
- plans.removeAll { $0 == .daily }
2419
- }
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
+ // }
2420
2849
 
2421
2850
  PlanSelector.presentPlanOptions(from: self, sourceView: sender, allowedPlans: plans) { selectedPlan in
2422
2851
  self.txtFieldChosePlanNewGrailPayBankView.text = selectedPlan
@@ -2447,12 +2876,8 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2447
2876
  uRLRequest.httpMethod = "POST"
2448
2877
  uRLRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
2449
2878
 
2450
- // Add API headers
2451
- if let apiKey = EnvironmentConfig.apiKey,
2452
- let apiSecret = EnvironmentConfig.apiSecret {
2453
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
2454
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
2455
- }
2879
+ let token = UserStoreSingleton.shared.clientToken ?? ""
2880
+ uRLRequest.addValue(token, forHTTPHeaderField: "clientToken")
2456
2881
 
2457
2882
  // Prepare parameters
2458
2883
  let params: [String: Any] = [
@@ -2525,12 +2950,13 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2525
2950
 
2526
2951
  if self.request.is_recurring == true {
2527
2952
  self.txtFieldChosePlanGrailPayBankView.isHidden = false
2528
- if self.request.recurringStartDateType == .custom {
2529
- self.txtFieldSelectDateGrailPayBankView.isHidden = false
2530
- }
2531
- else {
2532
- self.txtFieldSelectDateGrailPayBankView.isHidden = true
2533
- }
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
+ // }
2534
2960
  }
2535
2961
 
2536
2962
  if let accountNumber = account["account_number"] as? String {
@@ -2593,12 +3019,8 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2593
3019
  request.httpMethod = "POST"
2594
3020
  request.addValue("application/json", forHTTPHeaderField: "Content-Type")
2595
3021
 
2596
- // Add API headers
2597
- if let apiKey = EnvironmentConfig.apiKey,
2598
- let apiSecret = EnvironmentConfig.apiSecret {
2599
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
2600
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
2601
- }
3022
+ let token = UserStoreSingleton.shared.clientToken ?? ""
3023
+ request.addValue(token, forHTTPHeaderField: "clientToken")
2602
3024
 
2603
3025
  // Save customer_id for use in charge API
2604
3026
  let customerID = UserStoreSingleton.shared.customerId ?? ""
@@ -2680,12 +3102,13 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
2680
3102
 
2681
3103
  if self.request.is_recurring == true {
2682
3104
  self.txtFieldChosePlanNewGrailPayBankView.isHidden = false
2683
- if self.request.recurringStartDateType == .custom {
2684
- self.txtFieldSelectDateNewGrailPayBankView.isHidden = false
2685
- }
2686
- else {
2687
- self.txtFieldSelectDateNewGrailPayBankView.isHidden = true
2688
- }
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
+ // }
2689
3112
  }
2690
3113
 
2691
3114
  if let accountNumber = account["account_number"] as? String {
@@ -3119,71 +3542,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
3119
3542
  }
3120
3543
  }
3121
3544
 
3122
- // func launchGrailPay() {
3123
- // guard let grailPayParams = request.grailPayParams else {
3124
- // print("GrailPay parameters not available in request")
3125
- // return
3126
- // }
3127
- //
3128
- // GrailPayHelper.presentGrailPay(from: self, request: grailPayParams) { [weak self] result in
3129
- // guard let self = self else { return }
3130
- //
3131
- // switch result.type {
3132
- // case .success:
3133
- // if let chargeData = result.chargeData,
3134
- // let dataArray = chargeData["data"] as? [[String: Any]],
3135
- // let selectedAccount = dataArray.first {
3136
- //
3137
- // print("✅ Bank connected: \(selectedAccount)")
3138
- // self.selectedGrailPayAccountType = selectedAccount["account_type"] as? String
3139
- // self.selectedGrailPayAccountName = selectedAccount["name"] as? String
3140
- //
3141
- // if self.grailPaySource == .existingAccount {
3142
- // self.accountConnectApi(account: selectedAccount)
3143
- // self.lblGrailPayAabandonError.text = "Default account successfully set"
3144
- // self.viewGrailPayAbandon.isHidden = false
3145
- // } else if self.grailPaySource == .newAccount {
3146
- // self.newGrailPayAccountConnectApi(account: selectedAccount)
3147
- // self.lblAbandonGrailPayNewAccountView.text = "Default account successfully set"
3148
- // self.viewAbandonGrailPayNewAccountView.isHidden = false
3149
- //
3150
- // self.selectedNewGrailPayAccountType = selectedAccount["account_type"] as? String
3151
- // self.selectedNewGrailPayAccountName = selectedAccount["name"] as? String
3152
- // }
3153
- //
3154
- // if self.selectedPaymentMethod == "Bank" {
3155
- // self.viewBtnShowSavedCards.isHidden = true
3156
- // }
3157
- //
3158
- // let amountText = String(format: "$%.2f", self.request.amount ?? 0)
3159
- // let submitText = self.request.submitButtonText
3160
- // let defaultTitle = (submitText?.isEmpty == false)
3161
- // ? "\(submitText!) (\(amountText))"
3162
- // : "Pay Now (\(amountText))"
3163
- //
3164
- // if self.grailPaySource == .existingAccount {
3165
- // self.btnLinkBankAccount.setTitle(defaultTitle, for: .normal)
3166
- // } else if self.grailPaySource == .newAccount {
3167
- // self.btnLinkGrailPayAddNewAccount.setTitle(defaultTitle, for: .normal)
3168
- // }
3169
- //
3170
- // } else {
3171
- // print("⚠️ chargeData does not contain valid account data")
3172
- // self.showGrailPayError(message: "Failed to retrieve account info")
3173
- // }
3174
- //
3175
- // case .cancelled:
3176
- // print("⚠️ GrailPay cancelled")
3177
- // self.showGrailPayError(message: "User has abandoned the action")
3178
- //
3179
- // case .error:
3180
- // let errorMsg = result.error?.localizedDescription ?? "Unknown error"
3181
- // print("❌ GrailPay error: \(errorMsg)")
3182
- // self.showGrailPayError(message: errorMsg)
3183
- // }
3184
- // }
3185
- // }
3186
-
3187
3545
  func launchGrailPay() {
3188
3546
  guard let grailPayParams = request.grailPayParams else {
3189
3547
  print("GrailPay parameters not available in request")
@@ -3307,13 +3665,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
3307
3665
  print("Setting clientToken header: \(token ?? "None")")
3308
3666
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
3309
3667
 
3310
- if let apiKey = EnvironmentConfig.apiKey {
3311
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "X-Api-Key")
3312
- }
3313
- if let apiSecret = EnvironmentConfig.apiSecret {
3314
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "X-Api-Secret")
3315
- }
3316
-
3317
3668
  var params: [String: Any] = [
3318
3669
  "account_id": self.grailPayAccountID ?? "",
3319
3670
  "account_type": self.selectedGrailPayAccountType ?? "",
@@ -3520,13 +3871,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
3520
3871
  print("Setting clientToken header: \(token ?? "None")")
3521
3872
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
3522
3873
 
3523
- if let apiKey = EnvironmentConfig.apiKey {
3524
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "X-Api-Key")
3525
- }
3526
- if let apiSecret = EnvironmentConfig.apiSecret {
3527
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "X-Api-Secret")
3528
- }
3529
-
3530
3874
  let emailText = txtFieldEmailGrailPayView.text
3531
3875
  let emailPrefix = emailText.components(separatedBy: "@").first ?? ""
3532
3876
 
@@ -3750,13 +4094,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
3750
4094
  print("Setting clientToken header: \(token ?? "None")")
3751
4095
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
3752
4096
 
3753
- if let apiKey = EnvironmentConfig.apiKey {
3754
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "X-Api-Key")
3755
- }
3756
- if let apiSecret = EnvironmentConfig.apiSecret {
3757
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "X-Api-Secret")
3758
- }
3759
-
3760
4097
  var params: [String: Any] = [
3761
4098
  "account_id": self.newGrailPayAccountID ?? "",
3762
4099
  "account_type": self.selectedNewGrailPayAccountType ?? "",
@@ -3972,13 +4309,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
3972
4309
  print("Setting clientToken header: \(token ?? "None")")
3973
4310
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
3974
4311
 
3975
- if let apiKey = EnvironmentConfig.apiKey {
3976
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "X-Api-Key")
3977
- }
3978
- if let apiSecret = EnvironmentConfig.apiSecret {
3979
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "X-Api-Secret")
3980
- }
3981
-
3982
4312
  var params: [String: Any] = [
3983
4313
  "account_id": selectedbankAccounts?.account_id ?? "",
3984
4314
  "customer": selectedbankAccounts?.customer_id ?? "",
@@ -4842,7 +5172,7 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
4842
5172
  }
4843
5173
  }
4844
5174
  }
4845
-
5175
+
4846
5176
  @IBAction func actionBtnCloseSettingView(_ sender: UIButton) {
4847
5177
  settingsView.isHidden = true
4848
5178
  }
@@ -5422,13 +5752,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
5422
5752
  print("Setting clientToken header: \(token ?? "None")")
5423
5753
  request.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
5424
5754
 
5425
- // Add API headers
5426
- if let apiKey = EnvironmentConfig.apiKey,
5427
- let apiSecret = EnvironmentConfig.apiSecret {
5428
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
5429
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
5430
- }
5431
-
5432
5755
  // Define the parameters for the request
5433
5756
  let params: [String: Any] = [
5434
5757
  "card_search_value": txtFieldEmail.text ?? "",
@@ -5509,13 +5832,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
5509
5832
  print("Setting clientToken header: \(token ?? "None")")
5510
5833
  urlRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
5511
5834
 
5512
- // Add API headers
5513
- if let apiKey = EnvironmentConfig.apiKey,
5514
- let apiSecret = EnvironmentConfig.apiSecret {
5515
- urlRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
5516
- urlRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
5517
- }
5518
-
5519
5835
  // Safe access from main thread (assumes you call this from main thread)
5520
5836
  let email = self.txtFieldEmail.text ?? ""
5521
5837
  let otp = getCombinedOTP()
@@ -5667,13 +5983,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
5667
5983
  print("🔑 Setting customerToken header: \(token ?? "None")")
5668
5984
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Customer-Token")
5669
5985
 
5670
- // Add API headers
5671
- if let apiKey = EnvironmentConfig.apiKey,
5672
- let apiSecret = EnvironmentConfig.apiSecret {
5673
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
5674
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
5675
- }
5676
-
5677
5986
  let session = URLSession.shared
5678
5987
  let task = session.dataTask(with: uRLRequest) { [weak self] (data, response, error) in
5679
5988
  guard let self = self else { return }
@@ -5769,9 +6078,10 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
5769
6078
 
5770
6079
  if self.request.is_recurring == true {
5771
6080
  self.txtFieldSelectPlanSingleSavedCard.isHidden = false
5772
- if self.request.recurringStartDateType == .custom {
5773
- self.txtFieldSelectDateSingleSavedCard.isHidden = false
5774
- }
6081
+ self.txtFieldSelectDateSingleSavedCard.isHidden = false
6082
+ // if self.request.recurringStartDateType == .custom {
6083
+ // self.txtFieldSelectDateSingleSavedCard.isHidden = false
6084
+ // }
5775
6085
  } else {
5776
6086
  self.txtFieldSelectPlanSingleSavedCard.isHidden = true
5777
6087
  self.txtFieldSelectDateSingleSavedCard.isHidden = true
@@ -6531,13 +6841,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
6531
6841
  print("Setting clientToken header: \(token ?? "None")")
6532
6842
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
6533
6843
 
6534
- // Add API headers
6535
- if let apiKey = EnvironmentConfig.apiKey,
6536
- let apiSecret = EnvironmentConfig.apiSecret {
6537
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
6538
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
6539
- }
6540
-
6541
6844
  let emailPrefix = UserStoreSingleton.shared.verificationEmail?.components(separatedBy: "@").first ?? ""
6542
6845
 
6543
6846
  var params: [String: Any] = [
@@ -6950,13 +7253,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
6950
7253
  print("Setting customerToken header: \(token ?? "None")")
6951
7254
  request.addValue(token ?? "", forHTTPHeaderField: "Customer-Token")
6952
7255
 
6953
- // Add API headers
6954
- if let apiKey = EnvironmentConfig.apiKey,
6955
- let apiSecret = EnvironmentConfig.apiSecret {
6956
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
6957
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
6958
- }
6959
-
6960
7256
  // Get the text fields from the selected cell and trim whitespace
6961
7257
  let nameText = txtFieldNameOnCardUpdateCardView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
6962
7258
  let cvvText = txtFieldCVVUpdateCardView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
@@ -7117,14 +7413,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7117
7413
  print("Customer-Token is nil")
7118
7414
  }
7119
7415
 
7120
- // Add API headers
7121
- if let apiKey = EnvironmentConfig.apiKey {
7122
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
7123
- }
7124
- if let apiSecret = EnvironmentConfig.apiSecret {
7125
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
7126
- }
7127
-
7128
7416
  let session = URLSession.shared
7129
7417
  let task = session.dataTask(with: request) { [weak self] data, response, error in
7130
7418
  guard let self = self else { return }
@@ -7312,11 +7600,12 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7312
7600
 
7313
7601
  if self.request.is_recurring == true {
7314
7602
  self.txtFieldSelectPlanSingleSavedBankView.isHidden = false
7315
- if self.request.recurringStartDateType == .custom {
7316
- self.txtFieldSelectDateSingleSavedBankView.isHidden = false
7317
- } else {
7318
- self.txtFieldSelectDateSingleSavedBankView.isHidden = true
7319
- }
7603
+ self.txtFieldSelectDateSingleSavedBankView.isHidden = false
7604
+ // if self.request.recurringStartDateType == .custom {
7605
+ // self.txtFieldSelectDateSingleSavedBankView.isHidden = false
7606
+ // } else {
7607
+ // self.txtFieldSelectDateSingleSavedBankView.isHidden = true
7608
+ // }
7320
7609
  }
7321
7610
  else {
7322
7611
  self.txtFieldSelectPlanSingleSavedBankView.isHidden = true
@@ -7371,13 +7660,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7371
7660
  print("Setting clientToken header: \(token ?? "None")")
7372
7661
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
7373
7662
 
7374
- // Add API headers
7375
- if let apiKey = EnvironmentConfig.apiKey,
7376
- let apiSecret = EnvironmentConfig.apiSecret {
7377
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
7378
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
7379
- }
7380
-
7381
7663
  var params: [String: Any] = [
7382
7664
  "name": txtFieldAccountName.text ?? "",
7383
7665
  "email": txtFieldEmailAccountView.text,
@@ -7387,7 +7669,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7387
7669
  "routing_number": txtFieldRoutingNumber.text?.replacingOccurrences(of: " ", with: "") ?? "",
7388
7670
  "account_number": txtFieldAccountNumber.text?.replacingOccurrences(of: " ", with: "") ?? "",
7389
7671
  "payment_mode": "auth_and_capture",
7390
- "payment_intent": UserStoreSingleton.shared.paymentIntent ?? "",
7391
7672
  "levelIndicator": 1,
7392
7673
  "payment_method": "ach"
7393
7674
  ]
@@ -7558,13 +7839,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7558
7839
  print("Setting clientToken header: \(token ?? "None")")
7559
7840
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
7560
7841
 
7561
- // Add API headers
7562
- if let apiKey = EnvironmentConfig.apiKey,
7563
- let apiSecret = EnvironmentConfig.apiSecret {
7564
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
7565
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
7566
- }
7567
-
7568
7842
  var params: [String: Any] = [
7569
7843
  "name": !(request.name?.isEmpty ?? true) ? request.name! : (txtFieldAccountName.text ?? ""),
7570
7844
  "email": txtFieldEmailAccountView.text,
@@ -7574,7 +7848,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7574
7848
  "routing_number": txtFieldRoutingNumber.text?.replacingOccurrences(of: " ", with: "") ?? "",
7575
7849
  "account_number": txtFieldAccountNumber.text?.replacingOccurrences(of: " ", with: "") ?? "",
7576
7850
  "payment_mode": "auth_and_capture",
7577
- "payment_intent": UserStoreSingleton.shared.paymentIntent ?? "",
7578
7851
  "levelIndicator": 1,
7579
7852
  "payment_method": "ach"
7580
7853
  ]
@@ -7801,13 +8074,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7801
8074
  print("Setting clientToken header: \(token ?? "None")")
7802
8075
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
7803
8076
 
7804
- // Add API headers
7805
- if let apiKey = EnvironmentConfig.apiKey,
7806
- let apiSecret = EnvironmentConfig.apiSecret {
7807
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
7808
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
7809
- }
7810
-
7811
8077
  var params: [String: Any] = [
7812
8078
  "account_id": selectedbankAccounts?.account_id ?? "",
7813
8079
  "customer": selectedbankAccounts?.customer_id ?? "",
@@ -7966,13 +8232,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
7966
8232
  print("Setting clientToken header: \(token ?? "None")")
7967
8233
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
7968
8234
 
7969
- // Add API headers
7970
- if let apiKey = EnvironmentConfig.apiKey,
7971
- let apiSecret = EnvironmentConfig.apiSecret {
7972
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
7973
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
7974
- }
7975
-
7976
8235
  var params: [String: Any] = [
7977
8236
  "account_id": selectedbankAccounts?.account_id ?? "",
7978
8237
  "customer": selectedbankAccounts?.customer_id ?? "",
@@ -8186,13 +8445,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8186
8445
  print("Setting clientToken header: \(token ?? "None")")
8187
8446
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
8188
8447
 
8189
- // Add API headers
8190
- if let apiKey = EnvironmentConfig.apiKey,
8191
- let apiSecret = EnvironmentConfig.apiSecret {
8192
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
8193
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
8194
- }
8195
-
8196
8448
  let accountName = txtFieldAccountNameNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
8197
8449
  let routingNumber = txtFieldRoutingNumberNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
8198
8450
  let accountType = txtFieldAccountTypeNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
@@ -8208,7 +8460,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8208
8460
  "routing_number": routingNumber,
8209
8461
  "account_number": accountNumber,
8210
8462
  "payment_mode": "auth_and_capture",
8211
- "payment_intent": UserStoreSingleton.shared.paymentIntent ?? "",
8212
8463
  "levelIndicator": 1,
8213
8464
  ]
8214
8465
 
@@ -8361,13 +8612,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8361
8612
  print("Setting clientToken header: \(token ?? "None")")
8362
8613
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
8363
8614
 
8364
- // Add API headers
8365
- if let apiKey = EnvironmentConfig.apiKey,
8366
- let apiSecret = EnvironmentConfig.apiSecret {
8367
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
8368
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
8369
- }
8370
-
8371
8615
  let accountName = txtFieldAccountNameNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
8372
8616
  let routingNumber = txtFieldRoutingNumberNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
8373
8617
  let accountType = txtFieldAccountTypeNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
@@ -8382,7 +8626,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8382
8626
  "routing_number": routingNumber,
8383
8627
  "account_number": accountNumber,
8384
8628
  "payment_mode": "auth_and_capture",
8385
- "payment_intent": UserStoreSingleton.shared.paymentIntent ?? "",
8386
8629
  "levelIndicator": 1,
8387
8630
  ]
8388
8631
 
@@ -8590,13 +8833,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8590
8833
  print("Setting clientToken header: \(token ?? "None")")
8591
8834
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
8592
8835
 
8593
- // Add API headers
8594
- if let apiKey = EnvironmentConfig.apiKey,
8595
- let apiSecret = EnvironmentConfig.apiSecret {
8596
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
8597
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
8598
- }
8599
-
8600
8836
  // Retrieve and trim text field values (removing leading and trailing whitespace)
8601
8837
  let accountName = txtFieldAccountNameNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
8602
8838
  let routingNumber = txtFieldRoutingNumberNewAccountView.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
@@ -8614,7 +8850,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8614
8850
  "routing_number": routingNumber,
8615
8851
  "account_number": accountNumber,
8616
8852
  "payment_mode": "auth_and_capture",
8617
- "payment_intent": UserStoreSingleton.shared.paymentIntent ?? "",
8618
8853
  "levelIndicator": 1,
8619
8854
  "save_account": 1,
8620
8855
  "payment_method": "ach"
@@ -8774,13 +9009,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8774
9009
  print("Setting customerToken header: \(token ?? "None")")
8775
9010
  request.addValue(token ?? "", forHTTPHeaderField: "Customer-Token")
8776
9011
 
8777
- // Add API headers
8778
- if let apiKey = EnvironmentConfig.apiKey,
8779
- let apiSecret = EnvironmentConfig.apiSecret {
8780
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
8781
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
8782
- }
8783
-
8784
9012
  let session = URLSession.shared
8785
9013
  let task = session.dataTask(with: request) { [weak self] (serviceData, serviceResponse, error) in
8786
9014
  guard let self = self else { return }
@@ -8856,13 +9084,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
8856
9084
  print("Setting clientToken header: \(token ?? "None")")
8857
9085
  urlRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
8858
9086
 
8859
- // Add API headers
8860
- if let apiKey = EnvironmentConfig.apiKey,
8861
- let apiSecret = EnvironmentConfig.apiSecret {
8862
- urlRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
8863
- urlRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
8864
- }
8865
-
8866
9087
  var params: [String: Any] = [
8867
9088
  "name": UserStoreSingleton.shared.merchantName ?? "",
8868
9089
  "email": UserStoreSingleton.shared.merchantEmail ?? "",
@@ -9009,13 +9230,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
9009
9230
  print("Setting clientToken header: \(token ?? "None")")
9010
9231
  request.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
9011
9232
 
9012
- // Add API headers
9013
- if let apiKey = EnvironmentConfig.apiKey,
9014
- let apiSecret = EnvironmentConfig.apiSecret {
9015
- request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
9016
- request.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
9017
- }
9018
-
9019
9233
  let session = URLSession.shared
9020
9234
  let task = session.dataTask(with: request) { [weak self] (data, response, error) in
9021
9235
  guard let self = self else { return }
@@ -9075,13 +9289,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
9075
9289
  print("Setting clientToken header: \(token ?? "None")")
9076
9290
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
9077
9291
 
9078
- // Add API headers
9079
- if let apiKey = EnvironmentConfig.apiKey,
9080
- let apiSecret = EnvironmentConfig.apiSecret {
9081
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
9082
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
9083
- }
9084
-
9085
9292
  var params: [String: Any] = [
9086
9293
  "name": cardNameTextField.text,
9087
9294
  "email": txtFieldEmailCardView.text,
@@ -9390,13 +9597,6 @@ class PaymentInfoVC: BaseVC, BillingInfoVCDelegate {
9390
9597
  print("Setting clientToken header: \(token ?? "None")")
9391
9598
  uRLRequest.addValue(token ?? "", forHTTPHeaderField: "Client-Token")
9392
9599
 
9393
- // Add API headers
9394
- if let apiKey = EnvironmentConfig.apiKey,
9395
- let apiSecret = EnvironmentConfig.apiSecret {
9396
- uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
9397
- uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
9398
- }
9399
-
9400
9600
  var params: [String: Any] = [
9401
9601
  "name": nameText,
9402
9602
  "email": UserStoreSingleton.shared.verificationEmail ?? "",
@@ -9765,9 +9965,10 @@ extension PaymentInfoVC: UICollectionViewDelegate, UICollectionViewDataSource, U
9765
9965
  self.btnNextTopCon.constant = 0
9766
9966
  if self.request.is_recurring == true {
9767
9967
  self.txtFieldSelectPlanSingleSavedCard.isHidden = false
9768
- if request.recurringStartDateType == .custom {
9769
- self.txtFieldSelectDateSingleSavedCard.isHidden = false
9770
- }
9968
+ self.txtFieldSelectDateSingleSavedCard.isHidden = false
9969
+ // if request.recurringStartDateType == .custom {
9970
+ // self.txtFieldSelectDateSingleSavedCard.isHidden = false
9971
+ // }
9771
9972
  }
9772
9973
  else {
9773
9974
  self.txtFieldSelectPlanSingleSavedCard.isHidden = true
@@ -11024,3 +11225,4 @@ extension PaymentInfoVC: UITextFieldDelegate {
11024
11225
  }
11025
11226
 
11026
11227
  }
11228
+