Skip to content

Commit e11e431

Browse files
Add Show CVV view implementation on ios
1 parent 5d975d1 commit e11e431

4 files changed

Lines changed: 221 additions & 0 deletions

File tree

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
//
2+
// FlutterShowCVVNumberView.swift
3+
// Runner
4+
//
5+
6+
import Foundation
7+
import Flutter
8+
import UIKit
9+
import VGSShowSDK
10+
11+
/// FlutterPlatformView wrapper for VGSShowCVVNumberView.
12+
class FlutterShowCVVNumberView: NSObject, FlutterPlatformView {
13+
14+
// MARK: - Vars
15+
16+
var vgsShowCVVNumber = VGSShow(id: "tntazhyknp1", environment: .sandbox)
17+
18+
let showCVVNumberView: ShowCVVNumberView
19+
let messenger: FlutterBinaryMessenger
20+
let channel: FlutterMethodChannel
21+
let viewId: Int64
22+
23+
// MARK: - Initialization
24+
25+
init(messenger: FlutterBinaryMessenger,
26+
frame: CGRect,
27+
viewId: Int64,
28+
args: Any?) {
29+
30+
self.messenger = messenger
31+
self.viewId = viewId
32+
self.showCVVNumberView = ShowCVVNumberView()
33+
34+
channel = FlutterMethodChannel(name: "card-show-cvv-view/\(viewId)", binaryMessenger: messenger)
35+
36+
super.init()
37+
self.showCVVNumberView.subscribeViewsToShow(self.vgsShowCVVNumber)
38+
39+
channel.setMethodCallHandler({ (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
40+
switch call.method {
41+
case "revealCVV":
42+
self.revealCVV(with: call, result: result)
43+
break
44+
default:
45+
result(FlutterMethodNotImplemented)
46+
}
47+
})
48+
}
49+
50+
// MARK: - FlutterPlatformView
51+
52+
public func view() -> UIView {
53+
return self.showCVVNumberView
54+
}
55+
56+
// MARK: - Helpers
57+
58+
private func revealCVV(with flutterMethodCall: FlutterMethodCall, result: @escaping FlutterResult) {
59+
var errorInfo: [String : Any] = [:]
60+
guard let args = flutterMethodCall.arguments as? [Any],
61+
let vaultId = args.first as? String,
62+
let sandbox = args[1] as? Bool,
63+
let customerToken = args[2] as? String,
64+
let cardId = args[3] as? String
65+
else {
66+
errorInfo["show_error_code"] = 999
67+
errorInfo["show_error_message"] = "No payload to reveal. Collect some data first!"
68+
69+
result(errorInfo)
70+
return
71+
}
72+
self.vgsShowCVVNumber = VGSShow(id: vaultId, environment: sandbox ? .sandbox: .live)
73+
self.showCVVNumberView.subscribeViewsToShow(self.vgsShowCVVNumber)
74+
75+
self.vgsShowCVVNumber.customHeaders = [
76+
"Authorization": "Bearer " + customerToken,
77+
"htmlWrapper": "text",
78+
"jsonPathSelector": "data.attributes.cvv2"
79+
]
80+
81+
self.vgsShowCVVNumber.request(path: "/cards/\(cardId)/secure-data/cvv2", method: .get) { (response) in
82+
switch response {
83+
case .success(let code):
84+
var successInfo: [String : Any] = [:]
85+
successInfo["show_status_code"] = code
86+
result(successInfo)
87+
case .failure(let code, let error):
88+
errorInfo["show_error_code"] = code
89+
if let message = error?.localizedDescription {
90+
errorInfo["show_error_message"] = message
91+
}
92+
result(errorInfo)
93+
}
94+
}
95+
96+
}
97+
98+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// FlutterShowCVVNumberViewFactory.swift
3+
// Runner
4+
//
5+
6+
import Foundation
7+
import Flutter
8+
import UIKit
9+
10+
/// Flutter View factory for VGSShow wrapper.
11+
class FlutterShowCVVNumberViewFactory: NSObject, FlutterPlatformViewFactory {
12+
13+
// MARK: - Private vars
14+
15+
private var messenger: FlutterBinaryMessenger
16+
17+
// MARK: - Initialization
18+
19+
init(messenger: FlutterBinaryMessenger) {
20+
self.messenger = messenger
21+
}
22+
23+
// MARK: - Public
24+
25+
public func create(withFrame frame: CGRect,
26+
viewIdentifier viewId: Int64,
27+
arguments args: Any?) -> FlutterPlatformView {
28+
return FlutterShowCVVNumberView(messenger: messenger,
29+
frame: frame, viewId: viewId,
30+
args: args)
31+
}
32+
public func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {
33+
return FlutterStandardMessageCodec.sharedInstance()
34+
}
35+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
// FlutterShowCVVNumberViewPlugin.swift
3+
// Runner
4+
//
5+
6+
import Foundation
7+
import Flutter
8+
9+
/// Flutter plugin for bridging VGSShow.
10+
public class FlutterShowCVVNumberViewPlugin {
11+
class func register(with registrar: FlutterPluginRegistrar) {
12+
let viewFactory = FlutterShowCVVNumberViewFactory(messenger: registrar.messenger())
13+
registrar.register(viewFactory, withId: "card-show-cvv-view")
14+
}
15+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
//
2+
// ShowCVVNumberView.swift
3+
// Runner
4+
//
5+
6+
import Foundation
7+
import UIKit
8+
import VGSShowSDK
9+
10+
/// Native UIView subclass, holds VGSLabels.
11+
class ShowCVVNumberView: UIView {
12+
13+
// MARK: - Vars
14+
15+
private lazy var stackView: UIStackView = {
16+
let stackView = UIStackView()
17+
stackView.translatesAutoresizingMaskIntoConstraints = false
18+
stackView.axis = .vertical
19+
20+
stackView.layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
21+
stackView.distribution = .fill
22+
stackView.spacing = 16
23+
return stackView
24+
}()
25+
26+
private lazy var cvvNumberVGSLabel: VGSLabel = {
27+
let label = ShowCVVNumberView.provideStylesVGSLabel()
28+
29+
label.placeholder = "***"
30+
label.contentPath = "data.attributes.cvv2"
31+
32+
return label
33+
}()
34+
35+
// MARK: - Initialization
36+
37+
override init(frame: CGRect) {
38+
super.init(frame: frame)
39+
40+
addSubview(stackView)
41+
42+
stackView.addArrangedSubview(cvvNumberVGSLabel)
43+
44+
cvvNumberVGSLabel.heightAnchor.constraint(equalToConstant: 60).isActive = true
45+
cvvNumberVGSLabel.widthAnchor.constraint(equalToConstant: 150).isActive = true
46+
}
47+
48+
required init?(coder: NSCoder) {
49+
fatalError("init(coder:) has not been implemented")
50+
}
51+
52+
// MARK: - Public
53+
54+
func subscribeViewsToShow(_ vgsShow: VGSShow) {
55+
vgsShow.subscribe(cvvNumberVGSLabel)
56+
}
57+
58+
// MARK: - Private
59+
60+
static private func provideStylesVGSLabel() -> VGSLabel {
61+
let label = VGSLabel()
62+
label.translatesAutoresizingMaskIntoConstraints = true
63+
label.font = UIFont.systemFont(ofSize: 14)
64+
label.textColor = UIColor(red: 0.05, green: 0.11, blue: 0.26, alpha: 1.00)
65+
label.placeholderStyle.font = UIFont.systemFont(ofSize: 14)
66+
label.placeholderStyle.color = .black
67+
label.placeholderStyle.textAlignment = .right
68+
label.textAlignment = .right
69+
label.borderColor = UIColor.clear
70+
71+
return label
72+
}
73+
}

0 commit comments

Comments
 (0)