Implemented the FeedItemViewController view controller in the Feed framework.

This commit is contained in:
Javier Cicchelli 2024-03-20 02:34:25 +01:00
parent ca50f5ff3a
commit d29dae5c79

View File

@ -6,6 +6,8 @@
// Copyright © 2020 ING. All rights reserved. // Copyright © 2020 ING. All rights reserved.
// //
import ReviewsUIKit
import SwiftUI
import UIKit import UIKit
final class FeedItemViewController: UIViewController { final class FeedItemViewController: UIViewController {
@ -13,29 +15,49 @@ final class FeedItemViewController: UIViewController {
// MARK: Constants // MARK: Constants
private let item: Review private let item: Review
// MARK: Properties
private lazy var appVersionController = {
UIHostingController(rootView: FakeLabel(
systemIcon: .Icon.info,
title: item.rating.appVersion
))
}()
private lazy var authorController = {
UIHostingController(rootView: FakeLabel(
systemIcon: .Icon.person,
title: item.author
))
}()
private lazy var starRatingController = {
UIHostingController(rootView: StarRating(
item.rating.stars,
of: .Rating.total
))
}()
// MARK: Outlets // MARK: Outlets
private lazy var titleLabel = { private lazy var appVersionView = {
let label = UILabel() guard let view = appVersionController.view else {
fatalError("The StarRating component must be initialised")
label.font = UIFont.preferredFont(forTextStyle: .title3) }
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.text = item.title
return label
}()
private lazy var authorLabel = {
let label = UILabel()
label.font = UIFont.preferredFont(forTextStyle: .headline) view.translatesAutoresizingMaskIntoConstraints = false
label.numberOfLines = 1
label.translatesAutoresizingMaskIntoConstraints = false return view
label.text = item.author
return label
}() }()
private lazy var authorView = {
guard let view = authorController.view else {
fatalError("The StarRating component must be initialised")
}
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
private lazy var commentLabel = { private lazy var commentLabel = {
let label = UILabel() let label = UILabel()
@ -46,18 +68,65 @@ final class FeedItemViewController: UIViewController {
return label return label
}() }()
private lazy var ratingView = {
let stack = UIStackView()
stack.axis = .horizontal
stack.backgroundColor = .clear
stack.distribution = .fillProportionally
stack.translatesAutoresizingMaskIntoConstraints = false
stack.addArrangedSubview(starRatingView)
stack.addArrangedSubview(appVersionView)
private lazy var ratingVersionLabel = { return stack
let label = UILabel() }()
private lazy var scrollView = {
let scroll = UIScrollView()
label.font = UIFont.preferredFont(forTextStyle: .subheadline) scroll.backgroundColor = .clear
label.numberOfLines = 1 scroll.showsVerticalScrollIndicator = true
label.translatesAutoresizingMaskIntoConstraints = false scroll.translatesAutoresizingMaskIntoConstraints = false
label.text = item.rating.appVersion
return label return scroll
}() }()
private lazy var stackView = {
let stack = UIStackView()
stack.axis = .vertical
stack.alignment = .leading
stack.backgroundColor = .clear
stack.distribution = .fill
stack.spacing = 16
stack.translatesAutoresizingMaskIntoConstraints = false
return stack
}()
private lazy var starRatingView = {
guard let view = starRatingController.view else {
fatalError("The StarRating component must be initialised")
}
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
private lazy var titleLabel = {
let label = UILabel()
label.font = UIFont.preferredFont(forTextStyle: .headline)
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.text = item.title
return label
}()
// MARK: Initialisers // MARK: Initialisers
init(_ item: Review) { init(_ item: Review) {
self.item = item self.item = item
@ -68,14 +137,22 @@ final class FeedItemViewController: UIViewController {
required init?(coder aDecoder: NSCoder) { required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
// MARK: UIViewController // MARK: UIViewController
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
addChild(appVersionController)
addChild(authorController)
addChild(starRatingController)
setView() setView()
setNavigationBar() setNavigationBar()
setLayout() setLayout()
appVersionController.didMove(toParent: self)
authorController.didMove(toParent: self)
starRatingController.didMove(toParent: self)
} }
} }
@ -85,23 +162,31 @@ private extension FeedItemViewController {
// MARK: Functions // MARK: Functions
func setLayout() { func setLayout() {
let scrollContentGuide = scrollView.contentLayoutGuide
let scrollFrameGuide = scrollView.frameLayoutGuide
NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
authorLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8), scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
authorLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8), scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
authorLabel.topAnchor.constraint(equalTo: ratingVersionLabel.bottomAnchor, constant: 8), scrollView.topAnchor.constraint(equalTo: view.topAnchor),
authorLabel.heightAnchor.constraint(equalToConstant: 24), scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
commentLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8),
commentLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8), stackView.bottomAnchor.constraint(equalTo: scrollContentGuide.bottomAnchor, constant: -16),
commentLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 8), stackView.leadingAnchor.constraint(equalTo: scrollContentGuide.leadingAnchor),
commentLabel.heightAnchor.constraint(greaterThanOrEqualToConstant: 24), stackView.topAnchor.constraint(equalTo: scrollContentGuide.topAnchor, constant: 8),
ratingVersionLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8), stackView.trailingAnchor.constraint(equalTo: scrollContentGuide.trailingAnchor),
ratingVersionLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8), stackView.leadingAnchor.constraint(equalTo: scrollFrameGuide.leadingAnchor),
ratingVersionLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 8), stackView.trailingAnchor.constraint(equalTo: scrollFrameGuide.trailingAnchor),
ratingVersionLabel.heightAnchor.constraint(equalToConstant: 24),
titleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8), authorView.leadingAnchor.constraint(equalTo: stackView.leadingAnchor, constant: 16),
titleLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8),
titleLabel.topAnchor.constraint(equalTo: authorLabel.bottomAnchor, constant: 8), ratingView.leadingAnchor.constraint(equalTo: stackView.leadingAnchor, constant: 16),
titleLabel.heightAnchor.constraint(lessThanOrEqualToConstant: 72),
titleLabel.leadingAnchor.constraint(equalTo: stackView.leadingAnchor, constant: 16),
titleLabel.trailingAnchor.constraint(equalTo: stackView.trailingAnchor, constant: -16),
commentLabel.leadingAnchor.constraint(equalTo: stackView.leadingAnchor, constant: 16),
commentLabel.trailingAnchor.constraint(equalTo: stackView.trailingAnchor, constant: -16),
]) ])
} }
@ -109,16 +194,20 @@ private extension FeedItemViewController {
navigationController?.navigationBar.prefersLargeTitles = true navigationController?.navigationBar.prefersLargeTitles = true
navigationController?.navigationBar.isTranslucent = true navigationController?.navigationBar.isTranslucent = true
navigationItem.title = "#\(String(item.id))" navigationItem.title = "# \(String(item.id))"
} }
func setView() { func setView() {
view.backgroundColor = .white view.backgroundColor = .systemBackground
view.addSubview(scrollView)
view.addSubview(ratingVersionLabel) scrollView.addSubview(stackView)
view.addSubview(authorLabel)
view.addSubview(titleLabel) stackView.addArrangedSubview(authorView)
view.addSubview(commentLabel) stackView.addArrangedSubview(ratingView)
stackView.addArrangedSubview(titleLabel)
stackView.addArrangedSubview(commentLabel)
} }
} }