@jimrising/easymerchantsdk-react-native 1.9.3 → 1.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/ios/Classes/EasyMerchantSdk.m +5 -2
- package/ios/Classes/EasyMerchantSdk.swift +0 -1
- package/ios/Pods/ViewControllers/PaymentStatusWebViewVC.swift +167 -0
- package/ios/Pods/ViewControllers/ThreeDSecurePaymentDoneVC.swift +122 -56
- package/ios/easymerchantsdk.podspec +1 -1
- package/ios/easymerchantsdk.storyboard +84 -44
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
#import <React/RCTLog.h>
|
|
3
3
|
#import <React/RCTBridgeModule.h>
|
|
4
4
|
|
|
5
|
-
#
|
|
6
|
-
|
|
5
|
+
#if __has_include(<easymerchantsdk/easymerchantsdk-Swift.h>)
|
|
6
|
+
#import <easymerchantsdk/easymerchantsdk-Swift.h>
|
|
7
|
+
#else
|
|
8
|
+
#import "easymerchantsdk-Swift.h"
|
|
9
|
+
#endif
|
|
7
10
|
|
|
8
11
|
@interface EasyMerchantSdk ()
|
|
9
12
|
@property (nonatomic, strong) EasyMerchantSdkPlugin *sdkPluginInstance;
|
|
@@ -45,7 +45,6 @@ public class EasyMerchantSdkPlugin: NSObject, RCTBridgeModule {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
// MARK: - configureEnvironment(...) Exposed to RN
|
|
49
48
|
@objc public func configureEnvironment(_ env: String, apiKey: String, apiSecret: String) {
|
|
50
49
|
switch env.lowercased() {
|
|
51
50
|
case "production": EnvironmentConfig.setEnvironment(.production)
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
//
|
|
2
|
+
// PaymentStatusWebViewVC.swift
|
|
3
|
+
// EasyPay
|
|
4
|
+
//
|
|
5
|
+
// Created by Mony's Mac on 17/07/25.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
//import UIKit
|
|
9
|
+
//import WebKit
|
|
10
|
+
//
|
|
11
|
+
//class PaymentStatusWebViewVC: UIViewController {
|
|
12
|
+
//
|
|
13
|
+
// var urlString: String?
|
|
14
|
+
// private var webView: WKWebView!
|
|
15
|
+
//
|
|
16
|
+
// override func viewDidLoad() {
|
|
17
|
+
// super.viewDidLoad()
|
|
18
|
+
// setupWebView()
|
|
19
|
+
// loadRequestedURL()
|
|
20
|
+
// }
|
|
21
|
+
//
|
|
22
|
+
// private func setupWebView() {
|
|
23
|
+
// webView = WKWebView(frame: self.view.bounds)
|
|
24
|
+
// webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
|
25
|
+
// self.view.addSubview(webView)
|
|
26
|
+
// }
|
|
27
|
+
//
|
|
28
|
+
// private func loadRequestedURL() {
|
|
29
|
+
// guard let urlString = urlString, let url = URL(string: urlString) else {
|
|
30
|
+
// print("Invalid URL string: \(String(describing: urlString))")
|
|
31
|
+
// return
|
|
32
|
+
// }
|
|
33
|
+
// let request = URLRequest(url: url)
|
|
34
|
+
// webView.load(request)
|
|
35
|
+
// }
|
|
36
|
+
//
|
|
37
|
+
//}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
import UIKit
|
|
41
|
+
import WebKit
|
|
42
|
+
|
|
43
|
+
class PaymentStatusWebViewVC: UIViewController, WKNavigationDelegate {
|
|
44
|
+
|
|
45
|
+
var urlString: String?
|
|
46
|
+
private var webView: WKWebView!
|
|
47
|
+
private var closeButton: UIButton!
|
|
48
|
+
private var activityIndicator: UIActivityIndicatorView!
|
|
49
|
+
private var didShowCloseButton = false // 👈 Flag
|
|
50
|
+
|
|
51
|
+
override func viewDidLoad() {
|
|
52
|
+
super.viewDidLoad()
|
|
53
|
+
setupWebView()
|
|
54
|
+
setupCloseButton()
|
|
55
|
+
setupActivityIndicator()
|
|
56
|
+
loadRequestedURL()
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private func setupWebView() {
|
|
60
|
+
webView = WKWebView(frame: self.view.bounds)
|
|
61
|
+
webView.navigationDelegate = self
|
|
62
|
+
webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
|
63
|
+
self.view.addSubview(webView)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private func setupCloseButton() {
|
|
67
|
+
closeButton = UIButton(type: .system)
|
|
68
|
+
if let closeImage = UIImage(systemName: "xmark.circle.fill") {
|
|
69
|
+
closeButton.setImage(closeImage, for: .normal)
|
|
70
|
+
closeButton.tintColor = .systemGray
|
|
71
|
+
} else {
|
|
72
|
+
closeButton.setTitle("✕", for: .normal)
|
|
73
|
+
closeButton.setTitleColor(.systemGray, for: .normal)
|
|
74
|
+
closeButton.titleLabel?.font = UIFont.systemFont(ofSize: 24, weight: .bold)
|
|
75
|
+
}
|
|
76
|
+
closeButton.frame = CGRect(x: self.view.bounds.width - 50, y: 50, width: 40, height: 40)
|
|
77
|
+
closeButton.autoresizingMask = [.flexibleLeftMargin, .flexibleBottomMargin]
|
|
78
|
+
closeButton.addTarget(self, action: #selector(closeButtonTapped), for: .touchUpInside)
|
|
79
|
+
closeButton.isHidden = true
|
|
80
|
+
self.view.addSubview(closeButton)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private func setupActivityIndicator() {
|
|
84
|
+
activityIndicator = UIActivityIndicatorView(style: .large)
|
|
85
|
+
activityIndicator.center = self.view.center
|
|
86
|
+
activityIndicator.hidesWhenStopped = true
|
|
87
|
+
self.view.addSubview(activityIndicator)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
private func loadRequestedURL() {
|
|
91
|
+
guard let urlString = urlString, let url = URL(string: urlString) else {
|
|
92
|
+
print("Invalid URL string: \(String(describing: urlString))")
|
|
93
|
+
return
|
|
94
|
+
}
|
|
95
|
+
let request = URLRequest(url: url)
|
|
96
|
+
webView.load(request)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@objc private func closeButtonTapped() {
|
|
100
|
+
self.navigationController?.popViewController(animated: true)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// MARK: - WKNavigationDelegate
|
|
104
|
+
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
|
|
105
|
+
print("WebView didStartProvisionalNavigation called")
|
|
106
|
+
activityIndicator.startAnimating()
|
|
107
|
+
closeButton.isHidden = true
|
|
108
|
+
didShowCloseButton = false // 👈 Reset the flag
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
|
|
112
|
+
print("WebView didFinish called")
|
|
113
|
+
if !didShowCloseButton {
|
|
114
|
+
waitForPageToBeReady()
|
|
115
|
+
} else {
|
|
116
|
+
print("Close button already shown, skipping waitForPageToBeReady")
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
|
|
121
|
+
activityIndicator.stopAnimating()
|
|
122
|
+
closeButton.isHidden = false
|
|
123
|
+
print("WebView failed with error: \(error.localizedDescription)")
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
|
|
127
|
+
activityIndicator.stopAnimating()
|
|
128
|
+
closeButton.isHidden = false
|
|
129
|
+
print("WebView failed provisional navigation: \(error.localizedDescription)")
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private func waitForPageToBeReady() {
|
|
133
|
+
webView.evaluateJavaScript("document.readyState") { [weak self] result, error in
|
|
134
|
+
guard let self = self else { return }
|
|
135
|
+
if let state = result as? String {
|
|
136
|
+
print("Page readyState:", state)
|
|
137
|
+
if state == "complete" {
|
|
138
|
+
self.checkIfPaymentUILoaded()
|
|
139
|
+
} else {
|
|
140
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
|
141
|
+
self.waitForPageToBeReady()
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private func checkIfPaymentUILoaded() {
|
|
149
|
+
guard !didShowCloseButton else { return }
|
|
150
|
+
|
|
151
|
+
// Replace '.loader' with your actual loader class or ID
|
|
152
|
+
let js = "document.querySelector('.loader') == null"
|
|
153
|
+
webView.evaluateJavaScript(js) { [weak self] result, error in
|
|
154
|
+
guard let self = self else { return }
|
|
155
|
+
if let loaded = result as? Bool, loaded == true {
|
|
156
|
+
print("Payment UI fully loaded")
|
|
157
|
+
self.activityIndicator.stopAnimating()
|
|
158
|
+
self.closeButton.isHidden = false
|
|
159
|
+
self.didShowCloseButton = true // 👈 Mark as shown
|
|
160
|
+
} else {
|
|
161
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
|
162
|
+
self.checkIfPaymentUILoaded()
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -14,7 +14,7 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
14
14
|
@IBOutlet weak var viewMain: UIView!
|
|
15
15
|
@IBOutlet weak var lblCompleteAuthentication: UILabel!
|
|
16
16
|
@IBOutlet weak var btnDone: UIButton!
|
|
17
|
-
@IBOutlet weak var lblPaymentLink: UILabel!
|
|
17
|
+
// @IBOutlet weak var lblPaymentLink: UILabel!
|
|
18
18
|
@IBOutlet weak var lblBillingInfoData: UILabel!
|
|
19
19
|
|
|
20
20
|
@IBOutlet weak var viewPaymentDetails: UIStackView!
|
|
@@ -36,6 +36,8 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
36
36
|
@IBOutlet weak var lblPaymentMethodValue: UILabel!
|
|
37
37
|
@IBOutlet weak var lblStatus: UILabel!
|
|
38
38
|
|
|
39
|
+
@IBOutlet weak var btnContinue: UIButton!
|
|
40
|
+
|
|
39
41
|
var easyPayDelegate: EasyPayViewControllerDelegate?
|
|
40
42
|
var redirectURL: String?
|
|
41
43
|
var chargeData: [String: Any] = [:]
|
|
@@ -49,7 +51,7 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
49
51
|
var apiStatusCheckTimer: Timer?
|
|
50
52
|
// New property for the 1-minute countdown
|
|
51
53
|
var oneMinuteCountdownTimer: DispatchSourceTimer?
|
|
52
|
-
var countdownRemaining: Int =
|
|
54
|
+
var countdownRemaining: Int = 150 // 120 seconds
|
|
53
55
|
|
|
54
56
|
var additionalInfoData: [FieldItem]?
|
|
55
57
|
var billingInfoData: [FieldItem]?
|
|
@@ -58,18 +60,20 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
58
60
|
// Dispatch group to wait for initial API call
|
|
59
61
|
let initialAPIGroup = DispatchGroup()
|
|
60
62
|
|
|
61
|
-
// var amount: Int?
|
|
63
|
+
// var amount: Int?
|
|
62
64
|
var amount: Double?
|
|
63
65
|
|
|
64
66
|
var cardApiParams: [String: Any]?
|
|
65
67
|
|
|
66
68
|
var request: Request!
|
|
67
69
|
|
|
70
|
+
var didTapContinue = false
|
|
71
|
+
|
|
68
72
|
override func viewDidLoad() {
|
|
69
73
|
super.viewDidLoad()
|
|
70
74
|
uiFinishingTouchElements()
|
|
71
75
|
|
|
72
|
-
setupTapOnLabel()
|
|
76
|
+
// setupTapOnLabel()
|
|
73
77
|
|
|
74
78
|
// Initially hide done image and show loading image
|
|
75
79
|
imgViewPaymentDone.isHidden = true
|
|
@@ -111,11 +115,14 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
111
115
|
if countdownRemaining > 0 {
|
|
112
116
|
imgViewLoading.isHidden = false
|
|
113
117
|
imgViewPaymentDone.isHidden = true
|
|
114
|
-
lblCompleteAuthentication.text = "Click the link below to complete 3DS Authentication.!"
|
|
118
|
+
// lblCompleteAuthentication.text = "Click the link below to complete 3DS Authentication.!"
|
|
119
|
+
if !didTapContinue {
|
|
120
|
+
lblCompleteAuthentication.text = "Tap Continue to proceed with 3D Secure authentication."
|
|
121
|
+
}
|
|
115
122
|
btnDone.isHidden = true
|
|
116
123
|
|
|
117
124
|
if apiStatusCheckTimer == nil {
|
|
118
|
-
apiStatusCheckTimer = Timer.scheduledTimer(withTimeInterval:
|
|
125
|
+
apiStatusCheckTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true) { [weak self] _ in
|
|
119
126
|
guard let self = self else { return }
|
|
120
127
|
if self.countdownRemaining > 0 {
|
|
121
128
|
self.checkThreeDSecureStatus(completion: nil)
|
|
@@ -129,9 +136,12 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
129
136
|
imgViewPaymentDone.isHidden = false
|
|
130
137
|
imgViewPaymentDone.image = UIImage(systemName: "exclamationmark.circle.fill")
|
|
131
138
|
imgViewPaymentDone.tintColor = .systemRed
|
|
132
|
-
lblCompleteAuthentication.text = "Click the link below to complete 3DS Authentication.!"
|
|
139
|
+
// lblCompleteAuthentication.text = "Click the link below to complete 3DS Authentication.!"
|
|
140
|
+
if !didTapContinue {
|
|
141
|
+
lblCompleteAuthentication.text = "Tap Continue to proceed with 3D Secure authentication."
|
|
142
|
+
}
|
|
133
143
|
btnDone.isHidden = false
|
|
134
|
-
lblPaymentLink.isHidden = false
|
|
144
|
+
// lblPaymentLink.isHidden = false
|
|
135
145
|
viewPaymentDetails.isHidden = false
|
|
136
146
|
|
|
137
147
|
apiStatusCheckTimer?.invalidate()
|
|
@@ -139,6 +149,64 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
139
149
|
}
|
|
140
150
|
}
|
|
141
151
|
|
|
152
|
+
// override func viewWillAppear(_ animated: Bool) {
|
|
153
|
+
// super.viewWillAppear(animated)
|
|
154
|
+
// uiFinishingTouchElements()
|
|
155
|
+
//
|
|
156
|
+
// // Restart rotating animation if missing
|
|
157
|
+
// if !imgViewLoading.isHidden && imgViewLoading.layer.animation(forKey: "rotationAnimation") == nil {
|
|
158
|
+
// startRotatingImage()
|
|
159
|
+
// }
|
|
160
|
+
//
|
|
161
|
+
// // Check if chargeId already exists (success)
|
|
162
|
+
// if let chargeId = (threeDSecureStatusResponse?["data"] as? [String: Any])?["charge_id"] as? String,
|
|
163
|
+
// !chargeId.isEmpty {
|
|
164
|
+
// // ✅ Charge already found - no further API checks needed
|
|
165
|
+
// return
|
|
166
|
+
// }
|
|
167
|
+
//
|
|
168
|
+
// // If user came back after tapping Continue
|
|
169
|
+
// if didTapContinue {
|
|
170
|
+
// lblCompleteAuthentication.text = "Waiting for 3DS Authentication..."
|
|
171
|
+
// btnContinue.isHidden = true
|
|
172
|
+
// imgViewLoading.isHidden = false
|
|
173
|
+
// imgViewPaymentDone.isHidden = true
|
|
174
|
+
// startRotatingImage()
|
|
175
|
+
// } else {
|
|
176
|
+
// // Initial load or user hasn’t tapped Continue yet
|
|
177
|
+
// lblCompleteAuthentication.text = "Tap Continue to proceed with 3D Secure authentication."
|
|
178
|
+
// btnContinue.isHidden = false
|
|
179
|
+
// }
|
|
180
|
+
//
|
|
181
|
+
// btnDone.isHidden = true
|
|
182
|
+
// viewPaymentDetails.isHidden = true
|
|
183
|
+
//
|
|
184
|
+
// if countdownRemaining > 0 {
|
|
185
|
+
// if apiStatusCheckTimer == nil {
|
|
186
|
+
// apiStatusCheckTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true) { [weak self] _ in
|
|
187
|
+
// guard let self = self else { return }
|
|
188
|
+
// if self.countdownRemaining > 0 {
|
|
189
|
+
// self.checkThreeDSecureStatus(completion: nil)
|
|
190
|
+
// }
|
|
191
|
+
// }
|
|
192
|
+
// }
|
|
193
|
+
// } else {
|
|
194
|
+
// // Countdown expired, stop API check
|
|
195
|
+
// apiStatusCheckTimer?.invalidate()
|
|
196
|
+
// apiStatusCheckTimer = nil
|
|
197
|
+
//
|
|
198
|
+
// imgViewLoading.layer.removeAllAnimations()
|
|
199
|
+
// imgViewLoading.isHidden = true
|
|
200
|
+
// imgViewPaymentDone.isHidden = false
|
|
201
|
+
// imgViewPaymentDone.image = UIImage(systemName: "exclamationmark.circle.fill")
|
|
202
|
+
// imgViewPaymentDone.tintColor = .systemRed
|
|
203
|
+
//
|
|
204
|
+
// lblCompleteAuthentication.text = "Tap Continue to proceed with 3D Secure authentication."
|
|
205
|
+
// btnDone.isHidden = false
|
|
206
|
+
// viewPaymentDetails.isHidden = false
|
|
207
|
+
// }
|
|
208
|
+
// }
|
|
209
|
+
|
|
142
210
|
override func viewWillDisappear(_ animated: Bool) {
|
|
143
211
|
super.viewWillDisappear(animated)
|
|
144
212
|
apiStatusCheckTimer?.invalidate()
|
|
@@ -147,15 +215,6 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
147
215
|
oneMinuteCountdownTimer = nil
|
|
148
216
|
}
|
|
149
217
|
|
|
150
|
-
// func startRotatingImage() {
|
|
151
|
-
// let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")
|
|
152
|
-
// rotationAnimation.toValue = CGFloat.pi * 2 // 360 degrees in radians
|
|
153
|
-
// rotationAnimation.duration = 1 // Adjust the duration as needed
|
|
154
|
-
// rotationAnimation.isCumulative = true
|
|
155
|
-
// rotationAnimation.repeatCount = .infinity // Continuous rotation
|
|
156
|
-
// imgViewLoading.layer.add(rotationAnimation, forKey: "rotationAnimation")
|
|
157
|
-
// }
|
|
158
|
-
|
|
159
218
|
private func showHourglassGIF() {
|
|
160
219
|
guard let bundlePath = Bundle.easyPayBundle.path(forResource: "hourglass", ofType: "gif"),
|
|
161
220
|
let gifData = try? Data(contentsOf: URL(fileURLWithPath: bundlePath)),
|
|
@@ -166,7 +225,7 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
166
225
|
|
|
167
226
|
var images: [UIImage] = []
|
|
168
227
|
var duration: Double = 0
|
|
169
|
-
|
|
228
|
+
|
|
170
229
|
let frameCount = CGImageSourceGetCount(source)
|
|
171
230
|
for i in 0..<frameCount {
|
|
172
231
|
if let cgImage = CGImageSourceCreateImageAtIndex(source, i, nil) {
|
|
@@ -175,7 +234,7 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
175
234
|
images.append(UIImage(cgImage: cgImage))
|
|
176
235
|
}
|
|
177
236
|
}
|
|
178
|
-
|
|
237
|
+
|
|
179
238
|
if !images.isEmpty {
|
|
180
239
|
let animatedImage = UIImage.animatedImage(with: images, duration: duration)
|
|
181
240
|
imgViewLoading.image = animatedImage
|
|
@@ -185,20 +244,20 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
185
244
|
|
|
186
245
|
private func getFrameDuration(from source: CGImageSource, index: Int) -> Double {
|
|
187
246
|
let defaultFrameDuration = 0.1
|
|
188
|
-
|
|
247
|
+
|
|
189
248
|
guard let properties = CGImageSourceCopyPropertiesAtIndex(source, index, nil) as? [CFString: Any],
|
|
190
249
|
let gifProperties = properties[kCGImagePropertyGIFDictionary] as? [CFString: Any] else {
|
|
191
250
|
return defaultFrameDuration
|
|
192
251
|
}
|
|
193
|
-
|
|
252
|
+
|
|
194
253
|
if let unclampedDelay = gifProperties[kCGImagePropertyGIFUnclampedDelayTime] as? Double, unclampedDelay > 0 {
|
|
195
254
|
return unclampedDelay
|
|
196
255
|
}
|
|
197
|
-
|
|
256
|
+
|
|
198
257
|
if let delay = gifProperties[kCGImagePropertyGIFDelayTime] as? Double, delay > 0 {
|
|
199
258
|
return delay
|
|
200
259
|
}
|
|
201
|
-
|
|
260
|
+
|
|
202
261
|
return defaultFrameDuration
|
|
203
262
|
}
|
|
204
263
|
|
|
@@ -206,31 +265,29 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
206
265
|
showHourglassGIF()
|
|
207
266
|
}
|
|
208
267
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
}
|
|
213
|
-
lblPaymentLink.textColor = .systemBlue
|
|
214
|
-
lblPaymentLink.isUserInteractionEnabled = true
|
|
215
|
-
|
|
216
|
-
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(linkTapped))
|
|
217
|
-
lblPaymentLink.addGestureRecognizer(tapGesture)
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
@objc private func linkTapped() {
|
|
221
|
-
guard let text = lblPaymentLink.text,
|
|
222
|
-
let url = URL(string: text),
|
|
223
|
-
UIApplication.shared.canOpenURL(url) else {
|
|
268
|
+
@IBAction func actionBtnContinue(_ sender: UIButton) {
|
|
269
|
+
guard let urlStr = redirectURL, !urlStr.isEmpty else {
|
|
270
|
+
print("Redirect URL is nil or empty")
|
|
224
271
|
return
|
|
225
272
|
}
|
|
226
|
-
|
|
273
|
+
|
|
274
|
+
didTapContinue = true
|
|
275
|
+
lblCompleteAuthentication.text = "Wating for 3DS Authentication..."
|
|
276
|
+
btnContinue.isHidden = true
|
|
277
|
+
|
|
278
|
+
let vc = easymerchantsdk.instantiateViewController(withIdentifier: "PaymentStatusWebViewVC") as! PaymentStatusWebViewVC
|
|
279
|
+
vc.urlString = urlStr // Pass the URL to WebView VC
|
|
280
|
+
self.navigationController?.pushViewController(vc, animated: true)
|
|
227
281
|
}
|
|
228
282
|
|
|
229
283
|
private func startOneMinuteCountdownAndAPICheck() {
|
|
230
284
|
startRotatingImage()
|
|
231
285
|
imgViewPaymentDone.isHidden = true
|
|
232
286
|
imgViewLoading.isHidden = false
|
|
233
|
-
lblCompleteAuthentication.text = "Click the link below to complete 3DS Authentication.!"
|
|
287
|
+
// lblCompleteAuthentication.text = "Click the link below to complete 3DS Authentication.!"
|
|
288
|
+
if !didTapContinue {
|
|
289
|
+
lblCompleteAuthentication.text = "Tap Continue to proceed with 3D Secure authentication."
|
|
290
|
+
}
|
|
234
291
|
btnDone.isHidden = true
|
|
235
292
|
|
|
236
293
|
apiStatusCheckTimer?.invalidate()
|
|
@@ -241,7 +298,7 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
241
298
|
self?.initialAPIGroup.leave()
|
|
242
299
|
}
|
|
243
300
|
|
|
244
|
-
countdownRemaining =
|
|
301
|
+
countdownRemaining = 150
|
|
245
302
|
|
|
246
303
|
oneMinuteCountdownTimer = DispatchSource.makeTimerSource(queue: .main)
|
|
247
304
|
oneMinuteCountdownTimer?.schedule(deadline: .now(), repeating: .seconds(1))
|
|
@@ -257,9 +314,12 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
257
314
|
self.imgViewLoading.layer.removeAllAnimations()
|
|
258
315
|
self.imgViewLoading.isHidden = true
|
|
259
316
|
self.imgViewPaymentDone.isHidden = false
|
|
260
|
-
self.lblCompleteAuthentication.text = "Click the link below to complete 3DS Authentication.!"
|
|
317
|
+
// self.lblCompleteAuthentication.text = "Click the link below to complete 3DS Authentication.!"
|
|
318
|
+
if !self.didTapContinue {
|
|
319
|
+
self.lblCompleteAuthentication.text = "Tap Continue to proceed with 3D Secure authentication."
|
|
320
|
+
}
|
|
261
321
|
self.btnDone.isHidden = false
|
|
262
|
-
self.lblPaymentLink.isHidden = false
|
|
322
|
+
// self.lblPaymentLink.isHidden = false
|
|
263
323
|
self.viewPaymentDetails.isHidden = false
|
|
264
324
|
|
|
265
325
|
if let json = self.threeDSecureStatusResponse,
|
|
@@ -287,7 +347,7 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
287
347
|
self.lblTransactionId.text = "\(transactionId)"
|
|
288
348
|
self.lblSubscriptionId.text = "\(subscriptionId)"
|
|
289
349
|
self.lblDate.text = "\(formattedDate)"
|
|
290
|
-
|
|
350
|
+
// self.lblTotal.text = "$\(self.amount ?? 0)"
|
|
291
351
|
let rawAmount = Double(self.request?.amount ?? 0)
|
|
292
352
|
let amountText = String(format: "$%.2f", rawAmount)
|
|
293
353
|
self.lblTotal.text = "\(amountText)"
|
|
@@ -305,33 +365,33 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
305
365
|
self.checkThreeDSecureStatus(completion: nil)
|
|
306
366
|
}
|
|
307
367
|
}
|
|
308
|
-
|
|
368
|
+
|
|
309
369
|
@IBAction func actionBtnDone(_ sender: UIButton) {
|
|
310
370
|
var resultBillingInfo: [String: Any]? = nil
|
|
311
371
|
var resultAdditionalInfo: [String: Any]? = nil
|
|
312
|
-
|
|
372
|
+
|
|
313
373
|
// Extract last 4 digits and format as ****4242
|
|
314
374
|
if let cardNumber = cardApiParams?["card_number"] as? String, cardNumber.count >= 4 {
|
|
315
375
|
let last4 = String(cardNumber.suffix(4))
|
|
316
376
|
let masked = "****\(last4)"
|
|
317
377
|
chargeData["card_number_last_4"] = masked
|
|
318
378
|
}
|
|
319
|
-
|
|
379
|
+
|
|
320
380
|
// Assign billing info if non-empty
|
|
321
381
|
if let billing = billingInfo, !billing.isEmpty {
|
|
322
382
|
resultBillingInfo = billing
|
|
323
383
|
}
|
|
324
|
-
|
|
384
|
+
|
|
325
385
|
// Combine 3DS status into additionalInfo if needed
|
|
326
386
|
var combinedAdditionalInfo = additionalInfo ?? [:]
|
|
327
387
|
if let threeDS = threeDSecureStatusResponse {
|
|
328
388
|
combinedAdditionalInfo["threeDSecureStatus"] = threeDS
|
|
329
389
|
}
|
|
330
|
-
|
|
390
|
+
|
|
331
391
|
if !combinedAdditionalInfo.isEmpty {
|
|
332
392
|
resultAdditionalInfo = combinedAdditionalInfo
|
|
333
393
|
}
|
|
334
|
-
|
|
394
|
+
|
|
335
395
|
//Pass updated chargeData with masked_card_number
|
|
336
396
|
let result = SDKResult(
|
|
337
397
|
type: .success,
|
|
@@ -339,10 +399,10 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
339
399
|
billingInfo: resultBillingInfo,
|
|
340
400
|
additionalInfo: resultAdditionalInfo
|
|
341
401
|
)
|
|
342
|
-
|
|
402
|
+
|
|
343
403
|
// Notify delegate and dismiss
|
|
344
404
|
easyPayDelegate?.easyPayController(self.navigationController as! EasyPayViewController, didFinishWith: result)
|
|
345
|
-
|
|
405
|
+
|
|
346
406
|
if let easyPayVC = self.navigationController as? EasyPayViewController {
|
|
347
407
|
easyPayVC.dismiss(animated: true, completion: {
|
|
348
408
|
if let delegate = easyPayVC.easyPayDelegate {
|
|
@@ -368,11 +428,14 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
368
428
|
btnDone.backgroundColor = uiColor
|
|
369
429
|
imgViewLoading.image = UIImage(systemName: "arrow.2.circlepath")?.withRenderingMode(.alwaysTemplate)
|
|
370
430
|
imgViewLoading.tintColor = uiColor
|
|
431
|
+
|
|
432
|
+
btnContinue.backgroundColor = uiColor
|
|
371
433
|
}
|
|
372
434
|
|
|
373
435
|
if let primaryBtnFontColor = UserStoreSingleton.shared.primary_btn_font_col,
|
|
374
436
|
let secondaryUIColor = UIColor(hex: primaryBtnFontColor) {
|
|
375
437
|
btnDone.setTitleColor(secondaryUIColor, for: .normal)
|
|
438
|
+
btnContinue.setTitleColor(secondaryUIColor, for: .normal)
|
|
376
439
|
}
|
|
377
440
|
|
|
378
441
|
if let primaryFontColor = UserStoreSingleton.shared.primary_font_col,
|
|
@@ -413,7 +476,7 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
413
476
|
let fontSizeDouble = Double(fontSizeString) { // Convert String to Double
|
|
414
477
|
let fontSize = CGFloat(fontSizeDouble) // Convert Double to CGFloat
|
|
415
478
|
lblCompleteAuthentication.font = UIFont.systemFont(ofSize: fontSize, weight: .semibold)
|
|
416
|
-
lblPaymentLink.font = UIFont.systemFont(ofSize: fontSize, weight: .medium)
|
|
479
|
+
// lblPaymentLink.font = UIFont.systemFont(ofSize: fontSize, weight: .medium)
|
|
417
480
|
lblBillingInfoData.font = UIFont.systemFont(ofSize: fontSize, weight: .medium)
|
|
418
481
|
}
|
|
419
482
|
|
|
@@ -504,7 +567,7 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
504
567
|
self.lblTransactionId.text = transactionId
|
|
505
568
|
self.lblSubscriptionId.text = subscriptionId
|
|
506
569
|
self.lblDate.text = formattedDate
|
|
507
|
-
|
|
570
|
+
// self.lblTotal.text = "$\(self.amount ?? 0)"
|
|
508
571
|
let rawAmount = Double(self.request?.amount ?? 0)
|
|
509
572
|
let amountText = String(format: "$%.2f", rawAmount)
|
|
510
573
|
self.lblTotal.text = "\(amountText)"
|
|
@@ -525,9 +588,10 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
525
588
|
self.imgViewPaymentDone.isHidden = false
|
|
526
589
|
self.lblCompleteAuthentication.text = "Payment Failed"
|
|
527
590
|
self.btnDone.isHidden = false
|
|
528
|
-
self.lblPaymentLink.isHidden = false
|
|
591
|
+
// self.lblPaymentLink.isHidden = false
|
|
529
592
|
self.viewPaymentDetails.isHidden = false
|
|
530
593
|
|
|
594
|
+
self.btnContinue.isHidden = true
|
|
531
595
|
}
|
|
532
596
|
else if status.lowercased() == "completed" {
|
|
533
597
|
// Success case
|
|
@@ -542,8 +606,10 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
542
606
|
self.imgViewPaymentDone.isHidden = false
|
|
543
607
|
self.lblCompleteAuthentication.text = "Authentication Completed"
|
|
544
608
|
self.btnDone.isHidden = false
|
|
545
|
-
self.lblPaymentLink.isHidden = false
|
|
609
|
+
// self.lblPaymentLink.isHidden = false
|
|
546
610
|
self.viewPaymentDetails.isHidden = false
|
|
611
|
+
|
|
612
|
+
self.btnContinue.isHidden = true
|
|
547
613
|
} else {
|
|
548
614
|
// Still waiting
|
|
549
615
|
self.imgViewPaymentDone.image = UIImage(systemName: "exclamationmark.circle.fill")
|
|
@@ -1858,7 +1858,7 @@
|
|
|
1858
1858
|
<action selector="actionBtnCancel:" destination="lAS-6T-hJb" eventType="touchUpInside" id="Q1V-aH-8oh"/>
|
|
1859
1859
|
</connections>
|
|
1860
1860
|
</button>
|
|
1861
|
-
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enter OTP sent to your email." lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WUH-7b-0Y6">
|
|
1861
|
+
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enter OTP (One Time Pin) sent to your email." lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WUH-7b-0Y6">
|
|
1862
1862
|
<rect key="frame" x="0.0" y="64" width="361" height="17"/>
|
|
1863
1863
|
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
|
|
1864
1864
|
<color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
@@ -2014,7 +2014,7 @@
|
|
|
2014
2014
|
</subviews>
|
|
2015
2015
|
</stackView>
|
|
2016
2016
|
<stackView opaque="NO" contentMode="scaleToFill" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="sdw-RP-gcM">
|
|
2017
|
-
<rect key="frame" x="
|
|
2017
|
+
<rect key="frame" x="9.6666666666666572" y="166" width="341.66666666666674" height="20"/>
|
|
2018
2018
|
<subviews>
|
|
2019
2019
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="exclamationmark.circle" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="nu3-EO-H0C">
|
|
2020
2020
|
<rect key="frame" x="0.0" y="0.66666666666666607" width="20" height="18.666666666666671"/>
|
|
@@ -2033,14 +2033,14 @@
|
|
|
2033
2033
|
<color key="textColor" name="E93939"/>
|
|
2034
2034
|
<nil key="highlightedColor"/>
|
|
2035
2035
|
</label>
|
|
2036
|
-
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Untill Resend OTP" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bVl-dP-xS7">
|
|
2037
|
-
<rect key="frame" x="66.666666666666657" y="0.0" width="
|
|
2036
|
+
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Untill Resend OTP (One Time Pin)" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bVl-dP-xS7">
|
|
2037
|
+
<rect key="frame" x="66.666666666666657" y="0.0" width="216.99999999999997" height="20"/>
|
|
2038
2038
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
|
2039
2039
|
<color key="textColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
2040
2040
|
<nil key="highlightedColor"/>
|
|
2041
2041
|
</label>
|
|
2042
2042
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fJY-dZ-dQ4">
|
|
2043
|
-
<rect key="frame" x="
|
|
2043
|
+
<rect key="frame" x="287.66666666666663" y="0.0" width="54" height="20"/>
|
|
2044
2044
|
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="15"/>
|
|
2045
2045
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
|
2046
2046
|
<state key="normal" title="Resend"/>
|
|
@@ -2526,7 +2526,7 @@
|
|
|
2526
2526
|
<action selector="actionBtnCloseOTPView:" destination="sRX-zZ-F0N" eventType="touchUpInside" id="v96-li-8NR"/>
|
|
2527
2527
|
</connections>
|
|
2528
2528
|
</button>
|
|
2529
|
-
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enter OTP sent to your email." lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qbG-zh-fHY">
|
|
2529
|
+
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enter OTP (One Time Pin) sent to your email." lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qbG-zh-fHY">
|
|
2530
2530
|
<rect key="frame" x="0.0" y="64" width="361" height="17"/>
|
|
2531
2531
|
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
|
|
2532
2532
|
<color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
@@ -2689,7 +2689,7 @@
|
|
|
2689
2689
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
2690
2690
|
</stackView>
|
|
2691
2691
|
<stackView opaque="NO" contentMode="scaleToFill" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="AeV-da-AJY">
|
|
2692
|
-
<rect key="frame" x="
|
|
2692
|
+
<rect key="frame" x="9.6666666666666572" y="162" width="341.66666666666674" height="20"/>
|
|
2693
2693
|
<subviews>
|
|
2694
2694
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="exclamationmark.circle" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="Zh1-6r-P0R">
|
|
2695
2695
|
<rect key="frame" x="0.0" y="0.66666666666666607" width="20" height="18.666666666666671"/>
|
|
@@ -2708,14 +2708,14 @@
|
|
|
2708
2708
|
<color key="textColor" name="E93939"/>
|
|
2709
2709
|
<nil key="highlightedColor"/>
|
|
2710
2710
|
</label>
|
|
2711
|
-
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Untill Resend OTP" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HVT-os-4oM">
|
|
2712
|
-
<rect key="frame" x="66.666666666666657" y="0.0" width="
|
|
2711
|
+
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Untill Resend OTP (One Time Pin)" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HVT-os-4oM">
|
|
2712
|
+
<rect key="frame" x="66.666666666666657" y="0.0" width="216.99999999999997" height="20"/>
|
|
2713
2713
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
|
2714
2714
|
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
2715
2715
|
<nil key="highlightedColor"/>
|
|
2716
2716
|
</label>
|
|
2717
2717
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Zcz-Wj-WPL">
|
|
2718
|
-
<rect key="frame" x="
|
|
2718
|
+
<rect key="frame" x="287.66666666666663" y="0.0" width="54" height="20"/>
|
|
2719
2719
|
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="15"/>
|
|
2720
2720
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
|
2721
2721
|
<state key="normal" title="Resend"/>
|
|
@@ -8521,7 +8521,7 @@
|
|
|
8521
8521
|
</viewController>
|
|
8522
8522
|
<placeholder placeholderIdentifier="IBFirstResponder" id="7TL-sr-fJN" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
|
8523
8523
|
</objects>
|
|
8524
|
-
<point key="canvasLocation" x="
|
|
8524
|
+
<point key="canvasLocation" x="1689" y="-1979"/>
|
|
8525
8525
|
</scene>
|
|
8526
8526
|
<!--Country ListVC-->
|
|
8527
8527
|
<scene sceneID="jB5-M3-ztU">
|
|
@@ -8618,6 +8618,21 @@
|
|
|
8618
8618
|
</objects>
|
|
8619
8619
|
<point key="canvasLocation" x="3554.9618320610684" y="764.78873239436621"/>
|
|
8620
8620
|
</scene>
|
|
8621
|
+
<!--Payment Status Web ViewVC-->
|
|
8622
|
+
<scene sceneID="0pT-Qc-aGH">
|
|
8623
|
+
<objects>
|
|
8624
|
+
<viewController storyboardIdentifier="PaymentStatusWebViewVC" useStoryboardIdentifierAsRestorationIdentifier="YES" id="7QX-wf-RDe" customClass="PaymentStatusWebViewVC" customModule="EasyPay" customModuleProvider="target" sceneMemberID="viewController">
|
|
8625
|
+
<view key="view" contentMode="scaleToFill" id="lwu-Wr-RxY">
|
|
8626
|
+
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
|
|
8627
|
+
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
|
8628
|
+
<viewLayoutGuide key="safeArea" id="Dyf-Qi-pah"/>
|
|
8629
|
+
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
|
8630
|
+
</view>
|
|
8631
|
+
</viewController>
|
|
8632
|
+
<placeholder placeholderIdentifier="IBFirstResponder" id="Bg1-Rj-mEd" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
|
8633
|
+
</objects>
|
|
8634
|
+
<point key="canvasLocation" x="4366" y="765"/>
|
|
8635
|
+
</scene>
|
|
8621
8636
|
<!--Grail PayVC-->
|
|
8622
8637
|
<scene sceneID="OTL-Ro-rHx">
|
|
8623
8638
|
<objects>
|
|
@@ -8645,7 +8660,7 @@
|
|
|
8645
8660
|
<rect key="frame" x="0.0" y="59" width="393" height="759"/>
|
|
8646
8661
|
<subviews>
|
|
8647
8662
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="of6-7s-ppt">
|
|
8648
|
-
<rect key="frame" x="0.0" y="0.0" width="393" height="
|
|
8663
|
+
<rect key="frame" x="0.0" y="0.0" width="393" height="847.66666666666663"/>
|
|
8649
8664
|
<subviews>
|
|
8650
8665
|
<imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="payment_done_icon" translatesAutoresizingMaskIntoConstraints="NO" id="5Tx-1L-CH6">
|
|
8651
8666
|
<rect key="frame" x="96.666666666666686" y="100" width="200" height="200"/>
|
|
@@ -8672,7 +8687,7 @@
|
|
|
8672
8687
|
</userDefinedRuntimeAttributes>
|
|
8673
8688
|
</imageView>
|
|
8674
8689
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="Ohk-Hy-7Yw">
|
|
8675
|
-
<rect key="frame" x="16" y="330" width="361" height="
|
|
8690
|
+
<rect key="frame" x="16" y="330" width="361" height="317.66666666666674"/>
|
|
8676
8691
|
<subviews>
|
|
8677
8692
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Please complete 3DS Authentication.!!" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="44r-2b-XpZ">
|
|
8678
8693
|
<rect key="frame" x="0.0" y="0.0" width="361" height="21.666666666666668"/>
|
|
@@ -8680,14 +8695,14 @@
|
|
|
8680
8695
|
<nil key="textColor"/>
|
|
8681
8696
|
<nil key="highlightedColor"/>
|
|
8682
8697
|
</label>
|
|
8683
|
-
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="https://pay.sandbox.datatrans.com/v1/start/250520111437066423" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kA9-ug-dAE">
|
|
8684
|
-
<rect key="frame" x="0.0" y="
|
|
8698
|
+
<label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="https://pay.sandbox.datatrans.com/v1/start/250520111437066423" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kA9-ug-dAE">
|
|
8699
|
+
<rect key="frame" x="0.0" y="31.666666666666686" width="361" height="0.0"/>
|
|
8685
8700
|
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
|
|
8686
8701
|
<color key="textColor" systemColor="systemBlueColor"/>
|
|
8687
8702
|
<nil key="highlightedColor"/>
|
|
8688
8703
|
</label>
|
|
8689
8704
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="yzR-Bj-iWJ">
|
|
8690
|
-
<rect key="frame" x="0.0" y="
|
|
8705
|
+
<rect key="frame" x="0.0" y="41.666666666666686" width="361" height="276"/>
|
|
8691
8706
|
<subviews>
|
|
8692
8707
|
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="iQK-sH-tNj">
|
|
8693
8708
|
<rect key="frame" x="0.0" y="0.0" width="361" height="17"/>
|
|
@@ -8707,7 +8722,7 @@
|
|
|
8707
8722
|
</subviews>
|
|
8708
8723
|
</stackView>
|
|
8709
8724
|
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="B5B-GV-fPO">
|
|
8710
|
-
<rect key="frame" x="0.0" y="
|
|
8725
|
+
<rect key="frame" x="0.0" y="37" width="361" height="17"/>
|
|
8711
8726
|
<subviews>
|
|
8712
8727
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Status" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hBk-dc-bQp">
|
|
8713
8728
|
<rect key="frame" x="0.0" y="0.0" width="175.66666666666666" height="17"/>
|
|
@@ -8724,7 +8739,7 @@
|
|
|
8724
8739
|
</subviews>
|
|
8725
8740
|
</stackView>
|
|
8726
8741
|
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillProportionally" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="Z8c-rX-6Ew">
|
|
8727
|
-
<rect key="frame" x="0.0" y="
|
|
8742
|
+
<rect key="frame" x="0.0" y="74" width="361" height="17"/>
|
|
8728
8743
|
<subviews>
|
|
8729
8744
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Transaction Id" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="p3D-xt-AyD">
|
|
8730
8745
|
<rect key="frame" x="0.0" y="0.0" width="110" height="17"/>
|
|
@@ -8846,49 +8861,74 @@
|
|
|
8846
8861
|
</subviews>
|
|
8847
8862
|
</stackView>
|
|
8848
8863
|
<label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cgi-Hk-KmE">
|
|
8849
|
-
<rect key="frame" x="0.0" y="
|
|
8864
|
+
<rect key="frame" x="0.0" y="317.66666666666663" width="361" height="0.0"/>
|
|
8850
8865
|
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
|
|
8851
8866
|
<nil key="textColor"/>
|
|
8852
8867
|
<nil key="highlightedColor"/>
|
|
8853
8868
|
</label>
|
|
8854
8869
|
</subviews>
|
|
8855
8870
|
</stackView>
|
|
8856
|
-
<
|
|
8857
|
-
<rect key="frame" x="16" y="
|
|
8858
|
-
<
|
|
8859
|
-
|
|
8860
|
-
|
|
8861
|
-
|
|
8862
|
-
|
|
8863
|
-
|
|
8864
|
-
|
|
8865
|
-
|
|
8866
|
-
|
|
8867
|
-
|
|
8868
|
-
|
|
8869
|
-
|
|
8870
|
-
|
|
8871
|
-
|
|
8872
|
-
|
|
8873
|
-
|
|
8874
|
-
|
|
8875
|
-
|
|
8871
|
+
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="6Wx-cR-b67">
|
|
8872
|
+
<rect key="frame" x="16" y="677.66666666666663" width="361" height="120"/>
|
|
8873
|
+
<subviews>
|
|
8874
|
+
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="OJr-O3-6g0">
|
|
8875
|
+
<rect key="frame" x="0.0" y="0.0" width="361" height="50"/>
|
|
8876
|
+
<color key="backgroundColor" name="AccentColor"/>
|
|
8877
|
+
<constraints>
|
|
8878
|
+
<constraint firstAttribute="height" constant="50" id="nUs-0h-8OU"/>
|
|
8879
|
+
</constraints>
|
|
8880
|
+
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/>
|
|
8881
|
+
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
|
8882
|
+
<state key="normal" title="Continue">
|
|
8883
|
+
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
8884
|
+
</state>
|
|
8885
|
+
<userDefinedRuntimeAttributes>
|
|
8886
|
+
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
|
8887
|
+
<integer key="value" value="6"/>
|
|
8888
|
+
</userDefinedRuntimeAttribute>
|
|
8889
|
+
</userDefinedRuntimeAttributes>
|
|
8890
|
+
<connections>
|
|
8891
|
+
<action selector="actionBtnContinue:" destination="MNa-QR-pOX" eventType="touchUpInside" id="LLB-ri-KnR"/>
|
|
8892
|
+
</connections>
|
|
8893
|
+
</button>
|
|
8894
|
+
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="jjf-42-5hm">
|
|
8895
|
+
<rect key="frame" x="0.0" y="70" width="361" height="50"/>
|
|
8896
|
+
<color key="backgroundColor" name="AccentColor"/>
|
|
8897
|
+
<constraints>
|
|
8898
|
+
<constraint firstAttribute="height" constant="50" id="5zM-ST-y6f"/>
|
|
8899
|
+
</constraints>
|
|
8900
|
+
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/>
|
|
8901
|
+
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
|
8902
|
+
<state key="normal" title="Done">
|
|
8903
|
+
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
8904
|
+
</state>
|
|
8905
|
+
<userDefinedRuntimeAttributes>
|
|
8906
|
+
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
|
8907
|
+
<integer key="value" value="6"/>
|
|
8908
|
+
</userDefinedRuntimeAttribute>
|
|
8909
|
+
</userDefinedRuntimeAttributes>
|
|
8910
|
+
<connections>
|
|
8911
|
+
<action selector="actionBtnDone:" destination="MNa-QR-pOX" eventType="touchUpInside" id="raa-Hw-NN1"/>
|
|
8912
|
+
</connections>
|
|
8913
|
+
</button>
|
|
8914
|
+
</subviews>
|
|
8915
|
+
</stackView>
|
|
8876
8916
|
</subviews>
|
|
8877
8917
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
|
8878
8918
|
<constraints>
|
|
8879
8919
|
<constraint firstItem="5Tx-1L-CH6" firstAttribute="top" secondItem="of6-7s-ppt" secondAttribute="top" constant="100" id="1dA-SQ-pRy"/>
|
|
8880
|
-
<constraint
|
|
8881
|
-
<constraint firstAttribute="bottom" secondItem="
|
|
8882
|
-
<constraint firstItem="jjf-42-5hm" firstAttribute="top" secondItem="Ohk-Hy-7Yw" secondAttribute="bottom" constant="30" id="GNt-BB-7aJ"/>
|
|
8920
|
+
<constraint firstAttribute="trailing" secondItem="6Wx-cR-b67" secondAttribute="trailing" constant="16" id="AlF-jt-tii"/>
|
|
8921
|
+
<constraint firstAttribute="bottom" secondItem="6Wx-cR-b67" secondAttribute="bottom" constant="50" id="DIJ-5h-fxg"/>
|
|
8883
8922
|
<constraint firstItem="Ohk-Hy-7Yw" firstAttribute="top" secondItem="5Tx-1L-CH6" secondAttribute="bottom" constant="30" id="KmH-82-CCB"/>
|
|
8884
8923
|
<constraint firstItem="xHM-Ip-TLk" firstAttribute="bottom" secondItem="5Tx-1L-CH6" secondAttribute="bottom" id="NvQ-vm-Hc4"/>
|
|
8885
8924
|
<constraint firstItem="Ohk-Hy-7Yw" firstAttribute="leading" secondItem="of6-7s-ppt" secondAttribute="leading" constant="16" id="U6Y-Q0-P3C"/>
|
|
8886
8925
|
<constraint firstItem="xHM-Ip-TLk" firstAttribute="trailing" secondItem="5Tx-1L-CH6" secondAttribute="trailing" id="Wbt-Fa-zOh"/>
|
|
8926
|
+
<constraint firstItem="6Wx-cR-b67" firstAttribute="leading" secondItem="of6-7s-ppt" secondAttribute="leading" constant="16" id="XOq-fy-wuA"/>
|
|
8887
8927
|
<constraint firstItem="xHM-Ip-TLk" firstAttribute="top" secondItem="5Tx-1L-CH6" secondAttribute="top" id="fPa-Z8-a19"/>
|
|
8928
|
+
<constraint firstItem="6Wx-cR-b67" firstAttribute="top" secondItem="Ohk-Hy-7Yw" secondAttribute="bottom" constant="30" id="h6t-BT-oFz"/>
|
|
8888
8929
|
<constraint firstAttribute="trailing" secondItem="Ohk-Hy-7Yw" secondAttribute="trailing" constant="16" id="nAq-ay-Mu8"/>
|
|
8889
8930
|
<constraint firstItem="xHM-Ip-TLk" firstAttribute="leading" secondItem="5Tx-1L-CH6" secondAttribute="leading" id="rLn-nz-9Qc"/>
|
|
8890
8931
|
<constraint firstItem="5Tx-1L-CH6" firstAttribute="centerX" secondItem="of6-7s-ppt" secondAttribute="centerX" id="tgN-13-EBn"/>
|
|
8891
|
-
<constraint firstAttribute="trailing" secondItem="jjf-42-5hm" secondAttribute="trailing" constant="16" id="z9V-0g-F79"/>
|
|
8892
8932
|
</constraints>
|
|
8893
8933
|
</view>
|
|
8894
8934
|
</subviews>
|
|
@@ -8911,6 +8951,7 @@
|
|
|
8911
8951
|
</constraints>
|
|
8912
8952
|
</view>
|
|
8913
8953
|
<connections>
|
|
8954
|
+
<outlet property="btnContinue" destination="OJr-O3-6g0" id="7yL-Uk-dp2"/>
|
|
8914
8955
|
<outlet property="btnDone" destination="jjf-42-5hm" id="nbh-pe-pKj"/>
|
|
8915
8956
|
<outlet property="imgViewLoading" destination="xHM-Ip-TLk" id="wqg-U3-Md1"/>
|
|
8916
8957
|
<outlet property="imgViewPaymentDone" destination="5Tx-1L-CH6" id="MWJ-KK-Zsw"/>
|
|
@@ -8920,7 +8961,6 @@
|
|
|
8920
8961
|
<outlet property="lblCompleteAuthentication" destination="44r-2b-XpZ" id="nDD-SL-1wb"/>
|
|
8921
8962
|
<outlet property="lblDate" destination="MVu-L1-M41" id="Ps7-Ff-IyK"/>
|
|
8922
8963
|
<outlet property="lblDateHeading" destination="bDb-6q-bEm" id="9a4-lm-bVV"/>
|
|
8923
|
-
<outlet property="lblPaymentLink" destination="kA9-ug-dAE" id="css-ur-Ut5"/>
|
|
8924
8964
|
<outlet property="lblPaymentMethodHeading" destination="84t-33-Wrw" id="gpb-ha-pdV"/>
|
|
8925
8965
|
<outlet property="lblPaymentMethodValue" destination="90T-ex-9wU" id="qSy-OI-6R9"/>
|
|
8926
8966
|
<outlet property="lblReferenceIdHeading" destination="SJg-Ax-BoO" id="x9t-Bn-2ab"/>
|