From 3910762990c02ec2378401468b37b6b2c2dffbb0 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Wed, 30 Nov 2022 10:18:27 +0100
Subject: [PATCH] Present groups from home

---
 Examples/xx-messenger/Package.swift           |  1 +
 .../Sources/HomeFeature/HomeComponent.swift   | 25 +++++++++++++++++--
 .../Sources/HomeFeature/HomeView.swift        | 21 ++++++++++++++++
 .../HomeFeatureTests/HomeComponentTests.swift | 25 +++++++++++++++++++
 4 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift
index edfeba7e..484c0112 100644
--- a/Examples/xx-messenger/Package.swift
+++ b/Examples/xx-messenger/Package.swift
@@ -287,6 +287,7 @@ let package = Package(
         .target(name: "AppCore"),
         .target(name: "BackupFeature"),
         .target(name: "ContactsFeature"),
+        .target(name: "GroupsFeature"),
         .target(name: "RegisterFeature"),
         .target(name: "UserSearchFeature"),
         .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
diff --git a/Examples/xx-messenger/Sources/HomeFeature/HomeComponent.swift b/Examples/xx-messenger/Sources/HomeFeature/HomeComponent.swift
index 1f209ba3..91b0acff 100644
--- a/Examples/xx-messenger/Sources/HomeFeature/HomeComponent.swift
+++ b/Examples/xx-messenger/Sources/HomeFeature/HomeComponent.swift
@@ -5,6 +5,7 @@ import ComposableArchitecture
 import ComposablePresentation
 import ContactsFeature
 import Foundation
+import GroupsFeature
 import RegisterFeature
 import UserSearchFeature
 import XCTestDynamicOverlay
@@ -23,7 +24,8 @@ public struct HomeComponent: ReducerProtocol {
       register: RegisterComponent.State? = nil,
       contacts: ContactsComponent.State? = nil,
       userSearch: UserSearchComponent.State? = nil,
-      backup: BackupComponent.State? = nil
+      backup: BackupComponent.State? = nil,
+      groups: GroupsComponent.State? = nil
     ) {
       self.failure = failure
       self.isNetworkHealthy = isNetworkHealthy
@@ -33,6 +35,7 @@ public struct HomeComponent: ReducerProtocol {
       self.contacts = contacts
       self.userSearch = userSearch
       self.backup = backup
+      self.groups = groups
     }
 
     public var failure: String?
@@ -44,6 +47,7 @@ public struct HomeComponent: ReducerProtocol {
     public var contacts: ContactsComponent.State?
     public var userSearch: UserSearchComponent.State?
     public var backup: BackupComponent.State?
+    public var groups: GroupsComponent.State?
   }
 
   public enum Action: Equatable {
@@ -79,10 +83,13 @@ public struct HomeComponent: ReducerProtocol {
     case didDismissContacts
     case backupButtonTapped
     case didDismissBackup
+    case groupsButtonTapped
+    case didDismissGroups
     case register(RegisterComponent.Action)
     case contacts(ContactsComponent.Action)
     case userSearch(UserSearchComponent.Action)
     case backup(BackupComponent.Action)
+    case groups(GroupsComponent.Action)
   }
 
   public init() {}
@@ -264,7 +271,15 @@ public struct HomeComponent: ReducerProtocol {
         state.backup = nil
         return .none
 
-      case .register(_), .contacts(_), .userSearch(_), .backup(_):
+      case .groupsButtonTapped:
+        state.groups = GroupsComponent.State()
+        return .none
+
+      case .didDismissGroups:
+        state.groups = nil
+        return .none
+
+      case .register(_), .contacts(_), .userSearch(_), .backup(_), .groups(_):
         return .none
       }
     }
@@ -292,5 +307,11 @@ public struct HomeComponent: ReducerProtocol {
       action: /Action.backup,
       presented: { BackupComponent() }
     )
+    .presenting(
+      state: .keyPath(\.groups),
+      id: .notNil(),
+      action: /Action.groups,
+      presented: { GroupsComponent() }
+    )
   }
 }
diff --git a/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift b/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift
index f2fb823c..24465f6e 100644
--- a/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift
+++ b/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift
@@ -3,6 +3,7 @@ import BackupFeature
 import ComposableArchitecture
 import ComposablePresentation
 import ContactsFeature
+import GroupsFeature
 import RegisterFeature
 import SwiftUI
 import UserSearchFeature
@@ -109,6 +110,16 @@ public struct HomeView: View {
                 Image(systemName: "chevron.forward")
               }
             }
+
+            Button {
+              viewStore.send(.groupsButtonTapped)
+            } label: {
+              HStack {
+                Text("Groups")
+                Spacer()
+                Image(systemName: "chevron.forward")
+              }
+            }
           } header: {
             Text("Contacts")
           }
@@ -181,6 +192,16 @@ public struct HomeView: View {
           },
           destination: BackupView.init(store:)
         ))
+        .background(NavigationLinkWithStore(
+          store.scope(
+            state: \.groups,
+            action: HomeComponent.Action.groups
+          ),
+          onDeactivate: {
+            viewStore.send(.didDismissGroups)
+          },
+          destination: GroupsView.init(store:)
+        ))
       }
       .navigationViewStyle(.stack)
       .task { viewStore.send(.messenger(.start)) }
diff --git a/Examples/xx-messenger/Tests/HomeFeatureTests/HomeComponentTests.swift b/Examples/xx-messenger/Tests/HomeFeatureTests/HomeComponentTests.swift
index f381d204..813a4534 100644
--- a/Examples/xx-messenger/Tests/HomeFeatureTests/HomeComponentTests.swift
+++ b/Examples/xx-messenger/Tests/HomeFeatureTests/HomeComponentTests.swift
@@ -3,6 +3,7 @@ import BackupFeature
 import ComposableArchitecture
 import ContactsFeature
 import CustomDump
+import GroupsFeature
 import RegisterFeature
 import UserSearchFeature
 import XCTest
@@ -540,4 +541,28 @@ final class HomeComponentTests: XCTestCase {
       $0.backup = nil
     }
   }
+
+  func testGroupsButtonTapped() {
+    let store = TestStore(
+      initialState: HomeComponent.State(),
+      reducer: HomeComponent()
+    )
+
+    store.send(.groupsButtonTapped) {
+      $0.groups = GroupsComponent.State()
+    }
+  }
+
+  func testDidDismissGroups() {
+    let store = TestStore(
+      initialState: HomeComponent.State(
+        groups: GroupsComponent.State()
+      ),
+      reducer: HomeComponent()
+    )
+
+    store.send(.didDismissGroups) {
+      $0.groups = nil
+    }
+  }
 }
-- 
GitLab