From b75b9ccca7ef7137a43eba649b646dc44967ee75 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 2 Dec 2022 11:05:22 +0100
Subject: [PATCH] Present group from groups list

---
 Examples/xx-messenger/Package.swift           |  1 +
 .../GroupsFeature/GroupsComponent.swift       | 23 ++++++++++++++---
 .../Sources/GroupsFeature/GroupsView.swift    |  9 +++++++
 .../GroupsComponentTests.swift                | 25 ++++++++++++++++++-
 4 files changed, 54 insertions(+), 4 deletions(-)

diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift
index 0a4226fd..2c22609f 100644
--- a/Examples/xx-messenger/Package.swift
+++ b/Examples/xx-messenger/Package.swift
@@ -287,6 +287,7 @@ let package = Package(
       name: "GroupsFeature",
       dependencies: [
         .target(name: "AppCore"),
+        .target(name: "GroupFeature"),
         .target(name: "NewGroupFeature"),
         .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
         .product(name: "ComposablePresentation", package: "swift-composable-presentation"),
diff --git a/Examples/xx-messenger/Sources/GroupsFeature/GroupsComponent.swift b/Examples/xx-messenger/Sources/GroupsFeature/GroupsComponent.swift
index a5f3077d..0a22359f 100644
--- a/Examples/xx-messenger/Sources/GroupsFeature/GroupsComponent.swift
+++ b/Examples/xx-messenger/Sources/GroupsFeature/GroupsComponent.swift
@@ -2,6 +2,7 @@ import AppCore
 import ComposableArchitecture
 import ComposablePresentation
 import Foundation
+import GroupFeature
 import NewGroupFeature
 import XXModels
 
@@ -9,23 +10,28 @@ public struct GroupsComponent: ReducerProtocol {
   public struct State: Equatable {
     public init(
       groups: IdentifiedArrayOf<Group> = [],
-      newGroup: NewGroupComponent.State? = nil
+      newGroup: NewGroupComponent.State? = nil,
+      group: GroupComponent.State? = nil
     ) {
       self.groups = groups
       self.newGroup = newGroup
+      self.group = group
     }
 
     public var groups: IdentifiedArrayOf<XXModels.Group> = []
     public var newGroup: NewGroupComponent.State?
+    public var group: GroupComponent.State?
   }
 
   public enum Action: Equatable {
     case start
     case didFetchGroups([XXModels.Group])
     case didSelectGroup(XXModels.Group)
+    case didDismissGroup
     case newGroupButtonTapped
     case newGroupDismissed
     case newGroup(NewGroupComponent.Action)
+    case group(GroupComponent.Action)
   }
 
   public init() {}
@@ -51,7 +57,12 @@ public struct GroupsComponent: ReducerProtocol {
         state.groups = IdentifiedArray(uniqueElements: groups)
         return .none
 
-      case .didSelectGroup(_):
+      case .didSelectGroup(let group):
+        state.group = GroupComponent.State(group: group)
+        return .none
+
+      case .didDismissGroup:
+        state.group = nil
         return .none
 
       case .newGroupButtonTapped:
@@ -66,7 +77,7 @@ public struct GroupsComponent: ReducerProtocol {
         state.newGroup = nil
         return .none
 
-      case .newGroup(_):
+      case .newGroup(_), .group(_):
         return .none
       }
     }
@@ -76,5 +87,11 @@ public struct GroupsComponent: ReducerProtocol {
       action: /Action.newGroup,
       presented: { NewGroupComponent() }
     )
+    .presenting(
+      state: .keyPath(\.group),
+      id: .notNil(),
+      action: /Action.group,
+      presented: { GroupComponent() }
+    )
   }
 }
diff --git a/Examples/xx-messenger/Sources/GroupsFeature/GroupsView.swift b/Examples/xx-messenger/Sources/GroupsFeature/GroupsView.swift
index 44c38ce9..1391f6d9 100644
--- a/Examples/xx-messenger/Sources/GroupsFeature/GroupsView.swift
+++ b/Examples/xx-messenger/Sources/GroupsFeature/GroupsView.swift
@@ -1,6 +1,7 @@
 import AppCore
 import ComposableArchitecture
 import ComposablePresentation
+import GroupFeature
 import NewGroupFeature
 import SwiftUI
 import XXModels
@@ -41,6 +42,14 @@ public struct GroupsView: View {
         onDeactivate: { viewStore.send(.newGroupDismissed) },
         destination: NewGroupView.init
       ))
+      .background(NavigationLinkWithStore(
+        store.scope(
+          state: \.group,
+          action: Component.Action.group
+        ),
+        onDeactivate: { viewStore.send(.didDismissGroup) },
+        destination: GroupView.init
+      ))
       .task { viewStore.send(.start) }
     }
   }
diff --git a/Examples/xx-messenger/Tests/GroupsFeatureTests/GroupsComponentTests.swift b/Examples/xx-messenger/Tests/GroupsFeatureTests/GroupsComponentTests.swift
index f8b06a18..49778aab 100644
--- a/Examples/xx-messenger/Tests/GroupsFeatureTests/GroupsComponentTests.swift
+++ b/Examples/xx-messenger/Tests/GroupsFeatureTests/GroupsComponentTests.swift
@@ -1,6 +1,7 @@
 import Combine
 import ComposableArchitecture
 import CustomDump
+import GroupFeature
 import NewGroupFeature
 import XCTest
 import XXModels
@@ -72,7 +73,29 @@ final class GroupsComponentTests: XCTestCase {
       reducer: GroupsComponent()
     )
 
-    store.send(.didSelectGroup(.stub(2)))
+    store.send(.didSelectGroup(.stub(2))) {
+      $0.group = GroupComponent.State(group: .stub(2))
+    }
+  }
+
+  func testDismissGroup() {
+    let store = TestStore(
+      initialState: GroupsComponent.State(
+        groups: IdentifiedArray(uniqueElements: [
+          .stub(1),
+          .stub(2),
+          .stub(3),
+        ]),
+        group: GroupComponent.State(
+          group: .stub(2)
+        )
+      ),
+      reducer: GroupsComponent()
+    )
+
+    store.send(.didDismissGroup) {
+      $0.group = nil
+    }
   }
 
   func testPresentNewGroup() {
-- 
GitLab