From 53fc099d6efa9b3ba007c7cfaca377312b52335b Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 20 Jan 2025 18:17:10 -0600 Subject: [PATCH] first cut of building out a list of employees using the valid API this is built off of combine to deal with the state changes of the ViewModel. Signed-off-by: Matt Bruce --- .../EmployeesViewController.swift | 47 +++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/EmployeeDirectory/ViewControllers/EmployeesViewController.swift b/EmployeeDirectory/ViewControllers/EmployeesViewController.swift index 199fe89..44f314b 100644 --- a/EmployeeDirectory/ViewControllers/EmployeesViewController.swift +++ b/EmployeeDirectory/ViewControllers/EmployeesViewController.swift @@ -6,14 +6,53 @@ // import UIKit +import Combine class EmployeesViewController: UIViewController { + private let tableView = UITableView() + private let viewModel = EmployeesViewModel() + private var cancellables = Set() - override func viewDidLoad() { + public override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. + setupUI() + bindViewModel() + viewModel.fetchEmployees() + } + + private func setupUI() { + view.backgroundColor = .white + + // Configure TableView + tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") + tableView.dataSource = self + + view.addSubview(tableView) + tableView.frame = view.bounds + + } + + private func bindViewModel() { + viewModel.$employees + .receive(on: RunLoop.main) + .sink { [weak self] _ in + self?.tableView.reloadData() + self?.tableView.refreshControl?.endRefreshing() + } + .store(in: &cancellables) } - - } +extension EmployeesViewController: UITableViewDataSource { + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return viewModel.employees.count + } + + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) + let employee = viewModel.employees[indexPath.row] + cell.textLabel?.text = employee.fullName + cell.detailTextLabel?.text = employee.emailAddress + return cell + } +}