Files
2023-01-17 19:10:42 +03:00

121 lines
3.7 KiB
Swift

//
// WalletTextInputView.swift
// Malinka
//
// Created by Nut.Tech on 27.07.2022.
//
import UIKit
protocol WalletTextInputViewDelegate: AnyObject {
func walletUpdateTextOutput(wallet: WalletTextInputView, text: String?)
}
final class WalletTextInputView: UIStackView {
private enum Constants {
static let spacing: CGFloat = 4
static let textCellCornerRadius: CGFloat = 3
static let borderWidth: CGFloat = 1
static let size: CGFloat = 20
static let fontSize: CGFloat = 16
}
// MARK: - Properties
private let length: Int
private weak var delegate: WalletTextInputViewDelegate?
private var lettersContainers: [UITextField]
// MARK: - Init
init(length: Int, delegate: WalletTextInputViewDelegate) {
self.length = length
self.lettersContainers = []
super.init(frame: .zero)
self.axis = .horizontal
self.spacing = Constants.spacing
self.alignment = .leading
self.distribution = .fillEqually
for i in 0..<length {
let textfield = self.createTextCell()
textfield.delegate = self
textfield.tag = i
self.lettersContainers.append(textfield)
self.addArrangedSubview(textfield)
}
self.delegate = delegate
}
required init(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Methods
func hideKeyboard() {
self.lettersContainers.forEach {
$0.resignFirstResponder()
}
}
// MARK: - Private
private func createTextCell() -> UITextField {
let textField = UITextField()
textField.layer.cornerRadius = Constants.textCellCornerRadius
textField.clipsToBounds = true
textField.layer.borderColor = Asset.deepWater.color.cgColor
textField.layer.borderWidth = Constants.borderWidth
textField.font = FontFamily.GolosUI.bold.font(size: Constants.fontSize)
textField.textColor = Asset.dark.color
textField.textAlignment = .center
NSLayoutConstraint.activate([
textField.heightAnchor.constraint(equalToConstant: Constants.size),
textField.widthAnchor.constraint(equalToConstant: Constants.size)
])
return textField
}
private func checkIfAllSymbolsEntered() {
let string = self.lettersContainers
.compactMap { $0.text }
.reduce("", +)
self.delegate?.walletUpdateTextOutput(wallet: self, text: string.count == self.length ? string : nil)
}
}
// MARK: - UITextFieldDelegate
extension WalletTextInputView: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard string.matched(.accountName) || string.isEmpty else { return false }
let newString = (textField.text ?? "").replacingCharacters(in: range, with: string).lowercased()
if newString.count > 1 {
let cutted = newString.dropLast()
textField.text = String(cutted)
if let field = self.lettersContainers[safe: textField.tag + 1] {
field.text = string
field.becomeFirstResponder()
}
return false
}
if string.isEmpty {
textField.text = string
if let field = self.lettersContainers[safe: textField.tag - 1] {
field.becomeFirstResponder()
}
return false
}
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
self.checkIfAllSymbolsEntered()
}
}