refactor into FieldHandlers
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
f93239b421
commit
eab8e72785
@ -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) {}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user