// // LocationsListViewModel.swift // Locations // // Created by Javier Cicchelli on 11/04/2023. // Copyright © 2023 Röck+Cöde. All rights reserved. // import Combine import Dependency import Foundation import Persistence class LocationsListViewModel: ObservableObject { // MARK: Dependencies @Dependency(\.persistence) private var persistence // MARK: Properties weak var coordinator: LocationsListCoordination? private lazy var locationProvider = LocationProvider(managedContext: persistence.container.viewContext) @Published private var viewStatus: LocationsListViewStatus = .initialised private let loadRemoteLocations = LoadRemoteLocationsUseCase() // MARK: Initialisers init(coordinator: LocationsListCoordination) { self.coordinator = coordinator } } // MARK: - LocationsListViewModeling extension LocationsListViewModel: LocationsListViewModeling { // MARK: Properties var locationsDidChangePublisher: PassthroughSubject<[Persistence.Change], Never> { locationProvider.didChangePublisher } var numberOfLocationSections: Int { locationProvider.numberOfSections } var viewStatusPublisher: Published.Publisher { $viewStatus } // MARK: Functions func loadLocations() { Task { do { viewStatus = .loading try await loadRemoteLocations() try locationProvider.fetch() viewStatus = .loaded } catch { viewStatus = .error } } } func location(at indexPath: IndexPath) -> Location { locationProvider.location(at: indexPath) } func numberOfLocations(in section: Int) -> Int { locationProvider.numberOfLocationsInSection(section) } func openLocationsAdd() { coordinator?.openLocationsAddScreen() } } } // MARK: - Enumerations enum LocationsListViewStatus { case initialised case loading case loaded case error }