From eab8e72785c9f7c75b75c46aa62bb5ef072020b8 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 9 May 2024 08:57:03 -0500 Subject: [PATCH] refactor into FieldHandlers Signed-off-by: Matt Bruce --- .../InputField/FieldTypes/FieldType.swift | 209 ++++++++++++++---- .../TextFields/InputField/InputField.swift | 4 +- 2 files changed, 168 insertions(+), 45 deletions(-) diff --git a/VDS/Components/TextFields/InputField/FieldTypes/FieldType.swift b/VDS/Components/TextFields/InputField/FieldTypes/FieldType.swift index 8bb4f944..db09b3ca 100644 --- a/VDS/Components/TextFields/InputField/FieldTypes/FieldType.swift +++ b/VDS/Components/TextFields/InputField/FieldTypes/FieldType.swift @@ -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) {} + } + +} diff --git a/VDS/Components/TextFields/InputField/InputField.swift b/VDS/Components/TextFields/InputField/InputField.swift index d96cfee4..ccb7820c 100644 --- a/VDS/Components/TextFields/InputField/InputField.swift +++ b/VDS/Components/TextFields/InputField/InputField.swift @@ -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)