From bc635714b46268c0b861918d5c0f3fe13b5be4e7 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Tue, 21 Jan 2025 12:42:10 -0600 Subject: [PATCH] added sorting to the UI and ViewModels Signed-off-by: Matt Bruce --- .../Services/MockEmployeeService.swift | 13 ++++-- .../EmployeesViewController.swift | 40 +++++++++++++++++++ .../ViewModels/EmployeesViewModel.swift | 28 +++++++++++-- 3 files changed, 74 insertions(+), 7 deletions(-) diff --git a/EmployeeDirectory/Services/MockEmployeeService.swift b/EmployeeDirectory/Services/MockEmployeeService.swift index 9ec53be..29520c7 100644 --- a/EmployeeDirectory/Services/MockEmployeeService.swift +++ b/EmployeeDirectory/Services/MockEmployeeService.swift @@ -24,6 +24,7 @@ public class MockEmployeeService: EmployeeServiceProtocol { return } wrapper = localData + sortEmployees() } public func getEmployees(_ serviceMode: EmployeeServiceMode) async throws -> Employees { @@ -37,12 +38,9 @@ public class MockEmployeeService: EmployeeServiceProtocol { //resort mock data if sortField != self.sortField || sortOrder != self.sortOrder { - wrapper = .init(employees: wrapper.employees.sorted(by: sortField, with: sortOrder), - total: wrapper.employees.count, - page: page, - perPage: perPage) self.sortField = sortField self.sortOrder = sortOrder + sortEmployees() } let totalUsers = wrapper.employees.count @@ -57,6 +55,13 @@ public class MockEmployeeService: EmployeeServiceProtocol { let pagedEmployees = Array(wrapper.employees[startIndex..() + private var currentPage = 1 private let perPage = 10 private var totalEmployees = 0 - public init() {} + public init() { + observeSortingChanges() + } + + /// Observe changes to sortField and sortOrder and debounce fetch calls + private func observeSortingChanges() { + Publishers.CombineLatest($sortField, $sortOrder) + .debounce(for: .milliseconds(300), scheduler: DispatchQueue.main) + .sink { [weak self] _, _ in + self?.resetAndFetchEmployees() + } + .store(in: &cancellables) + } /// Fetch employees for the given page public func fetchEmployees(page: Int = 1) { @@ -35,8 +52,8 @@ public class EmployeesViewModel: ObservableObject { // Fetch employees using the paginated API let wrapper = try await employeeService.getEmployees(serviceMode, page: page, perPage: perPage, - sortField: .employeeType, - sortOrder: .ascending) + sortField: sortField, + sortOrder: sortOrder) // Update published properties if page == 1 { @@ -67,6 +84,11 @@ public class EmployeesViewModel: ObservableObject { /// Change the service mode (e.g., production, malformed, empty) public func changeMode(to mode: EmployeeServiceMode) { serviceMode = mode + resetAndFetchEmployees() + } + + /// Resets the current employee list and fetches data from page 1 + private func resetAndFetchEmployees() { currentPage = 1 employees = [] hasMorePages = true