Skip to content

Commit

Permalink
Add CreditCardDetailsController
Browse files Browse the repository at this point in the history
  • Loading branch information
3lvis committed Jun 14, 2024
1 parent 772755a commit 77422c5
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Vanilla/Vanilla.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
282B13122C1BE91F00FB13F1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 282B13112C1BE91F00FB13F1 /* Assets.xcassets */; };
282B13152C1BE91F00FB13F1 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 282B13142C1BE91F00FB13F1 /* Base */; };
2867CE842C1BE96E004C821F /* FormTextField in Frameworks */ = {isa = PBXBuildFile; productRef = 2867CE832C1BE96E004C821F /* FormTextField */; };
28EE88A72C1C83A7000EBFCF /* CreditCardDetailsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EE88A62C1C83A7000EBFCF /* CreditCardDetailsController.swift */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
Expand All @@ -21,6 +22,7 @@
282B13112C1BE91F00FB13F1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
282B13142C1BE91F00FB13F1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
282B13162C1BE91F00FB13F1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
28EE88A62C1C83A7000EBFCF /* CreditCardDetailsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreditCardDetailsController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -60,6 +62,7 @@
282B13112C1BE91F00FB13F1 /* Assets.xcassets */,
282B13132C1BE91F00FB13F1 /* LaunchScreen.storyboard */,
282B13162C1BE91F00FB13F1 /* Info.plist */,
28EE88A62C1C83A7000EBFCF /* CreditCardDetailsController.swift */,
);
path = Vanilla;
sourceTree = "<group>";
Expand Down Expand Up @@ -145,6 +148,7 @@
buildActionMask = 2147483647;
files = (
282B130D2C1BE91E00FB13F1 /* ViewController.swift in Sources */,
28EE88A72C1C83A7000EBFCF /* CreditCardDetailsController.swift in Sources */,
282B13092C1BE91E00FB13F1 /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
60 changes: 60 additions & 0 deletions Vanilla/Vanilla/CreditCardDetailsController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import UIKit
import FormTextField

class CreditCardDetailsController: UIViewController {
lazy var inputValidator: InputValidator = {
var validation = Validation()
validation.maximumLength = "1234 5678 1234 5678".count
validation.minimumLength = "1234 5678 1234 5678".count
let characterSet = NSMutableCharacterSet.decimalDigit()
characterSet.addCharacters(in: " ")
validation.characterSet = characterSet as CharacterSet
let inputValidator = InputValidator(validation: validation)
return inputValidator
}()

let formatter = CardNumberFormatter()

lazy var creditCardNumberTextField: UITextField = {
let textField = UITextField(frame: .zero)
textField.translatesAutoresizingMaskIntoConstraints = false
textField.backgroundColor = .secondarySystemBackground
textField.textColor = .label
textField.autocapitalizationType = .none
textField.autocorrectionType = .no
textField.keyboardType = .numberPad
textField.textContentType = .creditCardNumber
textField.placeholder = "Credit card number"
textField.delegate = self
textField.addTarget(self, action: #selector(textFieldDidUpdate(_:)), for: .editingChanged)
textField.clearButtonMode = .whileEditing
return textField
}()

override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(creditCardNumberTextField)
view.backgroundColor = .systemBackground

NSLayoutConstraint.activate([
creditCardNumberTextField.centerYAnchor.constraint(equalTo: view.centerYAnchor),
creditCardNumberTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 12),
creditCardNumberTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -12),
])
}

@objc func textFieldDidUpdate(_ textField: UITextField) {
let creditCardNumber = creditCardNumberTextField.text ?? ""
textField.text = formatter.formatString(creditCardNumber, reverse: reverse)
creditCardNumberTextField.backgroundColor = self.inputValidator.validateString(creditCardNumber) ? .systemMint : .secondarySystemBackground
}

var reverse = false
}

extension CreditCardDetailsController: UITextFieldDelegate {
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
reverse = string.isEmpty
return self.inputValidator.validateReplacementString(string, fullString: textField.text, inRange: range)
}
}

0 comments on commit 77422c5

Please sign in to comment.