From 394245dd296082ae77b5e1913ce5ec45f986e7b3 Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Thu, 21 Mar 2024 10:31:48 +0000 Subject: [PATCH] [Framework] loading indicator for the Feed list (#14) This PR contains the work done to integrate a loading indicator to the `FeedListViewController` view controller. Reviewed-on: https://repo.rock-n-code.com/rock-n-code/app-reviews/pulls/14 Co-authored-by: Javier Cicchelli Co-committed-by: Javier Cicchelli --- .../Logic/View Models/FeedListViewModel.swift | 4 +-- .../FeedListViewController.swift | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift b/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift index 059a3fa..5fd5a99 100644 --- a/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift +++ b/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift @@ -47,8 +47,8 @@ extension FeedListViewController { // MARK: Computed var itemsCount: Int { isWordsShowing - ? items.count - : items.count + 1 + ? items.count + 1 + : items.count } var isWordsShowing: Bool { diff --git a/Frameworks/Feed/Bundle/Sources/UI/View Controllers/FeedListViewController.swift b/Frameworks/Feed/Bundle/Sources/UI/View Controllers/FeedListViewController.swift index 6717ea6..78cfe49 100644 --- a/Frameworks/Feed/Bundle/Sources/UI/View Controllers/FeedListViewController.swift +++ b/Frameworks/Feed/Bundle/Sources/UI/View Controllers/FeedListViewController.swift @@ -22,6 +22,14 @@ public class FeedListViewController: UITableViewController { private var cancellables: Set = [] // MARK: Outlets + private lazy var activityIndicator = { + let indicator = UIActivityIndicatorView() + + indicator.translatesAutoresizingMaskIntoConstraints = false + + return indicator + }() + private lazy var filterButton = { UIBarButtonItem( title: NSLocalizedString( @@ -92,6 +100,7 @@ public class FeedListViewController: UITableViewController { setNavigationBar() setView() + setLayout() registerTableCells() bindViewModel() @@ -163,11 +172,20 @@ private extension FeedListViewController { } .store(in: &cancellables) + viewModel.$isLoading + .filter { $0 == true } + .receive(on: RunLoop.main) + .sink { [weak self] _ in + self?.activityIndicator.startAnimating() + } + .store(in: &cancellables) + viewModel.$isLoading .dropFirst() .filter { $0 == false } .receive(on: RunLoop.main) .sink { [weak self] _ in + self?.activityIndicator.stopAnimating() self?.pullControl.endRefreshing() self?.tableView.reloadData() self?.tableView.scrollToRow( @@ -232,6 +250,13 @@ private extension FeedListViewController { TopWordsCell.register(in: tableView) } + func setLayout() { + NSLayoutConstraint.activate([ + activityIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor), + activityIndicator.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor), + ]) + } + func setNavigationBar() { navigationController?.navigationBar.prefersLargeTitles = true navigationController?.navigationBar.isTranslucent = true @@ -246,6 +271,11 @@ private extension FeedListViewController { func setView() { tableView.refreshControl = pullControl + + view.addSubview(activityIndicator) + view.bringSubviewToFront(activityIndicator) + + activityIndicator.startAnimating() } func updateFilterMenu(_ option: FilterOption) {