diff --git a/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift b/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift index 818807c8229fed9d17ccd90c94711046dc651d37..c08ed6b75635f299af58763af63e5c5627635b0e 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 6e2cbc8fc9f3d9ed5edca7ab057c633a19e1fa48..7eb8e7aaddbc5716dcb064eb33b62cbfe1ddb7bf 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 62e7fcd9959e5583e55bce9c5a2a6cb413999c32..4193e935c8724d101629c5c72c1fb3088225f332 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() {