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

133 lines
4.6 KiB
Swift

//
// ListDescriptionViewController.swift
// Lockdown
//
// Created by Aliaksandr Dvoineu on 29.03.23.
// Copyright © 2023 Confirmed Inc. All rights reserved.
//
import UIKit
protocol ListDescriptionViewControllerDelegate {
func changeListDescription(description: String)
}
final class ListDescriptionViewController: UIViewController {
var listName = ""
var delegate: ListDescriptionViewControllerDelegate?
var domains = getBlockedLists().userBlockListsDefaults
// 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
}()
private lazy var descriptionTextField: UITextField = {
let view = UITextField()
view.placeholder = "No Description"
view.text = domains[listName]?.description
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(descriptionTextField)
descriptionTextField.anchors.top.spacing(12, to: navigationView.anchors.bottom)
descriptionTextField.anchors.leading.marginsPin()
descriptionTextField.anchors.trailing.marginsPin()
descriptionTextField.anchors.height.equal(40)
view.addSubview(validationPrompt)
validationPrompt.anchors.top.spacing(8, to: descriptionTextField.anchors.bottom)
validationPrompt.anchors.leading.marginsPin()
validationPrompt.anchors.trailing.marginsPin()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
descriptionTextField.layer.cornerRadius = 8
}
}
// MARK: - Functions
private extension ListDescriptionViewController {
@objc func handleTextChange() {
guard let text = descriptionTextField.text else { return }
if text.isValid(.listDescription) {
navigationView.rightNavButton.isEnabled = true
validationPrompt.text = ""
} else {
navigationView.rightNavButton.isEnabled = false
validationPrompt.text = "Invalid Description. Please use only letters and digits. The maximum number of symbols is 500."
}
}
@objc func returnBack() {
navigationController?.popViewController(animated: true)
}
@objc func doneButtonClicked() {
guard let newDescription = descriptionTextField.text else { return }
delegate?.changeListDescription(description: newDescription)
let domains = getBlockedLists().userBlockListsDefaults
var userList = domains[listName]
userList?.description = descriptionTextField.text
var data = getBlockedLists()
data.userBlockListsDefaults[listName] = userList
let encodedData = try? JSONEncoder().encode(data)
defaults.set(encodedData, forKey: kUserBlockedLists)
navigationController?.popViewController(animated: true)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}