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