diff --git a/EmployeeDirectory/ViewControllers/EmployeesViewController.swift b/EmployeeDirectory/ViewControllers/EmployeesViewController.swift index 44f314b..14edbd3 100644 --- a/EmployeeDirectory/ViewControllers/EmployeesViewController.swift +++ b/EmployeeDirectory/ViewControllers/EmployeesViewController.swift @@ -10,6 +10,7 @@ import Combine class EmployeesViewController: UIViewController { private let tableView = UITableView() + private let activityIndicator = UIActivityIndicatorView(style: .large) private let viewModel = EmployeesViewModel() private var cancellables = Set() @@ -17,7 +18,8 @@ class EmployeesViewController: UIViewController { super.viewDidLoad() setupUI() bindViewModel() - viewModel.fetchEmployees() + viewModel.changeMode(to: .malformed) + //viewModel.fetchEmployees() } private func setupUI() { @@ -30,16 +32,55 @@ class EmployeesViewController: UIViewController { view.addSubview(tableView) tableView.frame = view.bounds + // Configure Activity Indicator + activityIndicator.center = view.center + view.addSubview(activityIndicator) } private func bindViewModel() { viewModel.$employees .receive(on: RunLoop.main) .sink { [weak self] _ in + self?.updateFooter() self?.tableView.reloadData() self?.tableView.refreshControl?.endRefreshing() } .store(in: &cancellables) + + viewModel.$isLoading + .receive(on: RunLoop.main) + .sink { [weak self] isLoading in + if isLoading { + self?.activityIndicator.startAnimating() + } else { + self?.activityIndicator.stopAnimating() + } + } + .store(in: &cancellables) + + viewModel.$errorMessage + .receive(on: RunLoop.main) + .sink { [weak self] _ in + self?.updateFooter() + } + .store(in: &cancellables) + } + + private func updateFooter() { + var message: String? { + guard !viewModel.isLoading else { return nil } + return viewModel.errorMessage ?? (viewModel.employees.isEmpty ? "No employees found, please try to refresh." : nil) + } + + if let message, !viewModel.isLoading { + let footerView = UILabel() + footerView.font = .systemFont(ofSize: 17, weight: .medium) + footerView.text = message + footerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.width, height: 150) + tableView.tableFooterView = footerView + } else { + tableView.tableFooterView = nil + } } }