Skip to content

Commit

Permalink
Public release 1.16.0
Browse files Browse the repository at this point in the history
Public release 1.16.0.
  • Loading branch information
dmytrokhl committed Jan 25, 2024
2 parents dc83015 + 742ce6e commit 8086379
Show file tree
Hide file tree
Showing 35 changed files with 1,843 additions and 96 deletions.
5 changes: 5 additions & 0 deletions MIGRATING.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
## Migration Guides

### Migrating from versions < v1.16.0
#### Rename state classes
`CardState` -> `VGSCardState`
`SSNState` -> `VGSSSNState`

### Migrating from versions < v1.12.0
#### `VGSCollectSDK/CardScan` scan module deprecated.
Use `VGSCollectSDK/CardIO` or `VGSCollectSDK/BlinkCard` as card scan solution instead.
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,8 @@ Use your `<vaultId>` to initialize VGSCollect instance. You can get it in your [
textField.borderColor = .red
}

/// CardState is available for VGSCardTextField
if let cardState = textField.state as? CardState {
/// VGSCardState is available for VGSCardTextField
if let cardState = textField.state as? VGSCardState {
print(cardState.bin)
print(cardState.last4)
print(cardState.brand.stringValue)
Expand Down
109 changes: 109 additions & 0 deletions Sources/VGSCardIOCollector/VGSCardIOViewControllerRepresentable.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
//
// VGSCardIOViewControllerRepresentable.swift
// VGSCardIOCollector
//
// Created by Dmytro on 25.01.2024.
// Copyright © 2024 VGS. All rights reserved.
//

import Foundation
import SwiftUI
import CardIO

#if !COCOAPODS
import VGSCollectSDK
#endif

public struct VGSCardIOViewControllerRepresentable: UIViewControllerRepresentable {

var fieldMappingPolicy = [CradIODataType: VGSTextField]()

public var onCardScanned: (() -> Void)?

public init(fieldMappingPolicy: [CradIODataType : VGSTextField] = [CradIODataType: VGSTextField]()) {
self.fieldMappingPolicy = fieldMappingPolicy
}

public func makeUIViewController(context: Context) -> CardIOPaymentViewController {
let vc = CardIOPaymentViewController(paymentDelegate: context.coordinator, scanningEnabled: true, preferredDevicePosition: .unspecified)
vc?.hideCardIOLogo = true
return vc!
}

public func updateUIViewController(_ uiViewController: CardIOPaymentViewController, context: Context) {

}

public func onCardScanned(_ action: (() -> Void)?) -> VGSCardIOViewControllerRepresentable {
var newRepresentable = self
newRepresentable.onCardScanned = action
return newRepresentable
}

public func makeCoordinator() -> Coordinator {
Coordinator(self)
}

public class Coordinator: NSObject, CardIOPaymentViewControllerDelegate {
var parent: VGSCardIOViewControllerRepresentable

init(_ parent: VGSCardIOViewControllerRepresentable) {
self.parent = parent
}

public func userDidCancel(_ paymentViewController: CardIOPaymentViewController!) {
self.parent.onCardScanned?()
}

public func userDidProvide(_ cardInfo: CardIOCreditCardInfo!, in paymentViewController: CardIOPaymentViewController!) {
guard let cardInfo = cardInfo else {
self.parent.onCardScanned?()
return
}
let fields = parent.fieldMappingPolicy

if !cardInfo.cardNumber.isEmpty, let textfield = fields[CradIODataType.cardNumber] {
if let form = textfield.configuration?.vgsCollector {
VGSAnalyticsClient.shared.trackFormEvent(form.formAnalyticsDetails, type: .scan, status: .success, extraData: [ "scannerType": "CardIO"])
}
textfield.setText(cardInfo.cardNumber)
}

let expiryDateData = VGSCardIOExpirationDate(month: cardInfo.expiryMonth, year: cardInfo.expiryYear)

if let defaultExpirationDate = VGSCardIODataMapUtils.mapCardExpirationData(expiryDateData, scannedDataType: .expirationDate), let textfield = fields[CradIODataType.expirationDate] {
textfield.setText(defaultExpirationDate)
}

if let longExpirationDate = VGSCardIODataMapUtils.mapCardExpirationData(expiryDateData, scannedDataType: .expirationDateLong), let textfield = fields[CradIODataType.expirationDateLong] {
textfield.setText(longExpirationDate)
}

if let shortExpirationDateWithYearFirst = VGSCardIODataMapUtils.mapCardExpirationData(expiryDateData, scannedDataType: .expirationDateShortYearThenMonth), let textfield = fields[CradIODataType.expirationDateShortYearThenMonth] {
textfield.setText(shortExpirationDateWithYearFirst)
}

if let longExpirationDateWithYearFirst = VGSCardIODataMapUtils.mapCardExpirationData(expiryDateData, scannedDataType: .expirationDateLongYearThenMonth), let textfield = fields[CradIODataType.expirationDateLongYearThenMonth] {
textfield.setText(longExpirationDateWithYearFirst)
}

if let expiryMonth = VGSCardIODataMapUtils.mapCardExpirationData(expiryDateData, scannedDataType: .expirationMonth), let textfield = fields[CradIODataType.expirationMonth] {
textfield.setText(expiryMonth)
}

if let expiryYear = VGSCardIODataMapUtils.mapCardExpirationData(expiryDateData, scannedDataType: .expirationYear), let textfield = fields[CradIODataType.expirationYear] {
textfield.setText(expiryYear)
}

if let expiryYearLong = VGSCardIODataMapUtils.mapCardExpirationData(expiryDateData, scannedDataType: .expirationYearLong), let textfield = fields[CradIODataType.expirationYearLong] {
textfield.setText(expiryYearLong)
}

if let cvc = cardInfo.cvv, !cvc.isEmpty, let textfield = fields[CradIODataType.cvc] {
textfield.setText(cvc)
}

self.parent.onCardScanned?()
}
}
}
10 changes: 5 additions & 5 deletions Sources/VGSCollectSDK/UIElements/Text Field/State/State.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import UIKit
#endif

/// An object that describes `VGSTextField` state. State attributes are read-only.
public class State {
public class VGSTextFieldState {

/// `VGSConfiguration.fieldName` associated with `VGSTextField`
internal(set) open var fieldName: String!
Expand Down Expand Up @@ -70,7 +70,7 @@ public class State {
}

/// An object that describes `VGSTextField` state with configuration `FieldType.cardNumber` . State attributes are read-only.
public class CardState: State {
public class VGSCardState: VGSTextFieldState {

/// Last 4 digits of the valid card number from associated `VGSTextField` with field configuration type `FieldType.cardNumber`.
internal(set) open var last4: String = ""
Expand All @@ -95,7 +95,7 @@ public class CardState: State {
}
}

/// Message that contains `CardState` attributes and their values.
/// Message that contains `VGSCardState` attributes and their values.
override public var description: String {
var result = super.description
if isValid {
Expand Down Expand Up @@ -132,7 +132,7 @@ public class CardState: State {
}

/// An object that describes `VGSTextField` state with configuration `FieldType.ssn` . State attributes are read-only.
public class SSNState: State {
public class VGSSSNState: VGSTextFieldState {

/// Last 4 digits of the valid ssn from associated `VGSTextField` with field configuration type `FieldType.ssn`.
internal(set) open var last4: String = ""
Expand All @@ -148,7 +148,7 @@ public class SSNState: State {
}
}

/// Message that contains `SSNState` attributes and their values.
/// Message that contains `VGSSSNState` attributes and their values.
override public var description: String {
var result = super.description
if isValid {
Expand Down
Loading

0 comments on commit 8086379

Please sign in to comment.