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( ...@@ -95,6 +95,7 @@ let package = Package(
dependencies: [ dependencies: [
.target(name: "AppCore"), .target(name: "AppCore"),
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "ComposablePresentation", package: "swift-composable-presentation"),
.product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"),
.product(name: "XXModels", package: "client-ios-db"), .product(name: "XXModels", package: "client-ios-db"),
], ],
......
...@@ -60,7 +60,10 @@ extension AppEnvironment { ...@@ -60,7 +60,10 @@ extension AppEnvironment {
messenger: messenger, messenger: messenger,
db: dbManager.getDB, db: dbManager.getDB,
mainQueue: mainQueue, mainQueue: mainQueue,
bgQueue: bgQueue bgQueue: bgQueue,
sendRequest: {
ContactSendRequestEnvironment()
}
) )
} }
) )
......
import AppCore import AppCore
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation
import Foundation import Foundation
import XCTestDynamicOverlay import XCTestDynamicOverlay
import XXClient import XXClient
...@@ -10,16 +11,19 @@ public struct ContactState: Equatable { ...@@ -10,16 +11,19 @@ public struct ContactState: Equatable {
public init( public init(
id: Data, id: Data,
dbContact: XXModels.Contact? = nil, dbContact: XXModels.Contact? = nil,
xxContact: XXClient.Contact? = nil xxContact: XXClient.Contact? = nil,
sendRequest: ContactSendRequestState? = nil
) { ) {
self.id = id self.id = id
self.dbContact = dbContact self.dbContact = dbContact
self.xxContact = xxContact self.xxContact = xxContact
self.sendRequest = sendRequest
} }
public var id: Data public var id: Data
public var dbContact: XXModels.Contact? public var dbContact: XXModels.Contact?
public var xxContact: XXClient.Contact? public var xxContact: XXClient.Contact?
public var sendRequest: ContactSendRequestState?
} }
public enum ContactAction: Equatable { public enum ContactAction: Equatable {
...@@ -27,6 +31,8 @@ public enum ContactAction: Equatable { ...@@ -27,6 +31,8 @@ public enum ContactAction: Equatable {
case dbContactFetched(XXModels.Contact?) case dbContactFetched(XXModels.Contact?)
case saveFactsTapped case saveFactsTapped
case sendRequestTapped case sendRequestTapped
case sendRequestDismissed
case sendRequest(ContactSendRequestAction)
} }
public struct ContactEnvironment { public struct ContactEnvironment {
...@@ -34,18 +40,21 @@ public struct ContactEnvironment { ...@@ -34,18 +40,21 @@ public struct ContactEnvironment {
messenger: Messenger, messenger: Messenger,
db: DBManagerGetDB, db: DBManagerGetDB,
mainQueue: AnySchedulerOf<DispatchQueue>, mainQueue: AnySchedulerOf<DispatchQueue>,
bgQueue: AnySchedulerOf<DispatchQueue> bgQueue: AnySchedulerOf<DispatchQueue>,
sendRequest: @escaping () -> ContactSendRequestEnvironment
) { ) {
self.messenger = messenger self.messenger = messenger
self.db = db self.db = db
self.mainQueue = mainQueue self.mainQueue = mainQueue
self.bgQueue = bgQueue self.bgQueue = bgQueue
self.sendRequest = sendRequest
} }
public var messenger: Messenger public var messenger: Messenger
public var db: DBManagerGetDB public var db: DBManagerGetDB
public var mainQueue: AnySchedulerOf<DispatchQueue> public var mainQueue: AnySchedulerOf<DispatchQueue>
public var bgQueue: AnySchedulerOf<DispatchQueue> public var bgQueue: AnySchedulerOf<DispatchQueue>
public var sendRequest: () -> ContactSendRequestEnvironment
} }
#if DEBUG #if DEBUG
...@@ -54,7 +63,8 @@ extension ContactEnvironment { ...@@ -54,7 +63,8 @@ extension ContactEnvironment {
messenger: .unimplemented, messenger: .unimplemented,
db: .unimplemented, db: .unimplemented,
mainQueue: .unimplemented, mainQueue: .unimplemented,
bgQueue: .unimplemented bgQueue: .unimplemented,
sendRequest: { .unimplemented }
) )
} }
#endif #endif
...@@ -93,6 +103,21 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm ...@@ -93,6 +103,21 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
.eraseToEffect() .eraseToEffect()
case .sendRequestTapped: case .sendRequestTapped:
state.sendRequest = ContactSendRequestState()
return .none
case .sendRequestDismissed:
state.sendRequest = nil
return .none
case .sendRequest(_):
return .none 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 AppCore
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation
import SwiftUI import SwiftUI
import XXClient import XXClient
import XXModels import XXModels
...@@ -160,6 +161,14 @@ public struct ContactView: View { ...@@ -160,6 +161,14 @@ public struct ContactView: View {
} }
.navigationTitle("Contact") .navigationTitle("Contact")
.task { viewStore.send(.start) } .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 { ...@@ -103,6 +103,12 @@ final class ContactFeatureTests: XCTestCase {
environment: .unimplemented 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