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

Present Contacts from Home

parent 2708f07f
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!75Messenger example - contacts list
...@@ -73,6 +73,7 @@ let package = Package( ...@@ -73,6 +73,7 @@ let package = Package(
dependencies: [ dependencies: [
.target(name: "AppCore"), .target(name: "AppCore"),
.target(name: "ContactFeature"), .target(name: "ContactFeature"),
.target(name: "ContactsFeature"),
.target(name: "HomeFeature"), .target(name: "HomeFeature"),
.target(name: "RegisterFeature"), .target(name: "RegisterFeature"),
.target(name: "RestoreFeature"), .target(name: "RestoreFeature"),
...@@ -133,6 +134,7 @@ let package = Package( ...@@ -133,6 +134,7 @@ let package = Package(
name: "HomeFeature", name: "HomeFeature",
dependencies: [ dependencies: [
.target(name: "AppCore"), .target(name: "AppCore"),
.target(name: "ContactsFeature"),
.target(name: "RegisterFeature"), .target(name: "RegisterFeature"),
.target(name: "UserSearchFeature"), .target(name: "UserSearchFeature"),
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
......
import AppCore import AppCore
import ContactFeature import ContactFeature
import ContactsFeature
import Foundation import Foundation
import HomeFeature import HomeFeature
import RegisterFeature import RegisterFeature
...@@ -48,6 +49,9 @@ extension AppEnvironment { ...@@ -48,6 +49,9 @@ extension AppEnvironment {
bgQueue: bgQueue bgQueue: bgQueue
) )
}, },
contacts: {
ContactsEnvironment()
},
userSearch: { userSearch: {
UserSearchEnvironment( UserSearchEnvironment(
messenger: messenger, messenger: messenger,
......
...@@ -2,6 +2,7 @@ import AppCore ...@@ -2,6 +2,7 @@ import AppCore
import Combine import Combine
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation import ComposablePresentation
import ContactsFeature
import Foundation import Foundation
import RegisterFeature import RegisterFeature
import UserSearchFeature import UserSearchFeature
...@@ -16,6 +17,7 @@ public struct HomeState: Equatable { ...@@ -16,6 +17,7 @@ public struct HomeState: Equatable {
isDeletingAccount: Bool = false, isDeletingAccount: Bool = false,
alert: AlertState<HomeAction>? = nil, alert: AlertState<HomeAction>? = nil,
register: RegisterState? = nil, register: RegisterState? = nil,
contacts: ContactsState? = nil,
userSearch: UserSearchState? = nil userSearch: UserSearchState? = nil
) { ) {
self.failure = failure self.failure = failure
...@@ -23,6 +25,7 @@ public struct HomeState: Equatable { ...@@ -23,6 +25,7 @@ public struct HomeState: Equatable {
self.isDeletingAccount = isDeletingAccount self.isDeletingAccount = isDeletingAccount
self.alert = alert self.alert = alert
self.register = register self.register = register
self.contacts = contacts
self.userSearch = userSearch self.userSearch = userSearch
} }
...@@ -32,6 +35,7 @@ public struct HomeState: Equatable { ...@@ -32,6 +35,7 @@ public struct HomeState: Equatable {
public var isDeletingAccount: Bool public var isDeletingAccount: Bool
public var alert: AlertState<HomeAction>? public var alert: AlertState<HomeAction>?
public var register: RegisterState? public var register: RegisterState?
public var contacts: ContactsState?
public var userSearch: UserSearchState? public var userSearch: UserSearchState?
} }
...@@ -64,7 +68,10 @@ public enum HomeAction: Equatable { ...@@ -64,7 +68,10 @@ public enum HomeAction: Equatable {
case didDismissRegister case didDismissRegister
case userSearchButtonTapped case userSearchButtonTapped
case didDismissUserSearch case didDismissUserSearch
case contactsButtonTapped
case didDismissContacts
case register(RegisterAction) case register(RegisterAction)
case contacts(ContactsAction)
case userSearch(UserSearchAction) case userSearch(UserSearchAction)
} }
...@@ -75,6 +82,7 @@ public struct HomeEnvironment { ...@@ -75,6 +82,7 @@ public struct HomeEnvironment {
mainQueue: AnySchedulerOf<DispatchQueue>, mainQueue: AnySchedulerOf<DispatchQueue>,
bgQueue: AnySchedulerOf<DispatchQueue>, bgQueue: AnySchedulerOf<DispatchQueue>,
register: @escaping () -> RegisterEnvironment, register: @escaping () -> RegisterEnvironment,
contacts: @escaping () -> ContactsEnvironment,
userSearch: @escaping () -> UserSearchEnvironment userSearch: @escaping () -> UserSearchEnvironment
) { ) {
self.messenger = messenger self.messenger = messenger
...@@ -82,6 +90,7 @@ public struct HomeEnvironment { ...@@ -82,6 +90,7 @@ public struct HomeEnvironment {
self.mainQueue = mainQueue self.mainQueue = mainQueue
self.bgQueue = bgQueue self.bgQueue = bgQueue
self.register = register self.register = register
self.contacts = contacts
self.userSearch = userSearch self.userSearch = userSearch
} }
...@@ -90,6 +99,7 @@ public struct HomeEnvironment { ...@@ -90,6 +99,7 @@ public struct HomeEnvironment {
public var mainQueue: AnySchedulerOf<DispatchQueue> public var mainQueue: AnySchedulerOf<DispatchQueue>
public var bgQueue: AnySchedulerOf<DispatchQueue> public var bgQueue: AnySchedulerOf<DispatchQueue>
public var register: () -> RegisterEnvironment public var register: () -> RegisterEnvironment
public var contacts: () -> ContactsEnvironment
public var userSearch: () -> UserSearchEnvironment public var userSearch: () -> UserSearchEnvironment
} }
...@@ -100,6 +110,7 @@ extension HomeEnvironment { ...@@ -100,6 +110,7 @@ extension HomeEnvironment {
mainQueue: .unimplemented, mainQueue: .unimplemented,
bgQueue: .unimplemented, bgQueue: .unimplemented,
register: { .unimplemented }, register: { .unimplemented },
contacts: { .unimplemented },
userSearch: { .unimplemented } userSearch: { .unimplemented }
) )
} }
...@@ -238,11 +249,19 @@ public let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment> ...@@ -238,11 +249,19 @@ public let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment>
state.userSearch = nil state.userSearch = nil
return .none return .none
case .contactsButtonTapped:
state.contacts = ContactsState()
return .none
case .didDismissContacts:
state.contacts = nil
return .none
case .register(.finished): case .register(.finished):
state.register = nil state.register = nil
return Effect(value: .messenger(.start)) return Effect(value: .messenger(.start))
case .register(_), .userSearch(_): case .register(_), .contacts(_), .userSearch(_):
return .none return .none
} }
} }
...@@ -253,6 +272,13 @@ public let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment> ...@@ -253,6 +272,13 @@ public let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment>
action: /HomeAction.register, action: /HomeAction.register,
environment: { $0.register() } environment: { $0.register() }
) )
.presenting(
contactsReducer,
state: .keyPath(\.contacts),
id: .notNil(),
action: /HomeAction.contacts,
environment: { $0.contacts() }
)
.presenting( .presenting(
userSearchReducer, userSearchReducer,
state: .keyPath(\.userSearch), state: .keyPath(\.userSearch),
......
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation import ComposablePresentation
import ContactsFeature
import RegisterFeature import RegisterFeature
import SwiftUI import SwiftUI
import UserSearchFeature import UserSearchFeature
...@@ -88,6 +89,16 @@ public struct HomeView: View { ...@@ -88,6 +89,16 @@ public struct HomeView: View {
} }
Section { Section {
Button {
viewStore.send(.contactsButtonTapped)
} label: {
HStack {
Text("Contacts")
Spacer()
Image(systemName: "chevron.forward")
}
}
Button { Button {
viewStore.send(.userSearchButtonTapped) viewStore.send(.userSearchButtonTapped)
} label: { } label: {
...@@ -123,6 +134,16 @@ public struct HomeView: View { ...@@ -123,6 +134,16 @@ public struct HomeView: View {
store.scope(state: \.alert), store.scope(state: \.alert),
dismiss: HomeAction.didDismissAlert dismiss: HomeAction.didDismissAlert
) )
.background(NavigationLinkWithStore(
store.scope(
state: \.contacts,
action: HomeAction.contacts
),
onDeactivate: {
viewStore.send(.didDismissContacts)
},
destination: ContactsView.init(store:)
))
.background(NavigationLinkWithStore( .background(NavigationLinkWithStore(
store.scope( store.scope(
state: \.userSearch, state: \.userSearch,
......
import ComposableArchitecture import ComposableArchitecture
import ContactsFeature
import RegisterFeature import RegisterFeature
import UserSearchFeature import UserSearchFeature
import XCTest import XCTest
...@@ -464,4 +465,30 @@ final class HomeFeatureTests: XCTestCase { ...@@ -464,4 +465,30 @@ final class HomeFeatureTests: XCTestCase {
$0.userSearch = nil $0.userSearch = nil
} }
} }
func testContactsButtonTapped() {
let store = TestStore(
initialState: HomeState(),
reducer: homeReducer,
environment: .unimplemented
)
store.send(.contactsButtonTapped) {
$0.contacts = ContactsState()
}
}
func testDidDismissContacts() {
let store = TestStore(
initialState: HomeState(
contacts: ContactsState()
),
reducer: homeReducer,
environment: .unimplemented
)
store.send(.didDismissContacts) {
$0.contacts = 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