[Framework] Feed Item coordinator (#17)

This PR contains the work done to implement the `FeedItemCoordinator` coordinator in the `Feed` framework.

Reviewed-on: rock-n-code/app-reviews#17
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
This commit was merged in pull request #17.
This commit is contained in:
2024-03-21 22:56:38 +00:00
committed by javier
parent 9a5c385903
commit d19c1c15d1
13 changed files with 287 additions and 63 deletions
@@ -13,7 +13,7 @@ import ReviewsUIKit
import SwiftUI
import UIKit
public class FeedListViewController: UITableViewController {
final class FeedListViewController: UITableViewController {
// MARK: Constants
private let viewModel: ViewModel
@@ -79,8 +79,8 @@ public class FeedListViewController: UITableViewController {
}()
// MARK: Initialisers
public init(configuration: Configuration = .init()) {
self.viewModel = .init(configuration: configuration)
init(_ viewModel: ViewModel) {
self.viewModel = viewModel
super.init(style: .plain)
}
@@ -95,7 +95,7 @@ public class FeedListViewController: UITableViewController {
}
// MARK: UIViewController
public override func viewDidLoad() {
override func viewDidLoad() {
super.viewDidLoad()
setNavigationBar()
@@ -108,14 +108,14 @@ public class FeedListViewController: UITableViewController {
}
// MARK: UITableViewDataSource
public override func tableView(
override func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
viewModel.itemsCount
}
public override func tableView(
override func tableView(
_ tableView: UITableView,
cellForRowAt indexPath: IndexPath
) -> UITableViewCell {
@@ -127,21 +127,16 @@ public class FeedListViewController: UITableViewController {
}
// MARK: UITableViewDelegate
public override func tableView(
override func tableView(
_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath
) {
guard let item = viewModel.item(for: indexPath.row) else { return }
viewModel.openItem(at: indexPath.row)
tableView.deselectRow(
at: indexPath,
animated: true
)
navigationController?.pushViewController(
FeedItemViewController(item),
animated: true
)
}
}
@@ -292,29 +287,6 @@ private extension FeedListViewController {
}
// MARK: - Configuration
extension FeedListViewController {
public struct Configuration {
// MARK: Constants
let appID: String
let countryCode: String
let session: URLSessionConfiguration
// MARK: Initialisers
public init(
appID: String = "474495017",
countryCode: String = "nl",
session: URLSessionConfiguration = .ephemeral
) {
self.appID = appID
self.countryCode = countryCode
self.session = session
}
}
}
// MARK: - String+Constants
private extension String {
enum Cell {
@@ -363,9 +335,9 @@ import ReviewsiTunesKit
#Preview("Feed List loading reviews") {
MockURLProtocol.response = .init(statusCode: 200)
return UINavigationController(
rootViewController: FeedListViewController(configuration: .init(session: .mock))
)
return UINavigationController(rootViewController: FeedListViewController(.init(
configuration: .init(session: .mock)
)))
}
@available(iOS 17.0, *)
@@ -421,9 +393,9 @@ import ReviewsiTunesKit
])
)
return UINavigationController(
rootViewController: FeedListViewController(configuration: .init(session: .mock))
)
return UINavigationController(rootViewController: FeedListViewController(.init(
configuration: .init(session: .mock)
)))
}
@available(iOS 17.0, *)
@@ -433,13 +405,13 @@ import ReviewsiTunesKit
object: Feed(entries: [])
)
return UINavigationController(
rootViewController: FeedListViewController(configuration: .init(session: .mock))
)
return UINavigationController(rootViewController: FeedListViewController(.init(
configuration: .init(session: .mock)
)))
}
@available(iOS 17.0, *)
#Preview("Feed List with live reviews") {
UINavigationController(rootViewController: FeedListViewController())
return UINavigationController(rootViewController: FeedListViewController(.init()))
}
#endif