Skip to content

Commit

Permalink
Refactor views
Browse files Browse the repository at this point in the history
  • Loading branch information
kudoleh committed Jul 14, 2020
1 parent f71f600 commit 673d92a
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ final class MovieDetailsViewController: UIViewController, StoryboardInstantiable
@IBOutlet private var overviewTextView: UITextView!

private var viewModel: MovieDetailsViewModel!


// MARK: - Lifecicle

static func create(with viewModel: MovieDetailsViewModel) -> MovieDetailsViewController {
let view = MovieDetailsViewController.instantiateViewController(Bundle(for: Self.self).resource)
view.viewModel = viewModel
Expand All @@ -23,20 +25,25 @@ final class MovieDetailsViewController: UIViewController, StoryboardInstantiable

override func viewDidLoad() {
super.viewDidLoad()

setupViews()
bind(to: viewModel)
view.accessibilityIdentifier = AccessibilityIdentifier.movieDetailsView
}

private func bind(to viewModel: MovieDetailsViewModel) {
title = viewModel.title
overviewTextView.text = viewModel.overview
viewModel.posterImage.observe(on: self) { [weak self] in self?.posterImageView.image = $0.flatMap(UIImage.init) }
posterImageView.isHidden = viewModel.isPosterImageHidden
}

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
viewModel.updatePosterImage(width: Int(posterImageView.imageSizeAfterAspectFit.scaledSize.width))
}

// MARK: - Private

