diff --git a/Apps/Locations/Sources/Protocols/ViewModeling/LocationsListViewModeling.swift b/Apps/Locations/Sources/Protocols/ViewModeling/LocationsListViewModeling.swift index 90deeab..40691a3 100644 --- a/Apps/Locations/Sources/Protocols/ViewModeling/LocationsListViewModeling.swift +++ b/Apps/Locations/Sources/Protocols/ViewModeling/LocationsListViewModeling.swift @@ -6,12 +6,17 @@ // Copyright © 2023 Röck+Cöde. All rights reserved. // +import Combine +import Foundation + protocol LocationsListViewModeling: AnyObject { // MARK: Properties var coordinator: LocationsListCoordination? { get set } + var viewStatusPublisher: Published.Publisher { get } + // MARK: Functions func openAddLocation() diff --git a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift index 3868d89..9681ec5 100644 --- a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift +++ b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift @@ -6,6 +6,7 @@ // Copyright © 2023 Röck+Cöde. All rights reserved. // +import Combine import Core import UIKit @@ -15,6 +16,8 @@ class LocationsListViewController: BaseViewController { private let viewModel: LocationsListViewModeling + private var cancellables: Set = [] + // MARK: Outlets private lazy var error = ErrorMessageView() @@ -46,6 +49,7 @@ class LocationsListViewController: BaseViewController { setupBar() setupView() + bindViewModel() } } @@ -72,12 +76,7 @@ private extension LocationsListViewController { view.addSubview(table) view.addSubview(error) view.addSubview(loading) - - error.isHidden = true error.onRetry = { print("RETRY BUTTON PRESSED!") } - - loading.isHidden = true - NSLayoutConstraint.activate([ error.widthAnchor.constraint(equalToConstant: 300), view.centerXAnchor.constraint(equalTo: error.centerXAnchor), @@ -91,6 +90,19 @@ private extension LocationsListViewController { ]) } + func bindViewModel() { + viewModel + .viewStatusPublisher + .receive(on: RunLoop.main) + .sink { viewStatus in + self.navigationItem.rightBarButtonItem?.isEnabled = viewStatus == .loaded + self.error.isHidden = viewStatus != .error + self.loading.isHidden = viewStatus != .loading + self.table.isHidden = viewStatus != .loaded + } + .store(in: &cancellables) + } + @objc func addLocationPressed() { viewModel.openAddLocation() } diff --git a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift index c3644fa..6b4f55d 100644 --- a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift +++ b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift @@ -15,6 +15,8 @@ class LocationsListViewModel: ObservableObject { weak var coordinator: LocationsListCoordination? + @Published private var viewStatus: LocationsListViewStatus = .initialised + // MARK: Initialisers init(coordinator: LocationsListCoordination) { @@ -27,6 +29,10 @@ class LocationsListViewModel: ObservableObject { extension LocationsListViewModel: LocationsListViewModeling { + // MARK: Properties + + var viewStatusPublisher: Published.Publisher { $viewStatus } + // MARK: Functions func openAddLocation() { @@ -34,3 +40,12 @@ extension LocationsListViewModel: LocationsListViewModeling { } } + +// MARK: - Enumerations + +enum LocationsListViewStatus { + case initialised + case loading + case loaded + case error +}