diff --git a/CountriesSwiftUI/Interactors/CountriesInteractor.swift b/CountriesSwiftUI/Interactors/CountriesInteractor.swift index 35f4367..998b2fb 100644 --- a/CountriesSwiftUI/Interactors/CountriesInteractor.swift +++ b/CountriesSwiftUI/Interactors/CountriesInteractor.swift @@ -12,7 +12,7 @@ import SwiftUI protocol CountriesInteractor { func loadCountries() - func load(countryDetails: Binding>, country: Country) + func load(countryDetails: LoadableSubject, country: Country) } struct RealCountriesInteractor: CountriesInteractor { @@ -26,19 +26,17 @@ struct RealCountriesInteractor: CountriesInteractor { } func loadCountries() { - let countries = appState.value.userData.countries.value let cancelBag = CancelBag() - appState[\.userData.countries] = .isLoading(last: countries, cancelBag: cancelBag) + appState[\.userData.countries].setIsLoading(cancelBag: cancelBag) weak var weakAppState = appState webRepository.loadCountries() .sinkToLoadable { weakAppState?[\.userData.countries] = $0 } .store(in: cancelBag) } - func load(countryDetails: Binding>, country: Country) { + func load(countryDetails: LoadableSubject, country: Country) { let cancelBag = CancelBag() - countryDetails.wrappedValue = .isLoading(last: countryDetails.wrappedValue.value, - cancelBag: cancelBag) + countryDetails.wrappedValue.setIsLoading(cancelBag: cancelBag) let countriesArray = appState .map { $0.userData.countries } .tryMap { countries -> [Country] in @@ -64,6 +62,6 @@ struct StubCountriesInteractor: CountriesInteractor { func loadCountries() { } - func load(countryDetails: Binding>, country: Country) { + func load(countryDetails: LoadableSubject, country: Country) { } } diff --git a/CountriesSwiftUI/Interactors/ImagesInteractor.swift b/CountriesSwiftUI/Interactors/ImagesInteractor.swift index 8f7b194..e5f6d62 100644 --- a/CountriesSwiftUI/Interactors/ImagesInteractor.swift +++ b/CountriesSwiftUI/Interactors/ImagesInteractor.swift @@ -11,7 +11,7 @@ import Foundation import SwiftUI protocol ImagesInteractor { - func load(image: Binding>, url: URL?) + func load(image: LoadableSubject, url: URL?) } struct RealImagesInteractor: ImagesInteractor { @@ -22,12 +22,12 @@ struct RealImagesInteractor: ImagesInteractor { self.webRepository = webRepository } - func load(image: Binding>, url: URL?) { + func load(image: LoadableSubject, url: URL?) { guard let url = url else { image.wrappedValue = .notRequested; return } let cancelBag = CancelBag() - image.wrappedValue = .isLoading(last: image.wrappedValue.value, cancelBag: cancelBag) + image.wrappedValue.setIsLoading(cancelBag: cancelBag) webRepository.load(imageURL: url, width: 300) .sinkToLoadable { image.wrappedValue = $0 @@ -37,6 +37,6 @@ struct RealImagesInteractor: ImagesInteractor { } struct StubImagesInteractor: ImagesInteractor { - func load(image: Binding>, url: URL?) { + func load(image: LoadableSubject, url: URL?) { } } diff --git a/CountriesSwiftUI/Utilities/Loadable.swift b/CountriesSwiftUI/Utilities/Loadable.swift index 6e789e4..ea70a12 100644 --- a/CountriesSwiftUI/Utilities/Loadable.swift +++ b/CountriesSwiftUI/Utilities/Loadable.swift @@ -7,6 +7,9 @@ // import Foundation +import SwiftUI + +typealias LoadableSubject = Binding> enum Loadable { @@ -32,6 +35,10 @@ enum Loadable { extension Loadable { + mutating func setIsLoading(cancelBag: CancelBag) { + self = .isLoading(last: value, cancelBag: cancelBag) + } + mutating func cancelLoading() { switch self { case let .isLoading(last, cancelBag): diff --git a/CountriesSwiftUI/Utilities/NetworkingHelpers.swift b/CountriesSwiftUI/Utilities/NetworkingHelpers.swift index 4bdff63..5061132 100644 --- a/CountriesSwiftUI/Utilities/NetworkingHelpers.swift +++ b/CountriesSwiftUI/Utilities/NetworkingHelpers.swift @@ -6,6 +6,7 @@ // Copyright © 2020 Alexey Naumov. All rights reserved. // +import SwiftUI import Combine import Foundation diff --git a/UnitTests/Mocks/MockedInteractors.swift b/UnitTests/Mocks/MockedInteractors.swift index c3f0bb0..8fb0bef 100644 --- a/UnitTests/Mocks/MockedInteractors.swift +++ b/UnitTests/Mocks/MockedInteractors.swift @@ -48,7 +48,7 @@ struct MockedCountriesInteractor: Mock, CountriesInteractor { register(.loadCountries) } - func load(countryDetails: Binding>, country: Country) { + func load(countryDetails: LoadableSubject, country: Country) { register(.loadCountryDetails(country)) } } @@ -67,7 +67,7 @@ struct MockedImagesInteractor: Mock, ImagesInteractor { self.actions = .init(expected: expected) } - func load(image: Binding>, url: URL?) { + func load(image: LoadableSubject, url: URL?) { register(.loadImage(url)) } }