106 lines
2.5 KiB
Swift
106 lines
2.5 KiB
Swift
//
|
|
// AppDelegate.swift
|
|
// ReviewsFeed
|
|
//
|
|
// Created by Dmitrii Ivanov on 21/07/2020.
|
|
// Copyright © 2020 ING. All rights reserved.
|
|
//
|
|
|
|
import Combine
|
|
import UIKit
|
|
|
|
public class FeedViewController: UITableViewController {
|
|
|
|
// MARK: Constants
|
|
private let viewModel: ViewModel = .init()
|
|
|
|
// MARK: Properties
|
|
private var cancellables: Set<AnyCancellable> = []
|
|
|
|
// MARK: Initialisers
|
|
public init() {
|
|
super.init(style: .plain)
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
// MARK: UIViewController
|
|
public override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
|
|
tableView.register(ReviewCell.self, forCellReuseIdentifier: "cellId")
|
|
tableView.rowHeight = 160
|
|
|
|
bindViewModel()
|
|
|
|
viewModel.fetch()
|
|
}
|
|
|
|
// MARK: UITableViewDataSource
|
|
public override func tableView(
|
|
_ tableView: UITableView,
|
|
numberOfRowsInSection section: Int
|
|
) -> Int {
|
|
viewModel.items.count
|
|
}
|
|
|
|
public override func tableView(
|
|
_ tableView: UITableView,
|
|
cellForRowAt indexPath: IndexPath
|
|
) -> UITableViewCell {
|
|
guard
|
|
let cell = tableView.dequeueReusableCell(
|
|
withIdentifier: "cellId",
|
|
for: indexPath
|
|
) as? ReviewCell
|
|
else {
|
|
return .init()
|
|
}
|
|
|
|
cell.update(item: viewModel.items[indexPath.row])
|
|
|
|
return cell
|
|
}
|
|
|
|
// MARK: UITableViewDelegate
|
|
public override func tableView(
|
|
_ tableView: UITableView,
|
|
didSelectRowAt indexPath: IndexPath
|
|
) {
|
|
let details = DetailsViewController(review: viewModel.items[indexPath.row])
|
|
|
|
tableView.deselectRow(
|
|
at: indexPath,
|
|
animated: true
|
|
)
|
|
|
|
navigationController?.pushViewController(details, animated: true)
|
|
}
|
|
|
|
}
|
|
|
|
// MARK: - Helpers
|
|
private extension FeedViewController {
|
|
|
|
// MARK: Functions
|
|
func bindViewModel() {
|
|
viewModel.$loading
|
|
.sink { loading in
|
|
print("LOADING: \(loading)")
|
|
}
|
|
.store(in: &cancellables)
|
|
|
|
viewModel.$loading
|
|
.filter { $0 == false }
|
|
.dropFirst()
|
|
.receive(on: RunLoop.main)
|
|
.sink { [weak self] _ in
|
|
self?.tableView.reloadData()
|
|
}
|
|
.store(in: &cancellables)
|
|
}
|
|
|
|
}
|