Files
lockdown-iOS-mirror/LockdowniOS/ListDetailViewController.swift

119 lines
4.0 KiB
Swift

//
// ListDetailViewController.swift
// Lockdown
//
// Created by Aliaksandr Dvoineu on 29.03.23.
// Copyright © 2023 Confirmed Inc. All rights reserved.
//
import UIKit
protocol ListDetailViewControllerDelegate {
func changeListName(name: String)
}
final class ListDetailViewController: UIViewController {
var delegate: ListDetailViewControllerDelegate?
var listName = ""
// MARK: - Properties
private lazy var navigationView: ConfiguredNavigationView = {
let view = ConfiguredNavigationView()
view.titleLabel.text = NSLocalizedString("Name", comment: "")
view.leftNavButton.setTitle("BACK", for: .normal)
view.leftNavButton.setImage(UIImage(systemName: "chevron.left"), for: .normal)
view.leftNavButton.addTarget(self, action: #selector(returnBack), for: .touchUpInside)
view.rightNavButton.setTitle("DONE", for: .normal)
view.rightNavButton.addTarget(self, action: #selector(doneButtonClicked), for: .touchUpInside)
return view
}()
lazy var listNameTextField: UITextField = {
let view = UITextField()
view.text = listName
view.font = fontMedium17
view.textColor = .label
view.backgroundColor = .systemBackground
view.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: .zero))
view.leftViewMode = .always
view.addTarget(self, action: #selector(handleTextChange), for: .editingChanged)
return view
}()
private lazy var validationPrompt: UILabel = {
let label = UILabel()
label.textColor = .red
label.font = fontRegular14
label.textAlignment = .left
label.numberOfLines = 0
return label
}()
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .secondarySystemBackground
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
configureUI()
}
// MARK: - Configure UI
private func configureUI() {
view.addSubview(navigationView)
navigationView.anchors.leading.pin()
navigationView.anchors.trailing.pin()
navigationView.anchors.top.safeAreaPin()
view.addSubview(listNameTextField)
listNameTextField.anchors.top.spacing(12, to: navigationView.anchors.bottom)
listNameTextField.anchors.leading.marginsPin()
listNameTextField.anchors.trailing.marginsPin()
listNameTextField.anchors.height.equal(40)
view.addSubview(validationPrompt)
validationPrompt.anchors.top.spacing(8, to: listNameTextField.anchors.bottom)
validationPrompt.anchors.leading.marginsPin()
validationPrompt.anchors.trailing.marginsPin()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
listNameTextField.layer.cornerRadius = 8
}
}
// MARK: - Functions
extension ListDetailViewController {
@objc func handleTextChange() {
guard let text = listNameTextField.text else { return }
if text.isValid(.listName) {
navigationView.rightNavButton.isEnabled = true
validationPrompt.text = ""
} else {
navigationView.rightNavButton.isEnabled = false
validationPrompt.text = "Invalid name. Please use only letters and digits. The maximum number of symbols is 20."
}
}
@objc func returnBack() {
navigationController?.popViewController(animated: true)
}
@objc func doneButtonClicked() {
guard let newListName = listNameTextField.text else { return }
delegate?.changeListName(name: newListName)
changeBlockedListName(from: listName, to: newListName)
navigationController?.popViewController(animated: true)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}