diff --git a/VDS/Components/TextFields/InputField/FieldTypes/Telephone.swift b/VDS/Components/TextFields/InputField/FieldTypes/Telephone.swift index 89417c19..88a52723 100644 --- a/VDS/Components/TextFields/InputField/FieldTypes/Telephone.swift +++ b/VDS/Components/TextFields/InputField/FieldTypes/Telephone.swift @@ -10,6 +10,35 @@ import UIKit extension InputField { + public class TelephoneNumberValidator: Rule, Withable { + public var format: String + public var errorMessage: String = "Please enter a valid telephone number" + + public init(format: String) { + self.format = format + } + + public func isValid(value: String?) -> Bool { + guard let value, !value.isEmpty else { return true } + let regex = createRegex(from: format) + let predicate = NSPredicate(format: "SELF MATCHES %@", regex) + let valid = predicate.evaluate(with: value) + return valid + } + + private func createRegex(from format: String) -> String { + // Escape special regex characters in the format string + let escapedFormat = NSRegularExpression.escapedPattern(for: format) + + // Replace placeholder characters with regex patterns + let regex = escapedFormat + .replacingOccurrences(of: "X", with: "\\d") + + return "^" + regex + "$" + } + } + + class TelephoneHandler: FieldTypeHandler { static let shared = TelephoneHandler() @@ -25,14 +54,7 @@ extension InputField { } override func appendRules(_ inputField: InputField) { - if let text = inputField.textField.text, text.count > 0 { - let rule = CharacterCountRule().copyWith { - $0.maxLength = "XXX-XXX-XXXX".count - $0.compareType = .equals - $0.errorMessage = "Enter a valid telephone." - } - inputField.rules.append(.init(rule)) - } + inputField.rules.append(.init(TelephoneNumberValidator(format: "XXX-XXX-XXXX"))) } override func textField(_ inputField: InputField, textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { @@ -62,6 +84,8 @@ extension InputField { textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition) } + value = formattedNumber + // Prevent the default behavior return false @@ -71,6 +95,7 @@ extension InputField { if let text = inputField.text { let rawNumber = text.filter { $0.isNumber } textField.text = formatUSNumber(rawNumber) + value = textField.text } }