// // 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 = [] // 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) } }