|
import NeedleFoundation |
|
import UIKit |
|
|
|
final class RootComponent: BootstrapComponent { |
|
public var userInfo: UserDataParseable { |
|
return shared { UserData() } |
|
} |
|
|
|
public var detailComponent: DetailComponent { |
|
return DetailComponent(parent: self) |
|
} |
|
|
|
public var rootViewController: UIViewController { |
|
return RootViewController(detailBuilder: detailComponent) |
|
} |
|
} |
|
|
|
final class RootViewController: UIViewController { |
|
public let detailBuilder: DetailBuilder |
|
public let detailButton = UIButton() |
|
|
|
init(detailBuilder: DetailBuilder) { |
|
self.detailBuilder = detailBuilder |
|
super.init(nibName: nil, bundle: nil) |
|
} |
|
|
|
@available(*, unavailable) |
|
required init?(coder _: NSCoder) { |
|
fatalError("init(coder:) has not been implemented") |
|
} |
|
|
|
override func viewDidLoad() { |
|
super.viewDidLoad() |
|
view.backgroundColor = .black |
|
configureButton() |
|
} |
|
|
|
public func configureButton() { |
|
view.addSubview(detailButton) |
|
|
|
var buttonConfiguration = UIButton.Configuration.bordered() |
|
buttonConfiguration.title = "Go to Details" |
|
buttonConfiguration.baseBackgroundColor = .white |
|
|
|
detailButton.configuration = buttonConfiguration |
|
|
|
detailButton.translatesAutoresizingMaskIntoConstraints = false |
|
|
|
NSLayoutConstraint.activate([ |
|
detailButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), |
|
detailButton.centerYAnchor.constraint(equalTo: view.centerYAnchor), |
|
]) |
|
|
|
detailButton.addTarget(self, action: #selector(detailButtonTap), for: .touchUpInside) |
|
} |
|
|
|
@objc |
|
public func detailButtonTap() { |
|
present(detailBuilder.detailViewController, animated: true) |
|
} |
|
} |
|
|
|
protocol UserDataParseable { |
|
var data: String? { get } |
|
} |
|
|
|
final class UserData: UserDataParseable { |
|
public var data: String? = "Ana Maia" |
|
} |
|
|
|
protocol DetailDependency: Dependency { |
|
var userInfo: UserDataParseable { get } |
|
} |
|
|
|
protocol DetailBuilder { |
|
var detailViewController: UIViewController { get } |
|
} |
|
|
|
final class DetailComponent: Component<DetailDependency>, DetailBuilder { |
|
public var detailViewController: UIViewController { |
|
return DetailViewController(userData: dependency.userInfo) |
|
} |
|
} |
|
|
|
final class DetailViewController: UIViewController { |
|
public var titleLabel = UILabel() |
|
|
|
init(userData: UserDataParseable) { |
|
super.init(nibName: nil, bundle: nil) |
|
titleLabel.text = userData.data |
|
} |
|
|
|
@available(*, unavailable) |
|
required init?(coder _: NSCoder) { |
|
fatalError("init(coder:) has not been implemented") |
|
} |
|
|
|
override func viewDidLoad() { |
|
super.viewDidLoad() |
|
view.backgroundColor = .white |
|
configureTitleLabel() |
|
} |
|
|
|
public func configureTitleLabel() { |
|
view.addSubview(titleLabel) |
|
|
|
titleLabel.translatesAutoresizingMaskIntoConstraints = false |
|
|
|
NSLayoutConstraint.activate([ |
|
titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), |
|
titleLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor), |
|
]) |
|
} |
|
} |