added new validator

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-07-15 08:43:27 -05:00
parent 699626a4b8
commit 10f4f1db11

View File

@ -10,6 +10,35 @@ import UIKit
extension InputField { 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 { class TelephoneHandler: FieldTypeHandler {
static let shared = TelephoneHandler() static let shared = TelephoneHandler()
@ -25,14 +54,7 @@ extension InputField {
} }
override func appendRules(_ inputField: InputField) { override func appendRules(_ inputField: InputField) {
if let text = inputField.textField.text, text.count > 0 { inputField.rules.append(.init(TelephoneNumberValidator(format: "XXX-XXX-XXXX")))
let rule = CharacterCountRule().copyWith {
$0.maxLength = "XXX-XXX-XXXX".count
$0.compareType = .equals
$0.errorMessage = "Enter a valid telephone."
}
inputField.rules.append(.init(rule))
}
} }
override func textField(_ inputField: InputField, textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 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) textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
} }
value = formattedNumber
// Prevent the default behavior // Prevent the default behavior
return false return false
@ -71,6 +95,7 @@ extension InputField {
if let text = inputField.text { if let text = inputField.text {
let rawNumber = text.filter { $0.isNumber } let rawNumber = text.filter { $0.isNumber }
textField.text = formatUSNumber(rawNumber) textField.text = formatUSNumber(rawNumber)
value = textField.text
} }
} }