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

Present ResetAuth from Conact

parent c3a79cd2
No related branches found
No related tags found
2 merge requests!115Messenger example - reset authenticated channel,!102Release 1.0.0
...@@ -96,6 +96,7 @@ let package = Package( ...@@ -96,6 +96,7 @@ let package = Package(
.target(name: "HomeFeature"), .target(name: "HomeFeature"),
.target(name: "MyContactFeature"), .target(name: "MyContactFeature"),
.target(name: "RegisterFeature"), .target(name: "RegisterFeature"),
.target(name: "ResetAuthFeature"),
.target(name: "RestoreFeature"), .target(name: "RestoreFeature"),
.target(name: "SendRequestFeature"), .target(name: "SendRequestFeature"),
.target(name: "UserSearchFeature"), .target(name: "UserSearchFeature"),
...@@ -193,6 +194,7 @@ let package = Package( ...@@ -193,6 +194,7 @@ let package = Package(
.target(name: "CheckContactAuthFeature"), .target(name: "CheckContactAuthFeature"),
.target(name: "ConfirmRequestFeature"), .target(name: "ConfirmRequestFeature"),
.target(name: "ContactLookupFeature"), .target(name: "ContactLookupFeature"),
.target(name: "ResetAuthFeature"),
.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"),
......
...@@ -10,6 +10,7 @@ import Foundation ...@@ -10,6 +10,7 @@ import Foundation
import HomeFeature import HomeFeature
import MyContactFeature import MyContactFeature
import RegisterFeature import RegisterFeature
import ResetAuthFeature
import RestoreFeature import RestoreFeature
import SendRequestFeature import SendRequestFeature
import UserSearchFeature import UserSearchFeature
...@@ -77,6 +78,9 @@ extension AppEnvironment { ...@@ -77,6 +78,9 @@ extension AppEnvironment {
bgQueue: bgQueue bgQueue: bgQueue
) )
}, },
resetAuth: {
ResetAuthEnvironment()
},
chat: { chat: {
ChatEnvironment( ChatEnvironment(
messenger: messenger, messenger: messenger,
......
...@@ -6,6 +6,7 @@ import ComposablePresentation ...@@ -6,6 +6,7 @@ import ComposablePresentation
import ConfirmRequestFeature import ConfirmRequestFeature
import ContactLookupFeature import ContactLookupFeature
import Foundation import Foundation
import ResetAuthFeature
import SendRequestFeature import SendRequestFeature
import VerifyContactFeature import VerifyContactFeature
import XCTestDynamicOverlay import XCTestDynamicOverlay
...@@ -26,6 +27,7 @@ public struct ContactState: Equatable { ...@@ -26,6 +27,7 @@ public struct ContactState: Equatable {
verifyContact: VerifyContactState? = nil, verifyContact: VerifyContactState? = nil,
confirmRequest: ConfirmRequestState? = nil, confirmRequest: ConfirmRequestState? = nil,
checkAuth: CheckContactAuthState? = nil, checkAuth: CheckContactAuthState? = nil,
resetAuth: ResetAuthState? = nil,
chat: ChatState? = nil chat: ChatState? = nil
) { ) {
self.id = id self.id = id
...@@ -39,6 +41,7 @@ public struct ContactState: Equatable { ...@@ -39,6 +41,7 @@ public struct ContactState: Equatable {
self.verifyContact = verifyContact self.verifyContact = verifyContact
self.confirmRequest = confirmRequest self.confirmRequest = confirmRequest
self.checkAuth = checkAuth self.checkAuth = checkAuth
self.resetAuth = resetAuth
self.chat = chat self.chat = chat
} }
...@@ -53,6 +56,7 @@ public struct ContactState: Equatable { ...@@ -53,6 +56,7 @@ public struct ContactState: Equatable {
public var verifyContact: VerifyContactState? public var verifyContact: VerifyContactState?
public var confirmRequest: ConfirmRequestState? public var confirmRequest: ConfirmRequestState?
public var checkAuth: CheckContactAuthState? public var checkAuth: CheckContactAuthState?
public var resetAuth: ResetAuthState?
public var chat: ChatState? public var chat: ChatState?
} }
...@@ -75,6 +79,9 @@ public enum ContactAction: Equatable, BindableAction { ...@@ -75,6 +79,9 @@ public enum ContactAction: Equatable, BindableAction {
case confirmRequestTapped case confirmRequestTapped
case confirmRequestDismissed case confirmRequestDismissed
case confirmRequest(ConfirmRequestAction) case confirmRequest(ConfirmRequestAction)
case resetAuthTapped
case resetAuthDismissed
case resetAuth(ResetAuthAction)
case chatTapped case chatTapped
case chatDismissed case chatDismissed
case chat(ChatAction) case chat(ChatAction)
...@@ -92,6 +99,7 @@ public struct ContactEnvironment { ...@@ -92,6 +99,7 @@ public struct ContactEnvironment {
verifyContact: @escaping () -> VerifyContactEnvironment, verifyContact: @escaping () -> VerifyContactEnvironment,
confirmRequest: @escaping () -> ConfirmRequestEnvironment, confirmRequest: @escaping () -> ConfirmRequestEnvironment,
checkAuth: @escaping () -> CheckContactAuthEnvironment, checkAuth: @escaping () -> CheckContactAuthEnvironment,
resetAuth: @escaping () -> ResetAuthEnvironment,
chat: @escaping () -> ChatEnvironment chat: @escaping () -> ChatEnvironment
) { ) {
self.messenger = messenger self.messenger = messenger
...@@ -103,6 +111,7 @@ public struct ContactEnvironment { ...@@ -103,6 +111,7 @@ public struct ContactEnvironment {
self.verifyContact = verifyContact self.verifyContact = verifyContact
self.confirmRequest = confirmRequest self.confirmRequest = confirmRequest
self.checkAuth = checkAuth self.checkAuth = checkAuth
self.resetAuth = resetAuth
self.chat = chat self.chat = chat
} }
...@@ -115,6 +124,7 @@ public struct ContactEnvironment { ...@@ -115,6 +124,7 @@ public struct ContactEnvironment {
public var verifyContact: () -> VerifyContactEnvironment public var verifyContact: () -> VerifyContactEnvironment
public var confirmRequest: () -> ConfirmRequestEnvironment public var confirmRequest: () -> ConfirmRequestEnvironment
public var checkAuth: () -> CheckContactAuthEnvironment public var checkAuth: () -> CheckContactAuthEnvironment
public var resetAuth: () -> ResetAuthEnvironment
public var chat: () -> ChatEnvironment public var chat: () -> ChatEnvironment
} }
...@@ -130,6 +140,7 @@ extension ContactEnvironment { ...@@ -130,6 +140,7 @@ extension ContactEnvironment {
verifyContact: { .unimplemented }, verifyContact: { .unimplemented },
confirmRequest: { .unimplemented }, confirmRequest: { .unimplemented },
checkAuth: { .unimplemented }, checkAuth: { .unimplemented },
resetAuth: { .unimplemented },
chat: { .unimplemented } chat: { .unimplemented }
) )
} }
...@@ -247,9 +258,21 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm ...@@ -247,9 +258,21 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
state.chat = nil state.chat = nil
return .none return .none
case .resetAuthTapped:
if let marshaled = state.dbContact?.marshaled {
state.resetAuth = ResetAuthState(
partner: .live(marshaled)
)
}
return .none
case .resetAuthDismissed:
state.resetAuth = nil
return .none
case .binding(_), .lookup(_), .sendRequest(_), case .binding(_), .lookup(_), .sendRequest(_),
.verifyContact(_), .confirmRequest(_), .verifyContact(_), .confirmRequest(_),
.checkAuth(_), .chat(_): .checkAuth(_), .resetAuth(_), .chat(_):
return .none return .none
} }
} }
...@@ -289,6 +312,13 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm ...@@ -289,6 +312,13 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
action: /ContactAction.checkAuth, action: /ContactAction.checkAuth,
environment: { $0.checkAuth() } environment: { $0.checkAuth() }
) )
.presenting(
resetAuthReducer,
state: .keyPath(\.resetAuth),
id: .notNil(),
action: /ContactAction.resetAuth,
environment: { $0.resetAuth() }
)
.presenting( .presenting(
chatReducer, chatReducer,
state: .keyPath(\.chat), state: .keyPath(\.chat),
......
...@@ -5,6 +5,7 @@ import ComposableArchitecture ...@@ -5,6 +5,7 @@ import ComposableArchitecture
import ComposablePresentation import ComposablePresentation
import ConfirmRequestFeature import ConfirmRequestFeature
import ContactLookupFeature import ContactLookupFeature
import ResetAuthFeature
import SendRequestFeature import SendRequestFeature
import SwiftUI import SwiftUI
import VerifyContactFeature import VerifyContactFeature
...@@ -32,6 +33,7 @@ public struct ContactView: View { ...@@ -32,6 +33,7 @@ public struct ContactView: View {
var canVerifyContact: Bool var canVerifyContact: Bool
var canConfirmRequest: Bool var canConfirmRequest: Bool
var canCheckAuthorization: Bool var canCheckAuthorization: Bool
var canResetAuthorization: Bool
init(state: ContactState) { init(state: ContactState) {
dbContact = state.dbContact dbContact = state.dbContact
...@@ -47,6 +49,7 @@ public struct ContactView: View { ...@@ -47,6 +49,7 @@ public struct ContactView: View {
canVerifyContact = state.dbContact?.marshaled != nil canVerifyContact = state.dbContact?.marshaled != nil
canConfirmRequest = state.dbContact?.marshaled != nil canConfirmRequest = state.dbContact?.marshaled != nil
canCheckAuthorization = state.dbContact?.marshaled != nil canCheckAuthorization = state.dbContact?.marshaled != nil
canResetAuthorization = state.dbContact?.marshaled != nil
} }
} }
...@@ -178,6 +181,17 @@ public struct ContactView: View { ...@@ -178,6 +181,17 @@ public struct ContactView: View {
} }
} }
.disabled(!viewStore.canCheckAuthorization) .disabled(!viewStore.canCheckAuthorization)
Button {
viewStore.send(.resetAuthTapped)
} label: {
HStack {
Text("Reset authorization")
Spacer()
Image(systemName: "chevron.forward")
}
}
.disabled(!viewStore.canResetAuthorization)
} header: { } header: {
Text("Auth") Text("Auth")
} }
...@@ -242,6 +256,14 @@ public struct ContactView: View { ...@@ -242,6 +256,14 @@ public struct ContactView: View {
onDeactivate: { viewStore.send(.checkAuthDismissed) }, onDeactivate: { viewStore.send(.checkAuthDismissed) },
destination: CheckContactAuthView.init(store:) destination: CheckContactAuthView.init(store:)
)) ))
.background(NavigationLinkWithStore(
store.scope(
state: \.resetAuth,
action: ContactAction.resetAuth
),
onDeactivate: { viewStore.send(.resetAuthDismissed) },
destination: ResetAuthView.init(store:)
))
.background(NavigationLinkWithStore( .background(NavigationLinkWithStore(
store.scope( store.scope(
state: \.chat, state: \.chat,
......
...@@ -5,6 +5,7 @@ import ComposableArchitecture ...@@ -5,6 +5,7 @@ import ComposableArchitecture
import ConfirmRequestFeature import ConfirmRequestFeature
import ContactLookupFeature import ContactLookupFeature
import CustomDump import CustomDump
import ResetAuthFeature
import SendRequestFeature import SendRequestFeature
import VerifyContactFeature import VerifyContactFeature
import XCTest import XCTest
...@@ -294,6 +295,44 @@ final class ContactFeatureTests: XCTestCase { ...@@ -294,6 +295,44 @@ final class ContactFeatureTests: XCTestCase {
} }
} }
func testResetAuthTapped() {
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(.resetAuthTapped) {
$0.resetAuth = ResetAuthState(
partner: .unimplemented(contactData)
)
}
}
func testResetAuthDismissed() {
let store = TestStore(
initialState: ContactState(
id: Data(),
resetAuth: ResetAuthState(
partner: .unimplemented(Data())
)
),
reducer: contactReducer,
environment: .unimplemented
)
store.send(.resetAuthDismissed) {
$0.resetAuth = nil
}
}
func testConfirmRequestTapped() { func testConfirmRequestTapped() {
let contactData = "contact-data".data(using: .utf8)! let contactData = "contact-data".data(using: .utf8)!
let store = TestStore( let store = TestStore(
......
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