diff --git a/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample.xcodeproj/project.pbxproj b/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample.xcodeproj/project.pbxproj index 08155bf3..7178318f 100644 --- a/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample.xcodeproj/project.pbxproj +++ b/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 6CAC82BEF157325DE8024E2E /* libPods-CollectAndRevealSample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F5C5B124A49D66E3C560B0D /* libPods-CollectAndRevealSample.a */; }; 7C2C89D82C89C9520076C641 /* CardBrandChoiceSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C2C89D72C89C9520076C641 /* CardBrandChoiceSampleViewController.swift */; }; 7C2C89DE2C8F23C30076C641 /* CollectAndRevealViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C2C89DD2C8F23C30076C641 /* CollectAndRevealViewController.swift */; }; 7C2C89E52C8F25C50076C641 /* libSkyflow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C2C89E42C8F25C50076C641 /* libSkyflow.a */; }; @@ -16,9 +17,7 @@ F1613E57272565CF0042C130 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F1613E55272565CF0042C130 /* Main.storyboard */; }; F1613E59272565D30042C130 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F1613E58272565D30042C130 /* Assets.xcassets */; }; F1613E5C272565D30042C130 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F1613E5A272565D30042C130 /* LaunchScreen.storyboard */; }; - F1613E652725663C0042C130 /* ExampleAPICallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1613E642725663C0042C130 /* ExampleAPICallback.swift */; }; F1613E682725665D0042C130 /* ExampleTokenProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1613E672725665D0042C130 /* ExampleTokenProvider.swift */; }; - F1613E6B272566800042C130 /* ResponseStructs.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1613E6A272566800042C130 /* ResponseStructs.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -36,9 +35,7 @@ F1613E58272565D30042C130 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; F1613E5B272565D30042C130 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; F1613E5D272565D30042C130 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - F1613E642725663C0042C130 /* ExampleAPICallback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleAPICallback.swift; sourceTree = ""; }; F1613E672725665D0042C130 /* ExampleTokenProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleTokenProvider.swift; sourceTree = ""; }; - F1613E6A272566800042C130 /* ResponseStructs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseStructs.swift; sourceTree = ""; }; F2D4C9A9B1D1DF56AC7781D1 /* Pods-CollectAndRevealSample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CollectAndRevealSample.release.xcconfig"; path = "Target Support Files/Pods-CollectAndRevealSample/Pods-CollectAndRevealSample.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -48,6 +45,7 @@ buildActionMask = 2147483647; files = ( 7C2C89E52C8F25C50076C641 /* libSkyflow.a in Frameworks */, + 6CAC82BEF157325DE8024E2E /* libPods-CollectAndRevealSample.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -93,9 +91,7 @@ F1613E58272565D30042C130 /* Assets.xcassets */, F1613E5A272565D30042C130 /* LaunchScreen.storyboard */, F1613E5D272565D30042C130 /* Info.plist */, - F1613E642725663C0042C130 /* ExampleAPICallback.swift */, F1613E672725665D0042C130 /* ExampleTokenProvider.swift */, - F1613E6A272566800042C130 /* ResponseStructs.swift */, 7C2C89DD2C8F23C30076C641 /* CollectAndRevealViewController.swift */, ); path = CollectAndRevealSample; @@ -128,8 +124,6 @@ dependencies = ( ); name = CollectAndRevealSample; - packageProductDependencies = ( - ); productName = CollectAndRevealSample; productReference = F1613E4C272565CF0042C130 /* CollectAndRevealSample.app */; productType = "com.apple.product-type.application"; @@ -230,10 +224,8 @@ buildActionMask = 2147483647; files = ( F1613E54272565CF0042C130 /* ViewController.swift in Sources */, - F1613E6B272566800042C130 /* ResponseStructs.swift in Sources */, F1613E682725665D0042C130 /* ExampleTokenProvider.swift in Sources */, F1613E50272565CF0042C130 /* AppDelegate.swift in Sources */, - F1613E652725663C0042C130 /* ExampleAPICallback.swift in Sources */, F1613E52272565CF0042C130 /* SceneDelegate.swift in Sources */, 7C2C89DE2C8F23C30076C641 /* CollectAndRevealViewController.swift in Sources */, 7C2C89D82C89C9520076C641 /* CardBrandChoiceSampleViewController.swift in Sources */, diff --git a/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample/CollectAndRevealViewController.swift b/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample/CollectAndRevealViewController.swift index 39890a1b..69cde866 100644 --- a/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample/CollectAndRevealViewController.swift +++ b/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample/CollectAndRevealViewController.swift @@ -153,26 +153,38 @@ class CollectAndRevealViewController: UIViewController { } } @objc func revealForm() { - self.revealContainer?.reveal(callback: ExampleAPICallback()) + self.revealContainer?.reveal( + callback: RevealCallback( + onSuccess: { (response: RevealResponse) in print("success:", response) }, + onFailure: { (error: SkyflowError) in print("failure:", error) } + ) + ) } @objc func submitForm() { - let exampleAPICallback = ExampleAPICallback(updateSuccess: updateSuccess, updateFailure: updateFailure) - container!.collect(callback: exampleAPICallback, options: SkyflowFlowVault.CollectOptions(tokens: true)) + container!.collect( + callback: CollectCallback( + onSuccess: { [weak self] (response: CollectResponse) in self?.updateSuccess(response) }, + onFailure: { [weak self] (error: SkyflowError) in self?.updateFailure(error: error) } + ), + options: SkyflowFlowVault.CollectOptions(tokens: true) + ) } - internal func updateSuccess(_ response: SuccessResponse) { + internal func updateSuccess(_ response: CollectResponse) { print(response) retryCount = 0 - updateRevealInputs(tokens: response.records[0].fields) + if let record = response.records.first { + updateRevealInputs(record: record) + } print("Successfully got response:", response) } - internal func updateFailure(error: Any) { - if((error as AnyObject).contains("Invalid Bearer token") && retryCount <= 2){ // To do, it will be replaced with error code in the future + internal func updateFailure(error: SkyflowError) { + if error.message.contains("Invalid Bearer token") && retryCount <= 2 { // To do, it will be replaced with error code in the future retryCount += 1 submitForm() } print("Failed Operation", error) } - internal func updateRevealInputs(tokens: Fields) { + internal func updateRevealInputs(record: CollectRecord) { let revealBaseStyle = SkyflowFlowVault.Style( borderColor: UIColor.black, cornerRadius: 20, @@ -182,6 +194,11 @@ class CollectAndRevealViewController: UIViewController { textColor: UIColor.blue ) let revealStyles = SkyflowFlowVault.Styles(base: revealBaseStyle) + // A column maps to a list of Token(token:tokenGroupName:) - there's just one token + // group configured for these columns here, so take the first. + func token(for column: String) -> String { + record.tokens?[column]?.first?.token ?? "" + } DispatchQueue.main.async { if self.revealed { self.removeRevealElements() @@ -189,7 +206,7 @@ class CollectAndRevealViewController: UIViewController { self.revealed = true } let revealCardNumberInput = SkyflowFlowVault.RevealElementInput( - token: tokens.card_number, + token: token(for: "card_number"), inputStyles: revealStyles, label: "Card Number", redaction: .REDACTED @@ -199,14 +216,14 @@ class CollectAndRevealViewController: UIViewController { options: SkyflowFlowVault.RevealElementOptions() ) let revealCVVtInput = SkyflowFlowVault.RevealElementInput( - token: tokens.cvv, + token: token(for: "cvv"), inputStyles: revealStyles, label: "CVV", redaction: .MASKED ) self.revealCVV = self.revealContainer?.create(input: revealCVVtInput) let revealNameInput = SkyflowFlowVault.RevealElementInput( - token: tokens.cardholder_name, + token: token(for: "cardholder_name"), inputStyles: revealStyles, label: "Card Holder Name", redaction: .DEFAULT @@ -214,14 +231,14 @@ class CollectAndRevealViewController: UIViewController { ) self.revealName = self.revealContainer?.create(input: revealNameInput) let revealExpirationMonthInput = SkyflowFlowVault.RevealElementInput( - token: tokens.expiry_month, + token: token(for: "expiry_month"), inputStyles: revealStyles, label: "Expiration Month", redaction: .PLAIN_TEXT ) self.revealExpirationMonth = self.revealContainer?.create(input: revealExpirationMonthInput) let revealExpirationYearInput = SkyflowFlowVault.RevealElementInput( - token: tokens.expiry_year, + token: token(for: "expiry_year"), inputStyles: revealStyles, label: "Expiration Year" ) diff --git a/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample/ExampleAPICallback.swift b/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample/ExampleAPICallback.swift deleted file mode 100644 index cfdf3deb..00000000 --- a/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample/ExampleAPICallback.swift +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2022 Skyflow - */ - -import Foundation -import SkyflowFlowVault - -public class ExampleAPICallback: SkyflowFlowVault.Callback { - private var updateSuccess: ((SuccessResponse) -> Void)? - private var updateFailure: ((Any) -> Void)? - private var decoder: JSONDecoder? - - internal init(updateSuccess: @escaping (SuccessResponse) -> Void, updateFailure: @escaping (Any) -> Void) { - self.updateSuccess = updateSuccess - self.updateFailure = updateFailure - self.decoder = JSONDecoder() - } - - internal init() { - } - - public func onSuccess(_ responseBody: Any) { - if updateSuccess == nil { - print("success:", responseBody) - return - } - do { - let dataString = String(data: try! JSONSerialization.data(withJSONObject: responseBody), encoding: .utf8) - let responseData = Data(dataString!.utf8) - let jsonResponse = try decoder!.decode(SuccessResponse.self, from: responseData) - - updateSuccess!(jsonResponse) - - print("success:", jsonResponse) - } catch { - print("error deserializing", error) - } - } - - public func onFailure(_ error: Any) { - print(error) - if updateFailure != nil { - print("failure:", error) - return - } - print("onfailure", error) - } -} diff --git a/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample/ResponseStructs.swift b/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample/ResponseStructs.swift deleted file mode 100644 index 959044f5..00000000 --- a/SkyflowFlowVault/Samples/CollectAndRevealSample/CollectAndRevealSample/ResponseStructs.swift +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2022 Skyflow - */ - -import Foundation - -struct SuccessResponse: Codable { - let records: [Records] -} - -struct Records: Codable { - let fields: Fields - let table: String -} - -struct Fields: Codable { - let cardholder_name: String - let card_number: String - let expiry_month: String - let expiry_year: String - let cvv: String - let skyflow_id: String -} diff --git a/SkyflowFlowVault/Samples/ComposableElements/ComposableElements/ExampleAPICallback.swift b/SkyflowFlowVault/Samples/ComposableElements/ComposableElements/ExampleAPICallback.swift deleted file mode 100644 index cfdf3deb..00000000 --- a/SkyflowFlowVault/Samples/ComposableElements/ComposableElements/ExampleAPICallback.swift +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2022 Skyflow - */ - -import Foundation -import SkyflowFlowVault - -public class ExampleAPICallback: SkyflowFlowVault.Callback { - private var updateSuccess: ((SuccessResponse) -> Void)? - private var updateFailure: ((Any) -> Void)? - private var decoder: JSONDecoder? - - internal init(updateSuccess: @escaping (SuccessResponse) -> Void, updateFailure: @escaping (Any) -> Void) { - self.updateSuccess = updateSuccess - self.updateFailure = updateFailure - self.decoder = JSONDecoder() - } - - internal init() { - } - - public func onSuccess(_ responseBody: Any) { - if updateSuccess == nil { - print("success:", responseBody) - return - } - do { - let dataString = String(data: try! JSONSerialization.data(withJSONObject: responseBody), encoding: .utf8) - let responseData = Data(dataString!.utf8) - let jsonResponse = try decoder!.decode(SuccessResponse.self, from: responseData) - - updateSuccess!(jsonResponse) - - print("success:", jsonResponse) - } catch { - print("error deserializing", error) - } - } - - public func onFailure(_ error: Any) { - print(error) - if updateFailure != nil { - print("failure:", error) - return - } - print("onfailure", error) - } -} diff --git a/SkyflowFlowVault/Samples/ComposableElements/ComposableElements/ResponseStructs.swift b/SkyflowFlowVault/Samples/ComposableElements/ComposableElements/ResponseStructs.swift deleted file mode 100644 index 959044f5..00000000 --- a/SkyflowFlowVault/Samples/ComposableElements/ComposableElements/ResponseStructs.swift +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2022 Skyflow - */ - -import Foundation - -struct SuccessResponse: Codable { - let records: [Records] -} - -struct Records: Codable { - let fields: Fields - let table: String -} - -struct Fields: Codable { - let cardholder_name: String - let card_number: String - let expiry_month: String - let expiry_year: String - let cvv: String - let skyflow_id: String -} diff --git a/SkyflowFlowVault/Samples/ComposableElements/ComposableElements/ViewController.swift b/SkyflowFlowVault/Samples/ComposableElements/ComposableElements/ViewController.swift index cf71db43..e9955043 100644 --- a/SkyflowFlowVault/Samples/ComposableElements/ComposableElements/ViewController.swift +++ b/SkyflowFlowVault/Samples/ComposableElements/ComposableElements/ViewController.swift @@ -170,26 +170,43 @@ class ViewController: UIViewController { } } @objc func revealForm() { - self.revealContainer?.reveal(callback: ExampleAPICallback()) + self.revealContainer?.reveal( + callback: RevealCallback( + onSuccess: { (response: RevealResponse) in print("success:", response) }, + onFailure: { (error: SkyflowError) in print("failure:", error) } + ) + ) } @objc func submitForm() { - let exampleAPICallback = ExampleAPICallback(updateSuccess: updateSuccess, updateFailure: updateFailure) - container!.collect(callback: exampleAPICallback, options: SkyflowFlowVault.CollectOptions(tokens: true)) + container!.collect( + callback: CollectCallback( + onSuccess: { [weak self] (response: CollectResponse) in self?.updateSuccess(response) }, + onFailure: { [weak self] (error: SkyflowError) in self?.updateFailure(error: error) } + ), + options: SkyflowFlowVault.CollectOptions(tokens: true) + ) } - internal func updateSuccess(_ response: SuccessResponse) { + internal func updateSuccess(_ response: CollectResponse) { print(response) retryCount = 0 - updateRevealInputs(tokens: response.records[0].fields) + if let record = response.records.first { + updateRevealInputs(record: record) + } print("Successfully got response:", response) } - internal func updateFailure(error: Any) { - if((error as AnyObject).contains("Invalid Bearer token") && retryCount <= 2){ // To do, it will be replaced with error code in the future + internal func updateFailure(error: SkyflowError) { + if error.message.contains("Invalid Bearer token") && retryCount <= 2 { // To do, it will be replaced with error code in the future retryCount += 1 submitForm() } print("Failed Operation", error) } - internal func updateRevealInputs(tokens: Fields) { + internal func updateRevealInputs(record: CollectRecord) { + // A column maps to a list of Token(token:tokenGroupName:) - there's just one token + // group configured for these columns here, so take the first. + func token(for column: String) -> String { + record.tokens?[column]?.first?.token ?? "" + } let revealBaseStyle = SkyflowFlowVault.Style( borderColor: UIColor.black, cornerRadius: 20, @@ -206,7 +223,7 @@ class ViewController: UIViewController { self.revealed = true } let revealCardNumberInput = SkyflowFlowVault.RevealElementInput( - token: tokens.card_number, + token: token(for: "card_number"), inputStyles: revealStyles, label: "Card Number", redaction: .REDACTED @@ -216,14 +233,14 @@ class ViewController: UIViewController { options: SkyflowFlowVault.RevealElementOptions() ) let revealCVVtInput = SkyflowFlowVault.RevealElementInput( - token: tokens.cvv, + token: token(for: "cvv"), inputStyles: revealStyles, label: "CVV", redaction: .MASKED ) self.revealCVV = self.revealContainer?.create(input: revealCVVtInput) let revealNameInput = SkyflowFlowVault.RevealElementInput( - token: tokens.cardholder_name, + token: token(for: "cardholder_name"), inputStyles: revealStyles, label: "Card Holder Name", redaction: .DEFAULT @@ -231,14 +248,14 @@ class ViewController: UIViewController { ) self.revealName = self.revealContainer?.create(input: revealNameInput) let revealExpirationMonthInput = SkyflowFlowVault.RevealElementInput( - token: tokens.expiry_month, + token: token(for: "expiry_month"), inputStyles: revealStyles, label: "Expiration Month", redaction: .PLAIN_TEXT ) self.revealExpirationMonth = self.revealContainer?.create(input: revealExpirationMonthInput) let revealExpirationYearInput = SkyflowFlowVault.RevealElementInput( - token: tokens.expiry_year, + token: token(for: "expiry_year"), inputStyles: revealStyles, label: "Expiration Year" ) diff --git a/SkyflowFlowVault/Samples/InputFormatting/InputFormatting.xcodeproj/project.pbxproj b/SkyflowFlowVault/Samples/InputFormatting/InputFormatting.xcodeproj/project.pbxproj index 6605649c..4a079e02 100644 --- a/SkyflowFlowVault/Samples/InputFormatting/InputFormatting.xcodeproj/project.pbxproj +++ b/SkyflowFlowVault/Samples/InputFormatting/InputFormatting.xcodeproj/project.pbxproj @@ -17,15 +17,9 @@ 7C4197BD29F978A9002CA73E /* InputFormattingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197BC29F978A9002CA73E /* InputFormattingTests.swift */; }; 7C4197C729F978A9002CA73E /* InputFormattingUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197C629F978A9002CA73E /* InputFormattingUITests.swift */; }; 7C4197C929F978A9002CA73E /* InputFormattingUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197C829F978A9002CA73E /* InputFormattingUITestsLaunchTests.swift */; }; - 7C4197D629F97E9F002CA73E /* ExampleAPICallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197D529F97E9F002CA73E /* ExampleAPICallback.swift */; }; - 7C4197D729F97E9F002CA73E /* ExampleAPICallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197D529F97E9F002CA73E /* ExampleAPICallback.swift */; }; - 7C4197D829F97E9F002CA73E /* ExampleAPICallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197D529F97E9F002CA73E /* ExampleAPICallback.swift */; }; 7C4197DA29F97ED2002CA73E /* ExampleTokenProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197D929F97ED2002CA73E /* ExampleTokenProvider.swift */; }; 7C4197DB29F97ED2002CA73E /* ExampleTokenProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197D929F97ED2002CA73E /* ExampleTokenProvider.swift */; }; 7C4197DC29F97ED2002CA73E /* ExampleTokenProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197D929F97ED2002CA73E /* ExampleTokenProvider.swift */; }; - 7C4197DE29F97EFD002CA73E /* ResponseStructs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197DD29F97EFD002CA73E /* ResponseStructs.swift */; }; - 7C4197DF29F97EFD002CA73E /* ResponseStructs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197DD29F97EFD002CA73E /* ResponseStructs.swift */; }; - 7C4197E029F97EFD002CA73E /* ResponseStructs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4197DD29F97EFD002CA73E /* ResponseStructs.swift */; }; 8E4FC698E4F6F8422455BB76 /* Pods_InputFormatting_InputFormattingUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 362238A2034F5E696B5CB492 /* Pods_InputFormatting_InputFormattingUITests.framework */; }; 96007AFE98552781CD9CA0FB /* Pods_InputFormatting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15DB42C2155F11A364E2EA97 /* Pods_InputFormatting.framework */; }; /* End PBXBuildFile section */ @@ -66,9 +60,7 @@ 7C4197C229F978A9002CA73E /* InputFormattingUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = InputFormattingUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 7C4197C629F978A9002CA73E /* InputFormattingUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputFormattingUITests.swift; sourceTree = ""; }; 7C4197C829F978A9002CA73E /* InputFormattingUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputFormattingUITestsLaunchTests.swift; sourceTree = ""; }; - 7C4197D529F97E9F002CA73E /* ExampleAPICallback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleAPICallback.swift; sourceTree = ""; }; 7C4197D929F97ED2002CA73E /* ExampleTokenProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleTokenProvider.swift; sourceTree = ""; }; - 7C4197DD29F97EFD002CA73E /* ResponseStructs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseStructs.swift; sourceTree = ""; }; B4544E89336067DF84CD3C85 /* Pods-InputFormatting.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-InputFormatting.debug.xcconfig"; path = "Target Support Files/Pods-InputFormatting/Pods-InputFormatting.debug.xcconfig"; sourceTree = ""; }; BD7E5EBA615A5DD2B93E86DB /* Pods-InputFormattingTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-InputFormattingTests.release.xcconfig"; path = "Target Support Files/Pods-InputFormattingTests/Pods-InputFormattingTests.release.xcconfig"; sourceTree = ""; }; D28B0C4C19EA3040136B35C5 /* Pods_InputFormattingTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_InputFormattingTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -135,9 +127,7 @@ 7C4197AE29F978A9002CA73E /* Assets.xcassets */, 7C4197B029F978A9002CA73E /* LaunchScreen.storyboard */, 7C4197B329F978A9002CA73E /* Info.plist */, - 7C4197D529F97E9F002CA73E /* ExampleAPICallback.swift */, 7C4197D929F97ED2002CA73E /* ExampleTokenProvider.swift */, - 7C4197DD29F97EFD002CA73E /* ResponseStructs.swift */, ); path = InputFormatting; sourceTree = ""; @@ -422,10 +412,8 @@ buildActionMask = 2147483647; files = ( 7C4197AA29F978A8002CA73E /* ViewController.swift in Sources */, - 7C4197DE29F97EFD002CA73E /* ResponseStructs.swift in Sources */, 7C4197DA29F97ED2002CA73E /* ExampleTokenProvider.swift in Sources */, 7C4197A629F978A8002CA73E /* AppDelegate.swift in Sources */, - 7C4197D629F97E9F002CA73E /* ExampleAPICallback.swift in Sources */, 7C4197A829F978A8002CA73E /* SceneDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -434,10 +422,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7C4197D729F97E9F002CA73E /* ExampleAPICallback.swift in Sources */, 7C4197DB29F97ED2002CA73E /* ExampleTokenProvider.swift in Sources */, 7C4197BD29F978A9002CA73E /* InputFormattingTests.swift in Sources */, - 7C4197DF29F97EFD002CA73E /* ResponseStructs.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -445,10 +431,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7C4197E029F97EFD002CA73E /* ResponseStructs.swift in Sources */, 7C4197C929F978A9002CA73E /* InputFormattingUITestsLaunchTests.swift in Sources */, 7C4197DC29F97ED2002CA73E /* ExampleTokenProvider.swift in Sources */, - 7C4197D829F97E9F002CA73E /* ExampleAPICallback.swift in Sources */, 7C4197C729F978A9002CA73E /* InputFormattingUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/SkyflowFlowVault/Samples/InputFormatting/InputFormatting/ExampleAPICallback.swift b/SkyflowFlowVault/Samples/InputFormatting/InputFormatting/ExampleAPICallback.swift deleted file mode 100644 index 7cf1c0a0..00000000 --- a/SkyflowFlowVault/Samples/InputFormatting/InputFormatting/ExampleAPICallback.swift +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2022 Skyflow - */ -// Created by Bharti Sagar on 26/04/23. -// - -import Foundation -import SkyflowFlowVault - -public class ExampleAPICallback: SkyflowFlowVault.Callback { - private var updateSuccess: ((SuccessResponse) -> Void)? - private var updateFailure: ((Any) -> Void)? - private var decoder: JSONDecoder? - - internal init(updateSuccess: @escaping (SuccessResponse) -> Void, updateFailure: @escaping (Any) -> Void) { - self.updateSuccess = updateSuccess - self.updateFailure = updateFailure - self.decoder = JSONDecoder() - } - - internal init() { - } - - public func onSuccess(_ responseBody: Any) { - if updateSuccess == nil { - print("success:", responseBody) - return - } - do { - let dataString = String(data: try! JSONSerialization.data(withJSONObject: responseBody), encoding: .utf8) - let responseData = Data(dataString!.utf8) - let jsonResponse = try decoder!.decode(SuccessResponse.self, from: responseData) - - updateSuccess!(jsonResponse) - - print("success:", jsonResponse) - } catch { - print("error deserializing", error) - } - } - - public func onFailure(_ error: Any) { - print(error) - if updateFailure != nil { - print("failure:", error) - return - } - print("onfailure", error) - } -} diff --git a/SkyflowFlowVault/Samples/InputFormatting/InputFormatting/ResponseStructs.swift b/SkyflowFlowVault/Samples/InputFormatting/InputFormatting/ResponseStructs.swift deleted file mode 100644 index 2230b92f..00000000 --- a/SkyflowFlowVault/Samples/InputFormatting/InputFormatting/ResponseStructs.swift +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2022 Skyflow - */ - -// Created by Bharti Sagar on 26/04/23. -// - -import Foundation - -struct SuccessResponse: Codable { - let records: [Records] -} - -struct Records: Codable { - let fields: Fields - let table: String -} - -struct Fields: Codable { - let cardholder_name: String - let card_number: String - let expiry_month: String - let expiry_year: String - let cvv: String - let ssn: String - let phone_number: String - let license_number: String - let skyflow_id: String -} diff --git a/SkyflowFlowVault/Samples/InputFormatting/InputFormatting/ViewController.swift b/SkyflowFlowVault/Samples/InputFormatting/InputFormatting/ViewController.swift index 0616287e..2a3eb25f 100644 --- a/SkyflowFlowVault/Samples/InputFormatting/InputFormatting/ViewController.swift +++ b/SkyflowFlowVault/Samples/InputFormatting/InputFormatting/ViewController.swift @@ -201,21 +201,38 @@ class ViewController: UIViewController { } } @objc func revealForm() { - self.revealContainer?.reveal(callback: ExampleAPICallback()) + self.revealContainer?.reveal( + callback: RevealCallback( + onSuccess: { (response: RevealResponse) in print("success:", response) }, + onFailure: { (error: SkyflowError) in print("failure:", error) } + ) + ) } @objc func submitForm() { - let exampleAPICallback = ExampleAPICallback(updateSuccess: updateSuccess, updateFailure: updateFailure) - container!.collect(callback: exampleAPICallback, options: SkyflowFlowVault.CollectOptions(tokens: true)) + container!.collect( + callback: CollectCallback( + onSuccess: { [weak self] (response: CollectResponse) in self?.updateSuccess(response) }, + onFailure: { [weak self] (error: SkyflowError) in self?.updateFailure(error: error) } + ), + options: SkyflowFlowVault.CollectOptions(tokens: true) + ) } - internal func updateSuccess(_ response: SuccessResponse) { + internal func updateSuccess(_ response: CollectResponse) { print(response) - updateRevealInputs(tokens: response.records[0].fields) + if let record = response.records.first { + updateRevealInputs(record: record) + } print("Successfully got response:", response) } - internal func updateFailure(error: Any) { + internal func updateFailure(error: SkyflowError) { print("Failed Operation", error) } - internal func updateRevealInputs(tokens: Fields) { + internal func updateRevealInputs(record: CollectRecord) { + // A column maps to a list of Token(token:tokenGroupName:) - there's just one token + // group configured for these columns here, so take the first. + func token(for column: String) -> String { + record.tokens?[column]?.first?.token ?? "" + } let revealBaseStyle = SkyflowFlowVault.Style( borderColor: UIColor.black, cornerRadius: 20, @@ -232,7 +249,7 @@ class ViewController: UIViewController { self.revealed = true } let revealCardNumberInput = SkyflowFlowVault.RevealElementInput( - token: tokens.card_number, + token: token(for: "card_number"), inputStyles: revealStyles, label: "Card Number" ) @@ -241,43 +258,43 @@ class ViewController: UIViewController { options: SkyflowFlowVault.RevealElementOptions(format: "XXXX-XXXX-XXXX-XXXX-XXX", translation: ["X": "[0-9]"]) ) let revealCVVtInput = SkyflowFlowVault.RevealElementInput( - token: tokens.cvv, + token: token(for: "cvv"), inputStyles: revealStyles, label: "CVV" ) self.revealCVV = self.revealContainer?.create(input: revealCVVtInput) let revealNameInput = SkyflowFlowVault.RevealElementInput( - token: tokens.cardholder_name, + token: token(for: "cardholder_name"), inputStyles: revealStyles, label: "Card Holder Name" ) self.revealName = self.revealContainer?.create(input: revealNameInput) let revealExpirationMonthInput = SkyflowFlowVault.RevealElementInput( - token: tokens.expiry_month, + token: token(for: "expiry_month"), inputStyles: revealStyles, label: "Expiration Month" ) self.revealExpirationMonth = self.revealContainer?.create(input: revealExpirationMonthInput) let revealExpirationYearInput = SkyflowFlowVault.RevealElementInput( - token: tokens.expiry_year, + token: token(for: "expiry_year"), inputStyles: revealStyles, label: "Expiration Year" ) self.revealExpirationYear = self.revealContainer?.create(input: revealExpirationYearInput) let revealSSNInput = SkyflowFlowVault.RevealElementInput( - token: tokens.ssn, + token: token(for: "ssn"), inputStyles: revealStyles, label: "SSN" ) self.revealSSN = self.revealContainer?.create(input: revealSSNInput, options: SkyflowFlowVault.RevealElementOptions(format: "XXX XX XXXX", translation: ["X": "[0-9]"])) let revealPhoneNumberInput = SkyflowFlowVault.RevealElementInput( - token: tokens.phone_number, + token: token(for: "phone_number"), inputStyles: revealStyles, label: "Phone Number" ) self.revealPhoneNumber = self.revealContainer?.create(input: revealPhoneNumberInput, options: SkyflowFlowVault.RevealElementOptions(format: "+91 XXXX-XX-XXXX", translation: ["X": "[0-9]"])) let revealLicenseNumberInput = SkyflowFlowVault.RevealElementInput( - token: tokens.phone_number, + token: token(for: "phone_number"), inputStyles: revealStyles, label: "License Number" ) diff --git a/SkyflowFlowVault/Samples/UpdateDataUsingElements/UpdateDataUsingElements/ExampleAPICallback.swift b/SkyflowFlowVault/Samples/UpdateDataUsingElements/UpdateDataUsingElements/ExampleAPICallback.swift deleted file mode 100644 index bd93892c..00000000 --- a/SkyflowFlowVault/Samples/UpdateDataUsingElements/UpdateDataUsingElements/ExampleAPICallback.swift +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2022 Skyflow - */ - -import Foundation -import SkyflowFlowVault - -public class ExampleAPICallback: SkyflowFlowVault.Callback { - private var updateSuccess: ((SuccessResponse) -> Void)? - private var updateFailure: ((Any) -> Void)? - private var decoder: JSONDecoder? - - internal init(updateSuccess: @escaping (Any) -> Void, updateFailure: @escaping (Any) -> Void) { - self.updateSuccess = updateSuccess - self.updateFailure = updateFailure - self.decoder = JSONDecoder() - } - - internal init() { - } - - public func onSuccess(_ responseBody: Any) { - if updateSuccess == nil { - print("success:", responseBody) - return - } - do { - let dataString = String(data: try! JSONSerialization.data(withJSONObject: responseBody), encoding: .utf8) - let responseData = Data(dataString!.utf8) - let jsonResponse = try decoder!.decode(SuccessResponse.self, from: responseData) - - updateSuccess!(jsonResponse) - - print("success:", jsonResponse) - } catch { - print("error deserializing", error) - } - } - - public func onFailure(_ error: Any) { - print(error) - if updateFailure != nil { - print("failure:", error) - return - } - print("onfailure", error) - } -} diff --git a/SkyflowFlowVault/Samples/UpdateDataUsingElements/UpdateDataUsingElements/ResponseStructs.swift b/SkyflowFlowVault/Samples/UpdateDataUsingElements/UpdateDataUsingElements/ResponseStructs.swift deleted file mode 100644 index 4b948ce6..00000000 --- a/SkyflowFlowVault/Samples/UpdateDataUsingElements/UpdateDataUsingElements/ResponseStructs.swift +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2022 Skyflow - */ - -import Foundation - -struct SuccessResponse: Codable { - let records: [Records] -} - -struct Records: Codable { - let fields: Fields? - let table: String - let skyflow_id: String? -} - -struct Fields: Codable { - let cardholder_name: String? - let card_number: String? - let expiry_month: String? - let expiry_year: String? - let cvv: String? - let skyflow_id: String? -} diff --git a/SkyflowFlowVault/Samples/UpdateDataUsingElements/UpdateDataUsingElements/ViewController.swift b/SkyflowFlowVault/Samples/UpdateDataUsingElements/UpdateDataUsingElements/ViewController.swift index ebc6c24f..31ceed84 100644 --- a/SkyflowFlowVault/Samples/UpdateDataUsingElements/UpdateDataUsingElements/ViewController.swift +++ b/SkyflowFlowVault/Samples/UpdateDataUsingElements/UpdateDataUsingElements/ViewController.swift @@ -164,16 +164,21 @@ class ViewController: UIViewController { } @objc func submitForm() { - let exampleAPICallback = ExampleAPICallback(updateSuccess: updateSuccess, updateFailure: updateFailure) - container!.collect(callback: exampleAPICallback, options: SkyflowFlowVault.CollectOptions(tokens: true)) + container!.collect( + callback: CollectCallback( + onSuccess: { [weak self] (response: CollectResponse) in self?.updateSuccess(response) }, + onFailure: { [weak self] (error: SkyflowError) in self?.updateFailure(error: error) } + ), + options: SkyflowFlowVault.CollectOptions(tokens: true) + ) } - internal func updateSuccess(_ response: SuccessResponse) { + internal func updateSuccess(_ response: CollectResponse) { print(response) retryCount = 0 print("Successfully got response:", response) } - internal func updateFailure(error: Any) { - if((error as AnyObject).contains("Invalid Bearer token") && retryCount <= 2){ // To do, it will be replaced with error code in the future + internal func updateFailure(error: SkyflowError) { + if error.message.contains("Invalid Bearer token") && retryCount <= 2 { // To do, it will be replaced with error code in the future retryCount += 1 submitForm() } diff --git a/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature.xcodeproj/project.pbxproj b/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature.xcodeproj/project.pbxproj index b06950f8..9387c88a 100644 --- a/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature.xcodeproj/project.pbxproj +++ b/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature.xcodeproj/project.pbxproj @@ -13,7 +13,6 @@ 9818DE9F29239C17004C72AE /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9818DE9D29239C17004C72AE /* Main.storyboard */; }; 9818DEA129239C1C004C72AE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9818DEA029239C1C004C72AE /* Assets.xcassets */; }; 9818DEA429239C1C004C72AE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9818DEA229239C1C004C72AE /* LaunchScreen.storyboard */; }; - 9818DEAC29239C87004C72AE /* ResponseStructs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9818DEAB29239C87004C72AE /* ResponseStructs.swift */; }; 9818DEB029239CD0004C72AE /* ExampleTokenProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9818DEAF29239CD0004C72AE /* ExampleTokenProvider.swift */; }; 9818DEB229239CD9004C72AE /* ExampleAPICallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9818DEB129239CD9004C72AE /* ExampleAPICallback.swift */; }; 9818DEB82923B61D004C72AE /* Skyflow in Frameworks */ = {isa = PBXBuildFile; productRef = 9818DEB72923B61D004C72AE /* Skyflow */; }; @@ -28,7 +27,6 @@ 9818DEA029239C1C004C72AE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9818DEA329239C1C004C72AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 9818DEA529239C1C004C72AE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9818DEAB29239C87004C72AE /* ResponseStructs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseStructs.swift; sourceTree = ""; }; 9818DEAF29239CD0004C72AE /* ExampleTokenProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ExampleTokenProvider.swift; path = ../../Upsert/Upsert/ExampleTokenProvider.swift; sourceTree = ""; }; 9818DEB129239CD9004C72AE /* ExampleAPICallback.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ExampleAPICallback.swift; path = ../../Upsert/Upsert/ExampleAPICallback.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -69,7 +67,6 @@ 9818DE9B29239C17004C72AE /* ViewController.swift */, 9818DEB129239CD9004C72AE /* ExampleAPICallback.swift */, 9818DEAF29239CD0004C72AE /* ExampleTokenProvider.swift */, - 9818DEAB29239C87004C72AE /* ResponseStructs.swift */, 9818DE9D29239C17004C72AE /* Main.storyboard */, 9818DEA029239C1C004C72AE /* Assets.xcassets */, 9818DEA229239C1C004C72AE /* LaunchScreen.storyboard */, @@ -159,7 +156,6 @@ 9818DE9829239C17004C72AE /* AppDelegate.swift in Sources */, 9818DEB229239CD9004C72AE /* ExampleAPICallback.swift in Sources */, 9818DE9A29239C17004C72AE /* SceneDelegate.swift in Sources */, - 9818DEAC29239C87004C72AE /* ResponseStructs.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature/ResponseStructs.swift b/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature/ResponseStructs.swift deleted file mode 100644 index 6ea1a8a6..00000000 --- a/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature/ResponseStructs.swift +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2022 Skyflow - */ - -import Foundation - -struct SuccessResponse: Codable { - let records: [Records] -} - -struct Records: Codable { - let fields: Fields - let table: String -} - -struct Fields: Codable { - let cardnumber: String - let cvv: String - let skyflow_id: String -} diff --git a/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature/ViewController.swift b/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature/ViewController.swift index 060519aa..3a971da6 100644 --- a/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature/ViewController.swift +++ b/SkyflowFlowVault/Samples/UpsertFeature/UpsertFeature/ViewController.swift @@ -150,17 +150,29 @@ class ViewController: UIViewController { } @objc func revealForm() { - self.revealContainer?.reveal(callback: ExampleAPICallback()) + self.revealContainer?.reveal( + callback: RevealCallback( + onSuccess: { (response: RevealResponse) in print("success:", response) }, + onFailure: { (error: SkyflowError) in print("failure:", error) } + ) + ) } @objc func submitForm() { - let exampleAPICallback = ExampleAPICallback(updateSuccess: updateSuccess, updateFailure: updateFailure) let upsertOptions = [["table": "persons", "column": "cardnumber"]] as [[String: Any]] - container!.collect(callback: exampleAPICallback, options: SkyflowFlowVault.CollectOptions(tokens: true)) + container!.collect( + callback: CollectCallback( + onSuccess: { [weak self] (response: CollectResponse) in self?.updateSuccess(response) }, + onFailure: { [weak self] (_: SkyflowError) in self?.updateFailure() } + ), + options: SkyflowFlowVault.CollectOptions(tokens: true) + ) } - internal func updateSuccess(_ response: SuccessResponse) { - updateRevealInputs(tokens: response.records[0].fields) + internal func updateSuccess(_ response: CollectResponse) { + if let record = response.records.first { + updateRevealInputs(record: record) + } print("Successfully got response:", response) } @@ -168,7 +180,12 @@ class ViewController: UIViewController { print("Failed Operation") } - internal func updateRevealInputs(tokens: Fields) { + internal func updateRevealInputs(record: CollectRecord) { + // A column maps to a list of Token(token:tokenGroupName:) - there's just one token + // group configured for these columns here, so take the first. + func token(for column: String) -> String { + record.tokens?[column]?.first?.token ?? "" + } let revealBaseStyle = SkyflowFlowVault.Style( borderColor: UIColor.black, cornerRadius: 20, @@ -185,7 +202,7 @@ class ViewController: UIViewController { self.revealed = true } let revealCardNumberInput = SkyflowFlowVault.RevealElementInput( - token: tokens.cardnumber, + token: token(for: "cardnumber"), inputStyles: revealStyles, label: "Card Number", redaction: .DEFAULT @@ -195,7 +212,7 @@ class ViewController: UIViewController { options: SkyflowFlowVault.RevealElementOptions() ) let revealCvvInput = SkyflowFlowVault.RevealElementInput( - token: tokens.cvv, + token: token(for: "cvv"), inputStyles: revealStyles, label: "Cvv", redaction: .DEFAULT diff --git a/SkyflowFlowVault/Sources/composable/ComposableContainerOperations.swift b/SkyflowFlowVault/Sources/composable/ComposableContainerOperations.swift index c65c8c98..80fe508b 100644 --- a/SkyflowFlowVault/Sources/composable/ComposableContainerOperations.swift +++ b/SkyflowFlowVault/Sources/composable/ComposableContainerOperations.swift @@ -8,7 +8,7 @@ import Foundation import UIKit public extension Container { - func collect(callback: Callback, options: CollectOptions? = CollectOptions()) where T: ComposableContainer { + func collect(callback: CollectCallback, options: CollectOptions? = CollectOptions()) where T: ComposableContainer { var tempContextOptions = self.skyflow.contextOptions tempContextOptions.interface = .COMPOSABLE_CONTAINER if let errorCode = CoreRequestValidators.checkClientConfig(vaultID: self.skyflow.vaultID, vaultURL: self.skyflow.vaultURL) { diff --git a/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/DemoImpl.swift b/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/DemoImpl.swift index 0f1c7e55..89d11af8 100644 --- a/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/DemoImpl.swift +++ b/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/DemoImpl.swift @@ -65,4 +65,10 @@ public class DemoAPICallback: Callback { } expectation.fulfill() } + + // Composable Container.collect(callback:) requires the concrete CollectCallback type - + // this wraps self so existing DemoAPICallback call sites only need a one-word change. + var asCollectCallback: CollectCallback { + CollectCallback(onSuccess: { self.onSuccess($0) }, onFailure: { self.onFailure($0) }) + } } diff --git a/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/skyflow_iOS_composableEelementsTests.swift b/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/skyflow_iOS_composableEelementsTests.swift index 0253054b..a0f3d8a1 100644 --- a/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/skyflow_iOS_composableEelementsTests.swift +++ b/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/skyflow_iOS_composableEelementsTests.swift @@ -211,7 +211,7 @@ final class skyflow_iOS_composableEelementsTests: XCTestCase { let callback = DemoAPICallback(expectation: expectation) - container?.collect(callback: callback) + container?.collect(callback: callback.asCollectCallback) wait(for: [expectation], timeout: 10.0) @@ -258,7 +258,7 @@ final class skyflow_iOS_composableEelementsTests: XCTestCase { let callback = DemoAPICallback(expectation: expectation) - container?.collect(callback: callback) + container?.collect(callback: callback.asCollectCallback) wait(for: [expectation], timeout: 10.0) @@ -288,7 +288,7 @@ final class skyflow_iOS_composableEelementsTests: XCTestCase { let callback = DemoAPICallback(expectation: expectation) - container?.collect(callback: callback) + container?.collect(callback: callback.asCollectCallback) wait(for: [expectation], timeout: 10.0) @@ -316,7 +316,7 @@ final class skyflow_iOS_composableEelementsTests: XCTestCase { textField?.textFieldDidEndEditing(textField!.textField) let expectFailure = XCTestExpectation(description: "Should fail") let myCallback = DemoAPICallback(expectation: expectFailure) - mycontainer?.collect(callback: myCallback) + mycontainer?.collect(callback: myCallback.asCollectCallback) wait(for: [expectFailure], timeout: 10.0) XCTAssertEqual(myCallback.receivedResponse, "for cardnumber INVALID_CARD_NUMBER\n") @@ -344,7 +344,7 @@ final class skyflow_iOS_composableEelementsTests: XCTestCase { let expectFailure = XCTestExpectation(description: "Should fail") let myCallback = DemoAPICallback(expectation: expectFailure) - mycontainer?.collect(callback: myCallback) + mycontainer?.collect(callback: myCallback.asCollectCallback) wait(for: [expectFailure], timeout: 10.0) XCTAssertEqual(myCallback.receivedResponse, "for cardnumber triggered error\n") @@ -501,7 +501,7 @@ final class skyflow_iOS_composableEelementsTests: XCTestCase { let expectation = XCTestExpectation() let callback = DemoAPICallback(expectation: expectation) - container?.collect(callback: callback) + container?.collect(callback: callback.asCollectCallback) wait(for: [expectation], timeout: 20.0) diff --git a/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/skyflow_iOS_composableFlowTests.swift b/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/skyflow_iOS_composableFlowTests.swift index 4085a8fd..c63dd543 100644 --- a/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/skyflow_iOS_composableFlowTests.swift +++ b/SkyflowFlowVault/Tests/skyflow-iOS-composableTests/skyflow_iOS_composableFlowTests.swift @@ -32,7 +32,7 @@ final class skyflow_iOS_composableFlowTests: XCTestCase { let expectation = XCTestExpectation(description: "composable collect with unmounted element should fail") let callback = DemoAPICallback(expectation: expectation) - container!.collect(callback: callback) + container!.collect(callback: callback.asCollectCallback) wait(for: [expectation], timeout: 10.0) XCTAssertEqual(callback.receivedResponse, ErrorCodes.UNMOUNTED_COLLECT_ELEMENT(value: "name").description) @@ -45,7 +45,7 @@ final class skyflow_iOS_composableFlowTests: XCTestCase { let expectation = XCTestExpectation(description: "composable collect with empty additionalFields should fail") let callback = DemoAPICallback(expectation: expectation) - container!.collect(callback: callback, options: CollectOptions(additionalFields: AdditionalFields(records: []))) + container!.collect(callback: callback.asCollectCallback, options: CollectOptions(additionalFields: AdditionalFields(records: []))) wait(for: [expectation], timeout: 10.0) XCTAssertEqual(callback.receivedResponse, ErrorCodes.EMPTY_RECORDS_OBJECT().description) @@ -58,7 +58,7 @@ final class skyflow_iOS_composableFlowTests: XCTestCase { let expectation = XCTestExpectation(description: "composable collect with empty upsert should fail") let callback = DemoAPICallback(expectation: expectation) - container!.collect(callback: callback, options: CollectOptions(upsert: [])) + container!.collect(callback: callback.asCollectCallback, options: CollectOptions(upsert: [])) wait(for: [expectation], timeout: 10.0) XCTAssertEqual(callback.receivedResponse, ErrorCodes.UPSERT_OPTION_CANNOT_BE_EMPTY().description) @@ -76,7 +76,7 @@ final class skyflow_iOS_composableFlowTests: XCTestCase { let expectation = XCTestExpectation(description: "composable collect should reach the network layer and fail offline") let callback = DemoAPICallback(expectation: expectation) - container!.collect(callback: callback, options: options) + container!.collect(callback: callback.asCollectCallback, options: options) wait(for: [expectation], timeout: 20.0) // The whole request-building path (validators, CollectRequestBuilder, CVV