11import UIKit
22import RxSwift
3- import CardFlight
43
5- class CardHandler : NSObject , CFTTransactionDelegate {
4+ internal final class DummyCard : NSObject {
5+
6+ internal init ( token: String , cardInfo: DummyCard . DummyCardInfo ) {
7+ self . token = token
8+ self . cardInfo = cardInfo
9+ }
10+
11+ let token : String
12+ let cardInfo : DummyCardInfo
13+
14+ internal final class DummyCardInfo : NSObject {
15+
16+ internal init ( cardholderName: String , lastFour: String ) {
17+ self . cardholderName = cardholderName
18+ self . lastFour = lastFour
19+ }
20+
21+ let cardholderName : String
22+ let lastFour : String
23+ }
24+ }
25+
26+ class CardHandler : NSObject {
627
728 private let _cardStatus = PublishSubject < String > ( )
829 private let _userMessages = PublishSubject < String > ( )
9- private var cardReader : CFTCardReaderInfo ?
10-
11- var transaction : CFTTransaction ?
30+
31+ var card : DummyCard ?
1232
1333 var cardStatus : Observable < String > {
1434 return _cardStatus. asObservable ( )
@@ -27,15 +47,6 @@ class CardHandler: NSObject, CFTTransactionDelegate {
2747 }
2848 }
2949
30- var cardFlightCredentials : CFTCredentials {
31- let credentials = CFTCredentials ( )
32- credentials. setup ( apiKey: self . APIKey, accountToken: self . APIToken, completion: nil )
33- return credentials
34- }
35-
36- var card : ( cardInfo: CFTCardInfo , token: String ) ?
37-
38-
3950 let APIKey : String
4051 let APIToken : String
4152
@@ -44,8 +55,6 @@ class CardHandler: NSObject, CFTTransactionDelegate {
4455 APIToken = accountToken
4556
4657 super. init ( )
47-
48- self . transaction = CFTTransaction ( delegate: self )
4958 }
5059
5160 deinit {
@@ -54,128 +63,8 @@ class CardHandler: NSObject, CFTTransactionDelegate {
5463
5564 func startSearching( ) {
5665 _cardStatus. onNext ( " Starting search... " )
57- let tokenizationParameters = CFTTokenizationParameters ( customerId: nil , credentials: self . cardFlightCredentials)
58- self . transaction? . beginTokenizing ( tokenizationParameters: tokenizationParameters)
5966 }
6067
6168 func end( ) {
62- transaction? . select ( processOption: CFTProcessOption . abort)
63- transaction = nil
64- }
65-
66- func transaction( _ transaction: CFTTransaction , didUpdate state: CFTTransactionState , error: Error ? ) {
67- switch state {
68- case . completed:
69- _cardStatus. onNext ( " Transaction completed " )
70- case . processing:
71- _cardStatus. onNext ( " Transaction processing " )
72- case . deferred:
73- _cardStatus. onNext ( " Transaction deferred " )
74- case . pendingCardInput:
75- _cardStatus. onNext ( " Pending card input " )
76- transaction. select ( cardReaderInfo: cardReader, cardReaderModel: cardReader? . cardReaderModel ?? . unknown)
77- case . pendingTransactionParameters:
78- _cardStatus. onNext ( " Pending transaction parameters " )
79- case . unknown:
80- _cardStatus. onNext ( " Unknown transactionstate " )
81- case . pendingProcessOption:
82- break
83- }
84- }
85-
86- func transaction( _ transaction: CFTTransaction , didComplete historicalTransaction: CFTHistoricalTransaction ) {
87- if let cardInfo = historicalTransaction. cardInfo, let token = historicalTransaction. cardToken {
88- self . card = ( cardInfo: cardInfo, token: token)
89- _cardStatus. onNext ( " Got Card " )
90- _cardStatus. onCompleted ( )
91- } else {
92- _cardStatus. onNext ( " Card Flight Error – could not retrieve card data. " ) ;
93- if let error = historicalTransaction. error {
94- _cardStatus. onNext ( " response Error \( error) " ) ;
95- logger. log ( " CardReader got a response it cannot handle " )
96- }
97- startSearching ( )
98- }
99- }
100-
101- func transaction( _ transaction: CFTTransaction , didReceive cardReaderEvent: CFTCardReaderEvent , cardReaderInfo: CFTCardReaderInfo ? ) {
102- _cardStatus. onNext ( cardReaderEvent. statusMessage)
103- }
104-
105- func transaction( _ transaction: CFTTransaction , didUpdate cardReaderArray: [ CFTCardReaderInfo ] ) {
106- self . cardReader = cardReaderArray. first
107- _cardStatus. onNext ( " Received new card reader availability, number of readers: \( cardReaderArray. count) " )
108- }
109-
110- func transaction( _ transaction: CFTTransaction , didRequestProcessOption cardInfo: CFTCardInfo ) {
111- logger. log ( " Received request for processing option, will process transaction. " )
112- _cardStatus. onNext ( " Request for process option, automatically processing... " )
113- // We auto-accept the process option on the user's behalf because the prompt doesn't make sense in a
114- // tokenization flow. See comments in `userMessages` property above.
115- transaction. select ( processOption: . process)
116- }
117-
118- func transaction( _ transaction: CFTTransaction , didRequestDisplay message: CFTMessage ) {
119- let message = message. primary ?? message. secondary ?? " "
120- _userMessages. onNext ( message)
121- logger. log ( " Received request to display message: \( message) " )
122- _cardStatus. onNext ( " Received message for user: \( message) " )
123- }
124- }
125-
126- typealias UnhandledDelegateCallbacks = CardHandler
127- /// We don't expect any of these functions to be called, but they are required for the delegate protocol.
128- extension UnhandledDelegateCallbacks {
129- func transaction( _ transaction: CFTTransaction , didDefer transactionData: Data ) {
130- logger. log ( " Transaction has been deferred. " )
131- _cardStatus. onNext ( " Transaction deferred " )
132- }
133-
134- public func transaction( _ transaction: CFTTransaction , didRequest cvm: CFTCVM ) {
135- if cvm == CFTCVM . signature {
136- logger. log ( " Transaction requested signature from user, which should not occur for tokenization. " )
137- _cardStatus. onNext ( " Ignoring user signature request from CardFlight " )
138- }
139- }
140- }
141-
142- extension CFTCardReaderEvent {
143- var statusMessage : String {
144- switch self {
145- case . unknown:
146- return " Unknown card event "
147- case . disconnected:
148- return " Reader is disconnected "
149- case . connected:
150- return " Reader is connected "
151- case . connectionErrored:
152- return " Connection error occurred "
153- case . cardSwiped:
154- return " Card swiped "
155- case . cardSwipeErrored:
156- return " Card swipe error "
157- case . cardInserted:
158- return " Card inserted "
159- case . cardInsertErrored:
160- return " Card insertion error "
161- case . cardRemoved:
162- return " Card removed "
163- case . cardTapped:
164- return " Card tapped "
165- case . cardTapErrored:
166- return " Card tap error "
167- case . updateStarted:
168- return " Update started "
169- case . updateCompleted:
170- return " Updated completed "
171- case . audioRecordingPermissionNotGranted:
172- return " iOS audio permissions no granted "
173- case . fatalError:
174- return " Fatal error "
175- case . connecting:
176- return " Connecting "
177- case . batteryStatusUpdated:
178- return " Battery status updated "
179- }
18069 }
18170}
0 commit comments