From 1d201c28badc516a14ced0297a0eb98c88c07377 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Tue, 20 Sep 2022 12:32:00 +0200 Subject: [PATCH] Add facts loading indicator --- .../Sources/MyContactFeature/MyContactFeature.swift | 5 +++++ .../Sources/MyContactFeature/MyContactView.swift | 11 ++++++++++- .../MyContactFeatureTests/MyContactFeatureTests.swift | 8 +++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift b/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift index 818807c8..c08ed6b7 100644 --- a/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift +++ b/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift @@ -18,12 +18,14 @@ public struct MyContactState: Equatable { focusedField: Field? = nil, email: String = "", phone: String = "", + isLoadingFacts: Bool = false, alert: AlertState<MyContactAction>? = nil ) { self.contact = contact self.focusedField = focusedField self.email = email self.phone = phone + self.isLoadingFacts = isLoadingFacts self.alert = alert } @@ -31,6 +33,7 @@ public struct MyContactState: Equatable { @BindableState public var focusedField: Field? @BindableState public var email: String @BindableState public var phone: String + @BindableState public var isLoadingFacts: Bool public var alert: AlertState<MyContactAction>? } @@ -112,6 +115,7 @@ public let myContactReducer = Reducer<MyContactState, MyContactAction, MyContact return .none case .loadFactsTapped: + state.isLoadingFacts = true return Effect.run { subscriber in do { let contactId = try env.messenger.e2e.tryGet().getContact().getId() @@ -124,6 +128,7 @@ public let myContactReducer = Reducer<MyContactState, MyContactAction, MyContact } catch { subscriber.send(.didFail(error.localizedDescription)) } + subscriber.send(.set(\.$isLoadingFacts, false)) subscriber.send(completion: .finished) return AnyCancellable {} } diff --git a/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift b/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift index 6e2cbc8f..7eb8e7aa 100644 --- a/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift +++ b/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift @@ -16,12 +16,14 @@ public struct MyContactView: View { focusedField = state.focusedField email = state.email phone = state.phone + isLoadingFacts = state.isLoadingFacts } var contact: XXModels.Contact? var focusedField: MyContactState.Field? var email: String var phone: String + var isLoadingFacts: Bool } public var body: some View { @@ -105,8 +107,15 @@ public struct MyContactView: View { Button { viewStore.send(.loadFactsTapped) } label: { - Text("Load facts from client") + HStack { + Text("Reload facts") + Spacer() + if viewStore.isLoadingFacts { + ProgressView() + } + } } + .disabled(viewStore.isLoadingFacts) } header: { Text("Actions") } diff --git a/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift b/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift index 62e7fcd9..4193e935 100644 --- a/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift +++ b/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift @@ -159,13 +159,19 @@ final class MyContactFeatureTests: XCTestCase { return db } - store.send(.loadFactsTapped) + store.send(.loadFactsTapped) { + $0.isLoadingFacts = true + } XCTAssertNoDifference(didFetchContacts, [.init(id: [contactId])]) var expectedSavedContact = dbContact expectedSavedContact.email = email expectedSavedContact.phone = phone XCTAssertNoDifference(didSaveContact, [expectedSavedContact]) + + store.receive(.set(\.$isLoadingFacts, false)) { + $0.isLoadingFacts = false + } } func testErrorAlert() { -- GitLab