From 2bd54573482aed14c8bd9623d17baec22ffae406 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Tue, 20 Sep 2022 11:36:52 +0200 Subject: [PATCH] Add error alert to MyContactFeature --- .../Sources/MyContactFeature/Alerts.swift | 11 +++++++++++ .../MyContactFeature/MyContactFeature.swift | 15 ++++++++++++++- .../MyContactFeature/MyContactView.swift | 1 + .../MyContactFeatureTests.swift | 18 ++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 Examples/xx-messenger/Sources/MyContactFeature/Alerts.swift diff --git a/Examples/xx-messenger/Sources/MyContactFeature/Alerts.swift b/Examples/xx-messenger/Sources/MyContactFeature/Alerts.swift new file mode 100644 index 00000000..321139ae --- /dev/null +++ b/Examples/xx-messenger/Sources/MyContactFeature/Alerts.swift @@ -0,0 +1,11 @@ +import ComposableArchitecture + +extension AlertState { + public static func error(_ message: String) -> AlertState<MyContactAction> { + AlertState<MyContactAction>( + title: TextState("Error"), + message: TextState(message), + buttons: [] + ) + } +} diff --git a/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift b/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift index c2cfe972..9669cac5 100644 --- a/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift +++ b/Examples/xx-messenger/Sources/MyContactFeature/MyContactFeature.swift @@ -16,18 +16,21 @@ public struct MyContactState: Equatable { contact: XXModels.Contact? = nil, focusedField: Field? = nil, email: String = "", - phone: String = "" + phone: String = "", + alert: AlertState<MyContactAction>? = nil ) { self.contact = contact self.focusedField = focusedField self.email = email self.phone = phone + self.alert = alert } public var contact: XXModels.Contact? @BindableState public var focusedField: Field? @BindableState public var email: String @BindableState public var phone: String + public var alert: AlertState<MyContactAction>? } public enum MyContactAction: Equatable, BindableAction { @@ -38,6 +41,8 @@ public enum MyContactAction: Equatable, BindableAction { case registerPhoneTapped case unregisterPhoneTapped case loadFactsTapped + case didFail(String) + case alertDismissed case binding(BindingAction<MyContactState>) } @@ -108,6 +113,14 @@ public let myContactReducer = Reducer<MyContactState, MyContactAction, MyContact case .loadFactsTapped: return .none + case .didFail(let failure): + state.alert = .error(failure) + return .none + + case .alertDismissed: + state.alert = nil + return .none + case .binding(_): return .none } diff --git a/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift b/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift index 0887f682..6e2cbc8f 100644 --- a/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift +++ b/Examples/xx-messenger/Sources/MyContactFeature/MyContactView.swift @@ -115,6 +115,7 @@ public struct MyContactView: View { .task { viewStore.send(.start) } .onChange(of: viewStore.focusedField) { focusedField = $0 } .onChange(of: focusedField) { viewStore.send(.set(\.$focusedField, $0)) } + .alert(store.scope(state: \.alert), dismiss: .alertDismissed) } } } diff --git a/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift b/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift index eba876a9..169450c8 100644 --- a/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift +++ b/Examples/xx-messenger/Tests/MyContactFeatureTests/MyContactFeatureTests.swift @@ -119,4 +119,22 @@ final class MyContactFeatureTests: XCTestCase { store.send(.loadFactsTapped) } + + func testErrorAlert() { + let store = TestStore( + initialState: MyContactState(), + reducer: myContactReducer, + environment: .unimplemented + ) + + let failure = "Something went wrong" + + store.send(.didFail(failure)) { + $0.alert = .error(failure) + } + + store.send(.alertDismissed) { + $0.alert = nil + } + } } -- GitLab