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

Add Send Request screen

parent a05510e2
No related branches found
No related tags found
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.
Finish editing this message first!
Please register or to comment