From bee12093852601243d6e575b9844288f022c0159 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Tue, 6 Sep 2022 13:01:19 +0200 Subject: [PATCH] Present UserSearch from Home --- Examples/xx-messenger/Package.swift | 2 ++ .../AppFeature/AppEnvironment+Live.swift | 4 +++ .../Sources/HomeFeature/HomeFeature.swift | 34 ++++++++++++++++--- .../Sources/HomeFeature/HomeView.swift | 25 ++++++++++++++ .../HomeFeatureTests/HomeFeatureTests.swift | 27 +++++++++++++++ 5 files changed, 88 insertions(+), 4 deletions(-) diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift index 1db1bdf6..74bda195 100644 --- a/Examples/xx-messenger/Package.swift +++ b/Examples/xx-messenger/Package.swift @@ -71,6 +71,7 @@ let package = Package( .target(name: "HomeFeature"), .target(name: "RegisterFeature"), .target(name: "RestoreFeature"), + .target(name: "UserSearchFeature"), .target(name: "WelcomeFeature"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), .product(name: "ComposablePresentation", package: "swift-composable-presentation"), @@ -91,6 +92,7 @@ let package = Package( dependencies: [ .target(name: "AppCore"), .target(name: "RegisterFeature"), + .target(name: "UserSearchFeature"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), .product(name: "ComposablePresentation", package: "swift-composable-presentation"), .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), diff --git a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift index 19f1b7f5..1fc08a8c 100644 --- a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift +++ b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift @@ -3,6 +3,7 @@ import Foundation import HomeFeature import RegisterFeature import RestoreFeature +import UserSearchFeature import WelcomeFeature import XXMessengerClient import XXModels @@ -44,6 +45,9 @@ extension AppEnvironment { mainQueue: mainQueue, bgQueue: bgQueue ) + }, + userSearch: { + UserSearchEnvironment() } ) } diff --git a/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift b/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift index 0a019179..51083ea0 100644 --- a/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift +++ b/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift @@ -4,6 +4,7 @@ import ComposableArchitecture import ComposablePresentation import Foundation import RegisterFeature +import UserSearchFeature import XXClient import XXMessengerClient @@ -14,13 +15,15 @@ public struct HomeState: Equatable { networkNodesReport: NodeRegistrationReport? = nil, isDeletingAccount: Bool = false, alert: AlertState<HomeAction>? = nil, - register: RegisterState? = nil + register: RegisterState? = nil, + userSearch: UserSearchState? = nil ) { self.failure = failure self.isNetworkHealthy = isNetworkHealthy self.isDeletingAccount = isDeletingAccount self.alert = alert self.register = register + self.userSearch = userSearch } public var failure: String? @@ -29,6 +32,7 @@ public struct HomeState: Equatable { public var isDeletingAccount: Bool public var alert: AlertState<HomeAction>? public var register: RegisterState? + public var userSearch: UserSearchState? } public enum HomeAction: Equatable { @@ -58,7 +62,10 @@ public enum HomeAction: Equatable { case deleteAccount(DeleteAccount) case didDismissAlert case didDismissRegister + case userSearchButtonTapped + case didDismissUserSearch case register(RegisterAction) + case userSearch(UserSearchAction) } public struct HomeEnvironment { @@ -67,13 +74,15 @@ public struct HomeEnvironment { db: DBManagerGetDB, mainQueue: AnySchedulerOf<DispatchQueue>, bgQueue: AnySchedulerOf<DispatchQueue>, - register: @escaping () -> RegisterEnvironment + register: @escaping () -> RegisterEnvironment, + userSearch: @escaping () -> UserSearchEnvironment ) { self.messenger = messenger self.db = db self.mainQueue = mainQueue self.bgQueue = bgQueue self.register = register + self.userSearch = userSearch } public var messenger: Messenger @@ -81,6 +90,7 @@ public struct HomeEnvironment { public var mainQueue: AnySchedulerOf<DispatchQueue> public var bgQueue: AnySchedulerOf<DispatchQueue> public var register: () -> RegisterEnvironment + public var userSearch: () -> UserSearchEnvironment } extension HomeEnvironment { @@ -89,7 +99,8 @@ extension HomeEnvironment { db: .unimplemented, mainQueue: .unimplemented, bgQueue: .unimplemented, - register: { .unimplemented } + register: { .unimplemented }, + userSearch: { .unimplemented } ) } @@ -219,11 +230,19 @@ public let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment> state.register = nil return .none + case .userSearchButtonTapped: + state.userSearch = UserSearchState() + return .none + + case .didDismissUserSearch: + state.userSearch = nil + return .none + case .register(.finished): state.register = nil return Effect(value: .messenger(.start)) - case .register(_): + case .register(_), .userSearch(_): return .none } } @@ -234,3 +253,10 @@ public let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment> action: /HomeAction.register, environment: { $0.register() } ) +.presenting( + userSearchReducer, + state: .keyPath(\.userSearch), + id: .notNil(), + action: /HomeAction.userSearch, + environment: { $0.userSearch() } +) diff --git a/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift b/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift index ce8aac42..e52e8d1b 100644 --- a/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift +++ b/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift @@ -2,6 +2,7 @@ import ComposableArchitecture import ComposablePresentation import RegisterFeature import SwiftUI +import UserSearchFeature import XXClient public struct HomeView: View { @@ -86,6 +87,20 @@ public struct HomeView: View { Text("Network") } + Section { + Button { + viewStore.send(.userSearchButtonTapped) + } label: { + HStack { + Text("Search users") + Spacer() + Image(systemName: "chevron.forward") + } + } + } header: { + Text("Contacts") + } + Section { Button(role: .destructive) { viewStore.send(.deleteAccount(.buttonTapped)) @@ -108,6 +123,16 @@ public struct HomeView: View { store.scope(state: \.alert), dismiss: HomeAction.didDismissAlert ) + .background(NavigationLinkWithStore( + store.scope( + state: \.userSearch, + action: HomeAction.userSearch + ), + onDeactivate: { + viewStore.send(.didDismissUserSearch) + }, + destination: UserSearchView.init(store:) + )) } .navigationViewStyle(.stack) .task { viewStore.send(.messenger(.start)) } diff --git a/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift b/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift index c7168d5b..aa309016 100644 --- a/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift +++ b/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift @@ -1,5 +1,6 @@ import ComposableArchitecture import RegisterFeature +import UserSearchFeature import XCTest import XXClient import XXMessengerClient @@ -437,4 +438,30 @@ final class HomeFeatureTests: XCTestCase { $0.register = nil } } + + func testUserSearchButtonTapped() { + let store = TestStore( + initialState: HomeState(), + reducer: homeReducer, + environment: .unimplemented + ) + + store.send(.userSearchButtonTapped) { + $0.userSearch = UserSearchState() + } + } + + func testDidDismissUserSearch() { + let store = TestStore( + initialState: HomeState( + userSearch: UserSearchState() + ), + reducer: homeReducer, + environment: .unimplemented + ) + + store.send(.didDismissUserSearch) { + $0.userSearch = nil + } + } } -- GitLab