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

Present Chat from Contact

parent 54342d11
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!87Messenger example - chat
......@@ -77,6 +77,7 @@ let package = Package(
name: "AppFeature",
dependencies: [
.target(name: "AppCore"),
.target(name: "ChatFeature"),
.target(name: "CheckContactAuthFeature"),
.target(name: "ConfirmRequestFeature"),
.target(name: "ContactFeature"),
......@@ -152,6 +153,7 @@ let package = Package(
name: "ContactFeature",
dependencies: [
.target(name: "AppCore"),
.target(name: "ChatFeature"),
.target(name: "CheckContactAuthFeature"),
.target(name: "ConfirmRequestFeature"),
.target(name: "SendRequestFeature"),
......
import AppCore
import ChatFeature
import CheckContactAuthFeature
import ConfirmRequestFeature
import ContactFeature
......@@ -64,6 +65,9 @@ extension AppEnvironment {
mainQueue: mainQueue,
bgQueue: bgQueue
)
},
chat: {
ChatEnvironment()
}
)
......
import AppCore
import ChatFeature
import CheckContactAuthFeature
import ComposableArchitecture
import ComposablePresentation
......@@ -22,7 +23,8 @@ public struct ContactState: Equatable {
sendRequest: SendRequestState? = nil,
verifyContact: VerifyContactState? = nil,
confirmRequest: ConfirmRequestState? = nil,
checkAuth: CheckContactAuthState? = nil
checkAuth: CheckContactAuthState? = nil,
chat: ChatState? = nil
) {
self.id = id
self.dbContact = dbContact
......@@ -34,6 +36,7 @@ public struct ContactState: Equatable {
self.verifyContact = verifyContact
self.confirmRequest = confirmRequest
self.checkAuth = checkAuth
self.chat = chat
}
public var id: Data
......@@ -46,6 +49,7 @@ public struct ContactState: Equatable {
public var verifyContact: VerifyContactState?
public var confirmRequest: ConfirmRequestState?
public var checkAuth: CheckContactAuthState?
public var chat: ChatState?
}
public enum ContactAction: Equatable, BindableAction {
......@@ -64,6 +68,9 @@ public enum ContactAction: Equatable, BindableAction {
case confirmRequestTapped
case confirmRequestDismissed
case confirmRequest(ConfirmRequestAction)
case chatTapped
case chatDismissed
case chat(ChatAction)
case binding(BindingAction<ContactState>)
}
......@@ -76,7 +83,8 @@ public struct ContactEnvironment {
sendRequest: @escaping () -> SendRequestEnvironment,
verifyContact: @escaping () -> VerifyContactEnvironment,
confirmRequest: @escaping () -> ConfirmRequestEnvironment,
checkAuth: @escaping () -> CheckContactAuthEnvironment
checkAuth: @escaping () -> CheckContactAuthEnvironment,
chat: @escaping () -> ChatEnvironment
) {
self.messenger = messenger
self.db = db
......@@ -86,6 +94,7 @@ public struct ContactEnvironment {
self.verifyContact = verifyContact
self.confirmRequest = confirmRequest
self.checkAuth = checkAuth
self.chat = chat
}
public var messenger: Messenger
......@@ -96,6 +105,7 @@ public struct ContactEnvironment {
public var verifyContact: () -> VerifyContactEnvironment
public var confirmRequest: () -> ConfirmRequestEnvironment
public var checkAuth: () -> CheckContactAuthEnvironment
public var chat: () -> ChatEnvironment
}
#if DEBUG
......@@ -108,7 +118,8 @@ extension ContactEnvironment {
sendRequest: { .unimplemented },
verifyContact: { .unimplemented },
confirmRequest: { .unimplemented },
checkAuth: { .unimplemented }
checkAuth: { .unimplemented },
chat: { .unimplemented }
)
}
#endif
......@@ -204,7 +215,15 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
state.confirmRequest = nil
return .none
case .binding(_), .sendRequest(_), .verifyContact(_), .confirmRequest(_), .checkAuth(_):
case .chatTapped:
state.chat = ChatState(id: .contact(state.id))
return .none
case .chatDismissed:
state.chat = nil
return .none
case .binding(_), .sendRequest(_), .verifyContact(_), .confirmRequest(_), .checkAuth(_), .chat(_):
return .none
}
}
......@@ -237,3 +256,10 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
action: /ContactAction.checkAuth,
environment: { $0.checkAuth() }
)
.presenting(
chatReducer,
state: .keyPath(\.chat),
id: .keyPath(\.?.id),
action: /ContactAction.chat,
environment: { $0.chat() }
)
import AppCore
import ChatFeature
import CheckContactAuthFeature
import ComposableArchitecture
import ComposablePresentation
......@@ -148,6 +149,20 @@ public struct ContactView: View {
Text("Auth")
}
.animation(.default, value: viewStore.dbContact?.authStatus)
Section {
Button {
viewStore.send(.chatTapped)
} label: {
HStack {
Text("Chat")
Spacer()
Image(systemName: "chevron.forward")
}
}
} header: {
Text("Chat")
}
}
}
.navigationTitle("Contact")
......@@ -185,6 +200,14 @@ public struct ContactView: View {
onDeactivate: { viewStore.send(.checkAuthDismissed) },
destination: CheckContactAuthView.init(store:)
))
.background(NavigationLinkWithStore(
store.scope(
state: \.chat,
action: ContactAction.chat
),
onDeactivate: { viewStore.send(.chatDismissed) },
destination: ChatView.init(store:)
))
}
}
}
......
import ChatFeature
import CheckContactAuthFeature
import Combine
import ComposableArchitecture
......@@ -280,4 +281,34 @@ final class ContactFeatureTests: XCTestCase {
$0.confirmRequest = nil
}
}
func testChatTapped() {
let contactId = "contact-id".data(using: .utf8)!
let store = TestStore(
initialState: ContactState(
id: contactId
),
reducer: contactReducer,
environment: .unimplemented
)
store.send(.chatTapped) {
$0.chat = ChatState(id: .contact(contactId))
}
}
func testChatDismissed() {
let store = TestStore(
initialState: ContactState(
id: "contact-id".data(using: .utf8)!,
chat: ChatState(id: .contact("contact-id".data(using: .utf8)!))
),
reducer: contactReducer,
environment: .unimplemented
)
store.send(.chatDismissed) {
$0.chat = nil
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment