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

Add Send Request screen

parent a05510e2
Branches
Tags
2 merge requests!102Release 1.0.0,!68Messenger example - send auth request
......@@ -95,6 +95,7 @@ let package = Package(
dependencies: [
.target(name: "AppCore"),
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "ComposablePresentation", package: "swift-composable-presentation"),
.product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"),
.product(name: "XXModels", package: "client-ios-db"),
],
......
......@@ -60,7 +60,10 @@ extension AppEnvironment {
messenger: messenger,
db: dbManager.getDB,
mainQueue: mainQueue,
bgQueue: bgQueue
bgQueue: bgQueue,
sendRequest: {
ContactSendRequestEnvironment()
}
)
}
)
......
import AppCore
import ComposableArchitecture
import ComposablePresentation
import Foundation
import XCTestDynamicOverlay
import XXClient
......@@ -10,16 +11,19 @@ public struct ContactState: Equatable {
public init(
id: Data,
dbContact: XXModels.Contact? = nil,
xxContact: XXClient.Contact? = nil
xxContact: XXClient.Contact? = nil,
sendRequest: ContactSendRequestState? = nil
) {
self.id = id
self.dbContact = dbContact
self.xxContact = xxContact
self.sendRequest = sendRequest
}
public var id: Data
public var dbContact: XXModels.Contact?
public var xxContact: XXClient.Contact?
public var sendRequest: ContactSendRequestState?
}
public enum ContactAction: Equatable {
......@@ -27,6 +31,8 @@ public enum ContactAction: Equatable {
case dbContactFetched(XXModels.Contact?)
case saveFactsTapped
case sendRequestTapped
case sendRequestDismissed
case sendRequest(ContactSendRequestAction)
}
public struct ContactEnvironment {
......@@ -34,18 +40,21 @@ public struct ContactEnvironment {
messenger: Messenger,
db: DBManagerGetDB,
mainQueue: AnySchedulerOf<DispatchQueue>,
bgQueue: AnySchedulerOf<DispatchQueue>
bgQueue: AnySchedulerOf<DispatchQueue>,
sendRequest: @escaping () -> ContactSendRequestEnvironment
) {
self.messenger = messenger
self.db = db
self.mainQueue = mainQueue
self.bgQueue = bgQueue
self.sendRequest = sendRequest
}
public var messenger: Messenger
public var db: DBManagerGetDB
public var mainQueue: AnySchedulerOf<DispatchQueue>
public var bgQueue: AnySchedulerOf<DispatchQueue>
public var sendRequest: () -> ContactSendRequestEnvironment
}
#if DEBUG
......@@ -54,7 +63,8 @@ extension ContactEnvironment {
messenger: .unimplemented,
db: .unimplemented,
mainQueue: .unimplemented,
bgQueue: .unimplemented
bgQueue: .unimplemented,
sendRequest: { .unimplemented }
)
}
#endif
......@@ -93,6 +103,21 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
.eraseToEffect()
case .sendRequestTapped:
state.sendRequest = ContactSendRequestState()
return .none
case .sendRequestDismissed:
state.sendRequest = nil
return .none
case .sendRequest(_):
return .none
}
}
.presenting(
contactSendRequestReducer,
state: .keyPath(\.sendRequest),
id: .notNil(),
action: /ContactAction.sendRequest,
environment: { $0.sendRequest() }
)
import ComposableArchitecture
import XCTestDynamicOverlay
public struct ContactSendRequestState: Equatable {
public init() {}
}
public enum ContactSendRequestAction: Equatable {
case start
}
public struct ContactSendRequestEnvironment {
public init() {}
}
#if DEBUG
extension ContactSendRequestEnvironment {
public static let unimplemented = ContactSendRequestEnvironment()
}
#endif
public let contactSendRequestReducer = Reducer<ContactSendRequestState, ContactSendRequestAction, ContactSendRequestEnvironment>
{ state, action, env in
switch action {
case .start:
return .none
}
}
import ComposableArchitecture
import SwiftUI
public struct ContactSendRequestView: View {
public init(store: Store<ContactSendRequestState, ContactSendRequestAction>) {
self.store = store
}
let store: Store<ContactSendRequestState, ContactSendRequestAction>
struct ViewState: Equatable {
init(state: ContactSendRequestState) {}
}
public var body: some View {
WithViewStore(store.scope(state: ViewState.init)) { viewStore in
Form {
}
.navigationTitle("Send Request")
.task { viewStore.send(.start) }
}
}
}
#if DEBUG
public struct ContactSendRequestView_Previews: PreviewProvider {
public static var previews: some View {
ContactSendRequestView(store: Store(
initialState: ContactSendRequestState(),
reducer: .empty,
environment: ()
))
}
}
#endif
import AppCore
import ComposableArchitecture
import ComposablePresentation
import SwiftUI
import XXClient
import XXModels
......@@ -160,6 +161,14 @@ public struct ContactView: View {
}
.navigationTitle("Contact")
.task { viewStore.send(.start) }
.background(NavigationLinkWithStore(
store.scope(
state: \.sendRequest,
action: ContactAction.sendRequest
),
onDeactivate: { viewStore.send(.sendRequestDismissed) },
destination: ContactSendRequestView.init(store:)
))
}
}
}
......
......@@ -103,6 +103,12 @@ final class ContactFeatureTests: XCTestCase {
environment: .unimplemented
)
store.send(.sendRequestTapped)
store.send(.sendRequestTapped) {
$0.sendRequest = ContactSendRequestState()
}
store.send(.sendRequestDismissed) {
$0.sendRequest = nil
}
}
}
import ComposableArchitecture
import XCTest
@testable import ContactFeature
final class ContactSendRequestFeatureTests: XCTestCase {
func testStart() {
let store = TestStore(
initialState: ContactSendRequestState(),
reducer: contactSendRequestReducer,
environment: .unimplemented
)
store.send(.start)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment