refactor into FieldHandlers

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-05-09 08:57:03 -05:00
parent f93239b421
commit eab8e72785
2 changed files with 168 additions and 45 deletions

View File

@ -9,61 +9,184 @@ import Foundation
import UIKit
extension InputField {
protocol FieldHandler: UITextFieldDelegate {
var keyboardType: UIKeyboardType { get }
func configure(for inputField: InputField)
func appendRules(for inputField: InputField)
}
public enum FieldType: String, CaseIterable {
case text, number, inlineAction, password, creditCard, tel, date, securityCode
case text, number, inlineAction, password, creditCard, telephone, date, securityCode
internal var keyboardType: UIKeyboardType {
func handler() -> FieldHandler {
switch self {
case .text:
return TextHandler.shared
case .number:
.numberPad
case .tel:
.phonePad
return NumberHandler.shared
case .inlineAction:
return InlineActionHandler.shared
case .password:
return PasswordHandler.shared
case .creditCard:
.numberPad
return CreditCardHandler.shared
case .telephone:
return TelephoneHandler.shared
case .date:
.numberPad
return DateHandler.shared
case .securityCode:
.numberPad
default:
.default
return SecurityCodeHandler.shared
}
}
internal func appendRules(for textField: InputField) {
switch self {
case .creditCard:
if let text = textField.text, text.count > 0 {
let rule = CharacterCountRule().copyWith {
$0.maxLength = textField.creditCardType.maxLength
$0.compareType = .equals
$0.errorMessage = "Enter a valid credit card."
}
textField.rules.append(.init(rule))
}
case .tel:
if let text = textField.text, text.count > 0 {
let rule = CharacterCountRule().copyWith {
$0.maxLength = "XXX-XXX-XXXX".count
$0.compareType = .equals
$0.errorMessage = "Enter a valid telephone."
}
textField.rules.append(.init(rule))
}
case .date:
if let text = textField.text, text.count > 0 {
let rule = CharacterCountRule().copyWith {
$0.maxLength = textField.dateFormat.maxLength
$0.compareType = .equals
$0.errorMessage = "Enter a valid date."
}
textField.rules.append(.init(rule))
}
default: break
}
internal var keyboardType: UIKeyboardType {
handler().keyboardType
}
internal func appendRules(for textField: InputField) {
handler().appendRules(for: textField)
}
}
}
extension InputField {
class TextHandler: NSObject, FieldHandler {
static let shared = TextHandler()
var keyboardType: UIKeyboardType { .default }
private override init() {
super.init()
}
func configure(for inputField: InputField) {}
func appendRules(for inputField: InputField) {}
}
class NumberHandler: NSObject, FieldHandler {
static let shared = NumberHandler()
var keyboardType: UIKeyboardType { .numberPad }
private override init() {
super.init()
}
func configure(for inputField: InputField) {}
func appendRules(for inputField: InputField) {}
}
class InlineActionHandler: NSObject, FieldHandler {
static let shared = InlineActionHandler()
var keyboardType: UIKeyboardType { .default }
private override init() {
super.init()
}
func configure(for inputField: InputField) {}
func appendRules(for inputField: InputField) {}
}
class PasswordHandler: NSObject, FieldHandler {
static let shared = PasswordHandler()
var keyboardType: UIKeyboardType { .default }
private override init() {
super.init()
}
func configure(for inputField: InputField) {}
func appendRules(for inputField: InputField) {}
}
class CreditCardHandler: NSObject, FieldHandler {
static let shared = CreditCardHandler()
var keyboardType: UIKeyboardType { .numberPad }
private override init() {
super.init()
}
func configure(for inputField: InputField) {}
func appendRules(for inputField: InputField) {
if let text = inputField.textField.text, text.count > 0 {
let rule = CharacterCountRule().copyWith {
$0.maxLength = inputField.creditCardType.maxLength
$0.compareType = .equals
$0.errorMessage = "Enter a valid credit card."
}
inputField.rules.append(.init(rule))
}
}
}
class TelephoneHandler: NSObject, FieldHandler {
static let shared = TelephoneHandler()
var keyboardType: UIKeyboardType { .phonePad }
private override init() {
super.init()
}
func configure(for inputField: InputField) {}
func appendRules(for 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))
}
}
}
class DateHandler: NSObject, FieldHandler {
static let shared = DateHandler()
var keyboardType: UIKeyboardType { .numberPad }
private override init() {
super.init()
}
func configure(for inputField: InputField) {}
func appendRules(for inputField: InputField) {
if let text = inputField.textField.text, text.count > 0 {
let rule = CharacterCountRule().copyWith {
$0.maxLength = inputField.dateFormat.maxLength
$0.compareType = .equals
$0.errorMessage = "Enter a valid date."
}
inputField.rules.append(.init(rule))
}
}
}
class SecurityCodeHandler: NSObject, FieldHandler {
static let shared = SecurityCodeHandler()
var keyboardType: UIKeyboardType { .numberPad }
private override init() {
super.init()
}
func configure(for inputField: InputField) {}
func appendRules(for inputField: InputField) {}
}
}

View File

@ -296,7 +296,7 @@ open class InputField: EntryFieldBase {
case .creditCard:
minWidth = 288.0
leftImageName = creditCardType.imageName
case .tel:
case .telephone:
minWidth = 176.0
case .date:
@ -531,7 +531,7 @@ extension InputField: UITextFieldDelegate {
let characterSet = CharacterSet(charactersIn: string)
return allowedCharacters.isSuperset(of: characterSet)
case .tel:
case .telephone:
// Allow only numbers and limit the length of text.
let allowedCharacters = CharacterSet(charactersIn: "01233456789")
let characterSet = CharacterSet(charactersIn: string)