private func setupViews() {
title = viewModel.title
overviewTextView.text = viewModel.overview
posterImageView.isHidden = viewModel.isPosterImageHidden
view.accessibilityIdentifier = AccessibilityIdentifier.movieDetailsView
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,36 +14,41 @@ final class MoviesListTableViewController: UITableViewController {

var viewModel: MoviesListViewModel!

// MARK: - Lifecicle

override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = MoviesListItemCell.height
tableView.rowHeight = UITableView.automaticDimension
bind(to: viewModel)
}

private func bind(to viewModel: MoviesListViewModel) {
viewModel.loadingType.observe(on: self) { [weak self] in self?.update(isLoadingNextPage: $0 == .nextPage) }
setupViews()
}

func reload() {
tableView.reloadData()
}

func update(isLoadingNextPage: Bool) {
if isLoadingNextPage {
func update(for loadingType: MoviesListViewModelLoading?) {
switch loadingType {
case .nextPage:
nextPageLoadingSpinner?.removeFromSuperview()
nextPageLoadingSpinner = UIActivityIndicatorView(style: .gray)
nextPageLoadingSpinner?.startAnimating()
nextPageLoadingSpinner?.isHidden = false
nextPageLoadingSpinner?.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.frame.width, height: 44)
tableView.tableFooterView = nextPageLoadingSpinner
} else {
case .fullScreen, .none:
tableView.tableFooterView = nil
}
}

// MARK: - Private

private func setupViews() {
tableView.estimatedRowHeight = MoviesListItemCell.height
tableView.rowHeight = UITableView.automaticDimension
}
}

// MARK: - UITableViewDataSource, UITableViewDelegate

extension MoviesListTableViewController {

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
Expand All @@ -52,7 +57,8 @@ extension MoviesListTableViewController {

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: MoviesListItemCell.reuseIdentifier, for: indexPath) as? MoviesListItemCell else {
fatalError("Cannot dequeue reusable cell \(MoviesListItemCell.self) with reuseIdentifier: \(MoviesListItemCell.reuseIdentifier)")
assertionFailure("Cannot dequeue reusable cell \(MoviesListItemCell.self) with reuseIdentifier: \(MoviesListItemCell.reuseIdentifier)")
return UITableViewCell()
}

cell.fill(with: viewModel.items.value[indexPath.row],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ final class MoviesListViewController: UIViewController, StoryboardInstantiable,
private var moviesTableViewController: MoviesListTableViewController?
private var searchController = UISearchController(searchResultsController: nil)

// MARK: - Lifecicle
// MARK: - Lifecicle

static func create(with viewModel: MoviesListViewModel,
posterImagesRepository: PosterImagesRepository?) -> MoviesListViewController {
Expand All @@ -33,13 +33,9 @@ final class MoviesListViewController: UIViewController, StoryboardInstantiable,

override func viewDidLoad() {
super.viewDidLoad()

title = viewModel.screenTitle
emptyDataLabel.text = viewModel.emptyDataTitle
setupViews()
setupSearchController()
addBehaviors([BackButtonEmptyTitleNavigationBarBehavior(),
BlackStyleNavigationBarBehavior()])

setupBehaviours()
bind(to: viewModel)
viewModel.viewDidLoad()
}
Expand All @@ -48,7 +44,7 @@ final class MoviesListViewController: UIViewController, StoryboardInstantiable,
viewModel.items.observe(on: self) { [weak self] _ in self?.moviesTableViewController?.reload() }
viewModel.query.observe(on: self) { [weak self] in self?.updateSearchController(query: $0) }
viewModel.error.observe(on: self) { [weak self] in self?.showError($0) }
viewModel.loadingType.observe(on: self) { [weak self] _ in self?.updateViewsVisibility() }
viewModel.loadingType.observe(on: self) { [weak self] in self?.updateViewsVisibility(loadingType: $0) }
}

override func viewWillDisappear(_ animated: Bool) {
Expand All @@ -70,33 +66,39 @@ final class MoviesListViewController: UIViewController, StoryboardInstantiable,
}
}

// MARK: - Private
// MARK: - Private

private func setupViews() {
title = viewModel.screenTitle
emptyDataLabel.text = viewModel.emptyDataTitle
}

private func setupBehaviours() {
addBehaviors([BackButtonEmptyTitleNavigationBarBehavior(),
BlackStyleNavigationBarBehavior()])
}

private func showError(_ error: String) {
guard !error.isEmpty else { return }
showAlert(title: viewModel.errorTitle, message: error)
}

private func updateViewsVisibility() {
private func updateViewsVisibility(loadingType: MoviesListViewModelLoading?) {
emptyDataLabel.isHidden = true
moviesListContainer.isHidden = true
suggestionsListContainer.isHidden = true
LoadingView.hide()

switch viewModel.loadingType.value {
switch loadingType {
case .fullScreen: LoadingView.show()
case .nextPage: moviesListContainer.isHidden = false
case .none: updateMoviesListVisibility()
case .none:
moviesListContainer.isHidden = viewModel.isEmpty
emptyDataLabel.isHidden = !viewModel.isEmpty
}
updateQueriesSuggestionsVisibility()
}

private func updateMoviesListVisibility() {
guard !viewModel.isEmpty else {
emptyDataLabel.isHidden = false
return
}
moviesListContainer.isHidden = false
moviesTableViewController?.update(for: loadingType)
updateQueriesSuggestionsVisibility()
}

private func updateQueriesSuggestionsVisibility() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import UIKit
final class MoviesQueriesTableViewController: UITableViewController, StoryboardInstantiable {

private var viewModel: MoviesQueryListViewModel!


// MARK: - Lifecicle

static func create(with viewModel: MoviesQueryListViewModel) -> MoviesQueriesTableViewController {
let view = MoviesQueriesTableViewController.instantiateViewController(Bundle(for: Self.self).resource)
view.viewModel = viewModel
Expand All @@ -19,11 +21,7 @@ final class MoviesQueriesTableViewController: UITableViewController, StoryboardI

override func viewDidLoad() {
super.viewDidLoad()
tableView.tableFooterView = UIView()
tableView.backgroundColor = .clear
tableView.estimatedRowHeight = MoviesQueriesItemCell.height
tableView.rowHeight = UITableView.automaticDimension

setupViews()
bind(to: viewModel)
}

Expand All @@ -32,13 +30,23 @@ final class MoviesQueriesTableViewController: UITableViewController, StoryboardI
}

override func viewWillAppear(_ animated: Bool) {

super.viewWillAppear(animated)

viewModel.viewWillAppear()
}

// MARK: - Private

private func setupViews() {
tableView.tableFooterView = UIView()
tableView.backgroundColor = .clear
tableView.estimatedRowHeight = MoviesQueriesItemCell.height
tableView.rowHeight = UITableView.automaticDimension
}
}

// MARK: - UITableViewDataSource, UITableViewDelegate

extension MoviesQueriesTableViewController {

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
Expand All @@ -47,10 +55,11 @@ extension MoviesQueriesTableViewController {

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: MoviesQueriesItemCell.reuseIdentifier, for: indexPath) as? MoviesQueriesItemCell else {
fatalError("Cannot dequeue reusable cell \(MoviesQueriesItemCell.self) with reuseIdentifier: \(MoviesQueriesItemCell.reuseIdentifier)")
assertionFailure("Cannot dequeue reusable cell \(MoviesQueriesItemCell.self) with reuseIdentifier: \(MoviesQueriesItemCell.reuseIdentifier)")
return UITableViewCell()
}
cell.fill(with: viewModel.items.value[indexPath.row])

return cell
}

Expand Down

0 comments on commit 673d92a

Please sign in to comment.