// Copyright SIX DAY LLC. All rights reserved. import Foundation import UIKit import StatefulViewController class ErrorView: UIView { let descriptionLabel = UILabel() let imageView = UIImageView() let button = Button(size: .normal, style: .solid) let insets: UIEdgeInsets var onRetry: (() -> Void)? = .none private let viewModel = StateViewModel() init( description: String = NSLocalizedString("errorView.description.label.title", value: "Something went wrong... Try again.", comment: ""), image: UIImage? = R.image.error(), insets: UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0), onRetry: (() -> Void)? = .none ) { self.onRetry = onRetry self.insets = insets super.init(frame: .zero) backgroundColor = .white descriptionLabel.translatesAutoresizingMaskIntoConstraints = false descriptionLabel.text = description descriptionLabel.font = viewModel.descriptionFont descriptionLabel.textColor = viewModel.descriptionTextColor imageView.translatesAutoresizingMaskIntoConstraints = false imageView.image = image button.translatesAutoresizingMaskIntoConstraints = false button.setTitle(NSLocalizedString("Retry", value: "Retry", comment: ""), for: .normal) button.addTarget(self, action: #selector(retry), for: .touchUpInside) let stackView = UIStackView(arrangedSubviews: [ imageView, descriptionLabel, button, ]) stackView.translatesAutoresizingMaskIntoConstraints = false stackView.alignment = .center stackView.axis = .vertical stackView.spacing = viewModel.stackSpacing addSubview(stackView) NSLayoutConstraint.activate([ stackView.trailingAnchor.constraint(equalTo: trailingAnchor), stackView.leadingAnchor.constraint(equalTo: leadingAnchor), stackView.centerXAnchor.constraint(equalTo: centerXAnchor), stackView.centerYAnchor.constraint(equalTo: centerYAnchor), button.widthAnchor.constraint(equalToConstant: 160), ]) } @objc func retry() { onRetry?() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } extension ErrorView: StatefulPlaceholderView { func placeholderViewInsets() -> UIEdgeInsets { return insets } }