Skip to content
Snippets Groups Projects
Commit bee12093 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Present UserSearch from Home

parent 95e14799
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!65Messenger example - user search
......@@ -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"),
......
......@@ -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()
}
)
}
......
......@@ -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() }
)
......@@ -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)) }
......
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
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment