diff --git a/VDS/Components/TextFields/InputField/InputField.swift b/VDS/Components/TextFields/InputField/InputField.swift index cee206f7..68959f82 100644 --- a/VDS/Components/TextFields/InputField/InputField.swift +++ b/VDS/Components/TextFields/InputField/InputField.swift @@ -177,28 +177,6 @@ open class InputField: EntryFieldBase { self?.sendActions(for: .valueChanged) }.store(in: &subscribers) - textField - .publisher(for: .editingDidBegin) - .sink { [weak self] _ in - guard let self else { return } - if self.fieldType == .creditCard { - self.isCreditCardMasked = false - self.textField.text = self.formatCreditCardNumber(self.creditCardRawNumber) - } - self.setNeedsUpdate() - }.store(in: &subscribers) - - textField - .publisher(for: .editingDidEnd) - .sink { [weak self] _ in - guard let self else { return } - if self.fieldType == .creditCard { - self.isCreditCardMasked = true - self.textField.text = self.maskCreditCardNumber(self.creditCardRawNumber) - } - self.validate() - }.store(in: &subscribers) - stackView.addArrangedSubview(successLabel) stackView.setCustomSpacing(8, after: successLabel) @@ -332,12 +310,6 @@ open class InputField: EntryFieldBase { case .date: minWidth = 114.0 placeholderText = dateFormat.placeholderText - let rule = CharacterCountRule().copyWith { - $0.maxLength = dateFormat.maxLength - $0.compareType = .equals - $0.errorMessage = "Enter a valid date" - } - rules.append(.init(rule)) case .securityCode: minWidth = 88.0 isSecureTextEntry = true @@ -390,7 +362,7 @@ open class InputField: EntryFieldBase { case .creditCard: if let text = textField.text, text.count > 0 { let rule = CharacterCountRule().copyWith { - $0.maxLength = "XXXX XXXX XXXX XXXX".count + $0.maxLength = creditCardMaxLength $0.compareType = .equals $0.errorMessage = "Enter a valid credit card." } @@ -498,7 +470,6 @@ open class InputField: EntryFieldBase { //--------------------------------------------------- // MARK: - Credit Card //--------------------------------------------------- - private var isCreditCardMasked: Bool = false private var creditCardRawNumber: String = "" private var creditCardMaxLength = 16 @@ -527,7 +498,7 @@ open class InputField: EntryFieldBase { private func maskCreditCardNumber(_ number: String) -> String { // Mask the first 12 characters if the length is 16 let rawNumber = number.filter { $0.isNumber } - guard rawNumber.count == creditCardMaxLength else { return number } + guard rawNumber.count == creditCardMaxLength else { return formatCreditCardNumber(number) } let lastFourDigits = rawNumber.suffix(4) let maskedSection = String(repeating: "•", count: 12) let formattedMaskSection = formatCreditCardNumber(maskedSection) @@ -592,6 +563,18 @@ open class InputField: EntryFieldBase { } extension InputField: UITextFieldDelegate { + public func textFieldDidBeginEditing(_ textField: UITextField) { + if fieldType == .creditCard { + textField.text = formatCreditCardNumber(creditCardRawNumber) + } + } + + public func textFieldDidEndEditing(_ textField: UITextField) { + if self.fieldType == .creditCard { + textField.text = maskCreditCardNumber(creditCardRawNumber) + } + validate() + } public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {