diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift index edfeba7e408eb19bf9640f16fbe3a7891aaf739b..484c0112823ac3949e2cf8a24f32ea1af622b832 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 1f209ba392b3a22210778221499d6bf567e9484e..91b0acffa31647524cc91e1d9f2eec028768e064 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 f2fb823ce3772601b24e65bf66063bad2304846f..24465f6e6f3b39344d070660b21fdbaef0310a76 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 f381d20481b1800fa3ec9f827bc17d6925ee01b8..813a4534da468e32fc31fdde76c21ab4f8f00f33 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 + } + } }