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

Present ConfirmRequest from Contact

parent c36c1d81
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!81Messenger example - contact authorization improvements
...@@ -77,6 +77,7 @@ let package = Package( ...@@ -77,6 +77,7 @@ let package = Package(
dependencies: [ dependencies: [
.target(name: "AppCore"), .target(name: "AppCore"),
.target(name: "CheckContactAuthFeature"), .target(name: "CheckContactAuthFeature"),
.target(name: "ConfirmRequestFeature"),
.target(name: "ContactFeature"), .target(name: "ContactFeature"),
.target(name: "ContactsFeature"), .target(name: "ContactsFeature"),
.target(name: "HomeFeature"), .target(name: "HomeFeature"),
...@@ -137,6 +138,7 @@ let package = Package( ...@@ -137,6 +138,7 @@ let package = Package(
dependencies: [ dependencies: [
.target(name: "AppCore"), .target(name: "AppCore"),
.target(name: "CheckContactAuthFeature"), .target(name: "CheckContactAuthFeature"),
.target(name: "ConfirmRequestFeature"),
.target(name: "SendRequestFeature"), .target(name: "SendRequestFeature"),
.target(name: "VerifyContactFeature"), .target(name: "VerifyContactFeature"),
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
......
import AppCore import AppCore
import CheckContactAuthFeature import CheckContactAuthFeature
import ConfirmRequestFeature
import ContactFeature import ContactFeature
import ContactsFeature import ContactsFeature
import Foundation import Foundation
...@@ -48,6 +49,14 @@ extension AppEnvironment { ...@@ -48,6 +49,14 @@ extension AppEnvironment {
bgQueue: bgQueue bgQueue: bgQueue
) )
}, },
confirmRequest: {
ConfirmRequestEnvironment(
messenger: messenger,
db: dbManager.getDB,
mainQueue: mainQueue,
bgQueue: bgQueue
)
},
checkAuth: { checkAuth: {
CheckContactAuthEnvironment( CheckContactAuthEnvironment(
messenger: messenger, messenger: messenger,
......
...@@ -2,6 +2,7 @@ import AppCore ...@@ -2,6 +2,7 @@ import AppCore
import CheckContactAuthFeature import CheckContactAuthFeature
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation import ComposablePresentation
import ConfirmRequestFeature
import Foundation import Foundation
import SendRequestFeature import SendRequestFeature
import VerifyContactFeature import VerifyContactFeature
...@@ -20,6 +21,7 @@ public struct ContactState: Equatable { ...@@ -20,6 +21,7 @@ public struct ContactState: Equatable {
importPhone: Bool = true, importPhone: Bool = true,
sendRequest: SendRequestState? = nil, sendRequest: SendRequestState? = nil,
verifyContact: VerifyContactState? = nil, verifyContact: VerifyContactState? = nil,
confirmRequest: ConfirmRequestState? = nil,
checkAuth: CheckContactAuthState? = nil checkAuth: CheckContactAuthState? = nil
) { ) {
self.id = id self.id = id
...@@ -30,6 +32,7 @@ public struct ContactState: Equatable { ...@@ -30,6 +32,7 @@ public struct ContactState: Equatable {
self.importPhone = importPhone self.importPhone = importPhone
self.sendRequest = sendRequest self.sendRequest = sendRequest
self.verifyContact = verifyContact self.verifyContact = verifyContact
self.confirmRequest = confirmRequest
self.checkAuth = checkAuth self.checkAuth = checkAuth
} }
...@@ -41,6 +44,7 @@ public struct ContactState: Equatable { ...@@ -41,6 +44,7 @@ public struct ContactState: Equatable {
@BindableState public var importPhone: Bool @BindableState public var importPhone: Bool
public var sendRequest: SendRequestState? public var sendRequest: SendRequestState?
public var verifyContact: VerifyContactState? public var verifyContact: VerifyContactState?
public var confirmRequest: ConfirmRequestState?
public var checkAuth: CheckContactAuthState? public var checkAuth: CheckContactAuthState?
} }
...@@ -57,6 +61,9 @@ public enum ContactAction: Equatable, BindableAction { ...@@ -57,6 +61,9 @@ public enum ContactAction: Equatable, BindableAction {
case checkAuthTapped case checkAuthTapped
case checkAuthDismissed case checkAuthDismissed
case checkAuth(CheckContactAuthAction) case checkAuth(CheckContactAuthAction)
case confirmRequestTapped
case confirmRequestDismissed
case confirmRequest(ConfirmRequestAction)
case binding(BindingAction<ContactState>) case binding(BindingAction<ContactState>)
} }
...@@ -68,6 +75,7 @@ public struct ContactEnvironment { ...@@ -68,6 +75,7 @@ public struct ContactEnvironment {
bgQueue: AnySchedulerOf<DispatchQueue>, bgQueue: AnySchedulerOf<DispatchQueue>,
sendRequest: @escaping () -> SendRequestEnvironment, sendRequest: @escaping () -> SendRequestEnvironment,
verifyContact: @escaping () -> VerifyContactEnvironment, verifyContact: @escaping () -> VerifyContactEnvironment,
confirmRequest: @escaping () -> ConfirmRequestEnvironment,
checkAuth: @escaping () -> CheckContactAuthEnvironment checkAuth: @escaping () -> CheckContactAuthEnvironment
) { ) {
self.messenger = messenger self.messenger = messenger
...@@ -76,6 +84,7 @@ public struct ContactEnvironment { ...@@ -76,6 +84,7 @@ public struct ContactEnvironment {
self.bgQueue = bgQueue self.bgQueue = bgQueue
self.sendRequest = sendRequest self.sendRequest = sendRequest
self.verifyContact = verifyContact self.verifyContact = verifyContact
self.confirmRequest = confirmRequest
self.checkAuth = checkAuth self.checkAuth = checkAuth
} }
...@@ -85,6 +94,7 @@ public struct ContactEnvironment { ...@@ -85,6 +94,7 @@ public struct ContactEnvironment {
public var bgQueue: AnySchedulerOf<DispatchQueue> public var bgQueue: AnySchedulerOf<DispatchQueue>
public var sendRequest: () -> SendRequestEnvironment public var sendRequest: () -> SendRequestEnvironment
public var verifyContact: () -> VerifyContactEnvironment public var verifyContact: () -> VerifyContactEnvironment
public var confirmRequest: () -> ConfirmRequestEnvironment
public var checkAuth: () -> CheckContactAuthEnvironment public var checkAuth: () -> CheckContactAuthEnvironment
} }
...@@ -97,6 +107,7 @@ extension ContactEnvironment { ...@@ -97,6 +107,7 @@ extension ContactEnvironment {
bgQueue: .unimplemented, bgQueue: .unimplemented,
sendRequest: { .unimplemented }, sendRequest: { .unimplemented },
verifyContact: { .unimplemented }, verifyContact: { .unimplemented },
confirmRequest: { .unimplemented },
checkAuth: { .unimplemented } checkAuth: { .unimplemented }
) )
} }
...@@ -181,7 +192,19 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm ...@@ -181,7 +192,19 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
state.checkAuth = nil state.checkAuth = nil
return .none return .none
case .binding(_), .sendRequest(_), .verifyContact(_), .checkAuth(_): case .confirmRequestTapped:
if let marshaled = state.dbContact?.marshaled {
state.confirmRequest = ConfirmRequestState(
contact: .live(marshaled)
)
}
return .none
case .confirmRequestDismissed:
state.confirmRequest = nil
return .none
case .binding(_), .sendRequest(_), .verifyContact(_), .confirmRequest(_), .checkAuth(_):
return .none return .none
} }
} }
...@@ -200,6 +223,13 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm ...@@ -200,6 +223,13 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
action: /ContactAction.verifyContact, action: /ContactAction.verifyContact,
environment: { $0.verifyContact() } environment: { $0.verifyContact() }
) )
.presenting(
confirmRequestReducer,
state: .keyPath(\.confirmRequest),
id: .notNil(),
action: /ContactAction.confirmRequest,
environment: { $0.confirmRequest() }
)
.presenting( .presenting(
checkContactAuthReducer, checkContactAuthReducer,
state: .keyPath(\.checkAuth), state: .keyPath(\.checkAuth),
......
...@@ -2,6 +2,7 @@ import AppCore ...@@ -2,6 +2,7 @@ import AppCore
import CheckContactAuthFeature import CheckContactAuthFeature
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation import ComposablePresentation
import ConfirmRequestFeature
import SendRequestFeature import SendRequestFeature
import SwiftUI import SwiftUI
import VerifyContactFeature import VerifyContactFeature
...@@ -125,6 +126,15 @@ public struct ContactView: View { ...@@ -125,6 +126,15 @@ public struct ContactView: View {
Image(systemName: "chevron.forward") Image(systemName: "chevron.forward")
} }
} }
Button {
viewStore.send(.confirmRequestTapped)
} label: {
HStack {
Text("Confirm request")
Spacer()
Image(systemName: "chevron.forward")
}
}
Button { Button {
viewStore.send(.checkAuthTapped) viewStore.send(.checkAuthTapped)
} label: { } label: {
...@@ -159,6 +169,14 @@ public struct ContactView: View { ...@@ -159,6 +169,14 @@ public struct ContactView: View {
onDeactivate: { viewStore.send(.verifyContactDismissed) }, onDeactivate: { viewStore.send(.verifyContactDismissed) },
destination: VerifyContactView.init(store:) destination: VerifyContactView.init(store:)
)) ))
.background(NavigationLinkWithStore(
store.scope(
state: \.confirmRequest,
action: ContactAction.confirmRequest
),
onDeactivate: { viewStore.send(.confirmRequestDismissed) },
destination: ConfirmRequestView.init(store:)
))
.background(NavigationLinkWithStore( .background(NavigationLinkWithStore(
store.scope( store.scope(
state: \.checkAuth, state: \.checkAuth,
......
import CheckContactAuthFeature import CheckContactAuthFeature
import Combine import Combine
import ComposableArchitecture import ComposableArchitecture
import ConfirmRequestFeature
import CustomDump import CustomDump
import SendRequestFeature import SendRequestFeature
import VerifyContactFeature import VerifyContactFeature
...@@ -241,4 +242,42 @@ final class ContactFeatureTests: XCTestCase { ...@@ -241,4 +242,42 @@ final class ContactFeatureTests: XCTestCase {
$0.checkAuth = nil $0.checkAuth = nil
} }
} }
func testConfirmRequestTapped() {
let contactData = "contact-data".data(using: .utf8)!
let store = TestStore(
initialState: ContactState(
id: Data(),
dbContact: XXModels.Contact(
id: Data(),
marshaled: contactData
)
),
reducer: contactReducer,
environment: .unimplemented
)
store.send(.confirmRequestTapped) {
$0.confirmRequest = ConfirmRequestState(
contact: .unimplemented(contactData)
)
}
}
func testConfirmRequestDismissed() {
let store = TestStore(
initialState: ContactState(
id: "contact-id".data(using: .utf8)!,
confirmRequest: ConfirmRequestState(
contact: .unimplemented("contact-data".data(using: .utf8)!)
)
),
reducer: contactReducer,
environment: .unimplemented
)
store.send(.confirmRequestDismissed) {
$0.confirmRequest = 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