// // ErrorMessageView.swift // Locations // // Created by Javier Cicchelli on 12/04/2023. // Copyright © 2023 Röck+Cöde. All rights reserved. // import UIKit class ErrorMessageView: UIView { // MARK: Typealiases typealias OnRetryClosure = () -> Void // MARK: Properties var onRetry: OnRetryClosure? // MARK: Outlets private lazy var stack: UIStackView = { let stack = UIStackView() stack.alignment = .center stack.axis = .vertical stack.distribution = .fill stack.spacing = 32 stack.translatesAutoresizingMaskIntoConstraints = false return stack }() private lazy var title = { let label = UILabel() label.font = .preferredFont(forTextStyle: .largeTitle) label.numberOfLines = 0 label.lineBreakMode = .byWordWrapping label.text = "Some error title goes in here..." label.textAlignment = .center label.translatesAutoresizingMaskIntoConstraints = false return label }() private lazy var message = { let label = UILabel() label.font = .preferredFont(forTextStyle: .body) label.lineBreakMode = .byWordWrapping label.numberOfLines = 0 label.text = "Some long, descriptive, explanatory error message goes in here..." label.textAlignment = .center label.textColor = .secondaryLabel label.translatesAutoresizingMaskIntoConstraints = false return label }() private lazy var retry = { let button = UIButton() button.backgroundColor = .red button.translatesAutoresizingMaskIntoConstraints = false button.layer.borderColor = UIColor.red.cgColor button.layer.borderWidth = 1 button.layer.cornerRadius = 5 button.titleLabel?.font = .preferredFont(forTextStyle: .headline) button.addTarget(self, action: #selector(retryPressed), for: .touchUpInside) button.setTitle("Try again", for: .normal) return button }() // MARK: Initialisers init() { super.init(frame: .zero) setupView() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } // MARK: - Helpers private extension ErrorMessageView { // MARK: Functions func setupView() { backgroundColor = .clear translatesAutoresizingMaskIntoConstraints = false addSubview(stack) stack.addArrangedSubview(title) stack.addArrangedSubview(message) stack.addArrangedSubview(retry) stack.setCustomSpacing(160, after: message) NSLayoutConstraint.activate([ bottomAnchor.constraint(equalTo: stack.bottomAnchor), leadingAnchor.constraint(equalTo: stack.leadingAnchor), topAnchor.constraint(equalTo: stack.topAnchor), trailingAnchor.constraint(equalTo: stack.trailingAnchor), retry.heightAnchor.constraint(equalToConstant: 44), retry.leadingAnchor.constraint(equalTo: stack.leadingAnchor), retry.trailingAnchor.constraint(equalTo: stack.trailingAnchor), ]) } @objc func retryPressed() { onRetry?() } }