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

Present Lookup from Contact

parent cc1864ab
No related branches found
No related tags found
2 merge requests!112Restore contacts from backup,!102Release 1.0.0
This commit is part of merge request !102. Comments created here will be created in the context of that merge request.
...@@ -90,6 +90,7 @@ let package = Package( ...@@ -90,6 +90,7 @@ let package = Package(
.target(name: "CheckContactAuthFeature"), .target(name: "CheckContactAuthFeature"),
.target(name: "ConfirmRequestFeature"), .target(name: "ConfirmRequestFeature"),
.target(name: "ContactFeature"), .target(name: "ContactFeature"),
.target(name: "ContactLookupFeature"),
.target(name: "ContactsFeature"), .target(name: "ContactsFeature"),
.target(name: "HomeFeature"), .target(name: "HomeFeature"),
.target(name: "MyContactFeature"), .target(name: "MyContactFeature"),
...@@ -192,6 +193,7 @@ let package = Package( ...@@ -192,6 +193,7 @@ let package = Package(
.target(name: "ChatFeature"), .target(name: "ChatFeature"),
.target(name: "CheckContactAuthFeature"), .target(name: "CheckContactAuthFeature"),
.target(name: "ConfirmRequestFeature"), .target(name: "ConfirmRequestFeature"),
.target(name: "ContactLookupFeature"),
.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"),
......
...@@ -37,6 +37,9 @@ extension AppEnvironment { ...@@ -37,6 +37,9 @@ extension AppEnvironment {
db: dbManager.getDB, db: dbManager.getDB,
mainQueue: mainQueue, mainQueue: mainQueue,
bgQueue: bgQueue, bgQueue: bgQueue,
lookup: {
ContactLookupEnvironment()
},
sendRequest: { sendRequest: {
SendRequestEnvironment( SendRequestEnvironment(
messenger: messenger, messenger: messenger,
......
...@@ -4,6 +4,7 @@ import CheckContactAuthFeature ...@@ -4,6 +4,7 @@ import CheckContactAuthFeature
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation import ComposablePresentation
import ConfirmRequestFeature import ConfirmRequestFeature
import ContactLookupFeature
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 {
importUsername: Bool = true, importUsername: Bool = true,
importEmail: Bool = true, importEmail: Bool = true,
importPhone: Bool = true, importPhone: Bool = true,
lookup: ContactLookupState? = nil,
sendRequest: SendRequestState? = nil, sendRequest: SendRequestState? = nil,
verifyContact: VerifyContactState? = nil, verifyContact: VerifyContactState? = nil,
confirmRequest: ConfirmRequestState? = nil, confirmRequest: ConfirmRequestState? = nil,
...@@ -32,6 +34,7 @@ public struct ContactState: Equatable { ...@@ -32,6 +34,7 @@ public struct ContactState: Equatable {
self.importUsername = importUsername self.importUsername = importUsername
self.importEmail = importEmail self.importEmail = importEmail
self.importPhone = importPhone self.importPhone = importPhone
self.lookup = lookup
self.sendRequest = sendRequest self.sendRequest = sendRequest
self.verifyContact = verifyContact self.verifyContact = verifyContact
self.confirmRequest = confirmRequest self.confirmRequest = confirmRequest
...@@ -45,6 +48,7 @@ public struct ContactState: Equatable { ...@@ -45,6 +48,7 @@ public struct ContactState: Equatable {
@BindableState public var importUsername: Bool @BindableState public var importUsername: Bool
@BindableState public var importEmail: Bool @BindableState public var importEmail: Bool
@BindableState public var importPhone: Bool @BindableState public var importPhone: Bool
public var lookup: ContactLookupState?
public var sendRequest: SendRequestState? public var sendRequest: SendRequestState?
public var verifyContact: VerifyContactState? public var verifyContact: VerifyContactState?
public var confirmRequest: ConfirmRequestState? public var confirmRequest: ConfirmRequestState?
...@@ -56,6 +60,9 @@ public enum ContactAction: Equatable, BindableAction { ...@@ -56,6 +60,9 @@ public enum ContactAction: Equatable, BindableAction {
case start case start
case dbContactFetched(XXModels.Contact?) case dbContactFetched(XXModels.Contact?)
case importFactsTapped case importFactsTapped
case lookupTapped
case lookupDismissed
case lookup(ContactLookupAction)
case sendRequestTapped case sendRequestTapped
case sendRequestDismissed case sendRequestDismissed
case sendRequest(SendRequestAction) case sendRequest(SendRequestAction)
...@@ -80,6 +87,7 @@ public struct ContactEnvironment { ...@@ -80,6 +87,7 @@ public struct ContactEnvironment {
db: DBManagerGetDB, db: DBManagerGetDB,
mainQueue: AnySchedulerOf<DispatchQueue>, mainQueue: AnySchedulerOf<DispatchQueue>,
bgQueue: AnySchedulerOf<DispatchQueue>, bgQueue: AnySchedulerOf<DispatchQueue>,
lookup: @escaping () -> ContactLookupEnvironment,
sendRequest: @escaping () -> SendRequestEnvironment, sendRequest: @escaping () -> SendRequestEnvironment,
verifyContact: @escaping () -> VerifyContactEnvironment, verifyContact: @escaping () -> VerifyContactEnvironment,
confirmRequest: @escaping () -> ConfirmRequestEnvironment, confirmRequest: @escaping () -> ConfirmRequestEnvironment,
...@@ -90,6 +98,7 @@ public struct ContactEnvironment { ...@@ -90,6 +98,7 @@ public struct ContactEnvironment {
self.db = db self.db = db
self.mainQueue = mainQueue self.mainQueue = mainQueue
self.bgQueue = bgQueue self.bgQueue = bgQueue
self.lookup = lookup
self.sendRequest = sendRequest self.sendRequest = sendRequest
self.verifyContact = verifyContact self.verifyContact = verifyContact
self.confirmRequest = confirmRequest self.confirmRequest = confirmRequest
...@@ -101,6 +110,7 @@ public struct ContactEnvironment { ...@@ -101,6 +110,7 @@ public struct ContactEnvironment {
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 lookup: () -> ContactLookupEnvironment
public var sendRequest: () -> SendRequestEnvironment public var sendRequest: () -> SendRequestEnvironment
public var verifyContact: () -> VerifyContactEnvironment public var verifyContact: () -> VerifyContactEnvironment
public var confirmRequest: () -> ConfirmRequestEnvironment public var confirmRequest: () -> ConfirmRequestEnvironment
...@@ -115,6 +125,7 @@ extension ContactEnvironment { ...@@ -115,6 +125,7 @@ extension ContactEnvironment {
db: .unimplemented, db: .unimplemented,
mainQueue: .unimplemented, mainQueue: .unimplemented,
bgQueue: .unimplemented, bgQueue: .unimplemented,
lookup: { .unimplemented },
sendRequest: { .unimplemented }, sendRequest: { .unimplemented },
verifyContact: { .unimplemented }, verifyContact: { .unimplemented },
confirmRequest: { .unimplemented }, confirmRequest: { .unimplemented },
...@@ -163,6 +174,14 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm ...@@ -163,6 +174,14 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
.receive(on: env.mainQueue) .receive(on: env.mainQueue)
.eraseToEffect() .eraseToEffect()
case .lookupTapped:
state.lookup = ContactLookupState(id: state.id)
return .none
case .lookupDismissed:
state.lookup = nil
return .none
case .sendRequestTapped: case .sendRequestTapped:
if let xxContact = state.xxContact { if let xxContact = state.xxContact {
state.sendRequest = SendRequestState(contact: xxContact) state.sendRequest = SendRequestState(contact: xxContact)
...@@ -223,11 +242,20 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm ...@@ -223,11 +242,20 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm
state.chat = nil state.chat = nil
return .none return .none
case .binding(_), .sendRequest(_), .verifyContact(_), .confirmRequest(_), .checkAuth(_), .chat(_): case .binding(_), .lookup(_), .sendRequest(_),
.verifyContact(_), .confirmRequest(_),
.checkAuth(_), .chat(_):
return .none return .none
} }
} }
.binding() .binding()
.presenting(
contactLookupReducer,
state: .keyPath(\.lookup),
id: .notNil(),
action: /ContactAction.lookup,
environment: { $0.lookup() }
)
.presenting( .presenting(
sendRequestReducer, sendRequestReducer,
state: .keyPath(\.sendRequest), state: .keyPath(\.sendRequest),
......
...@@ -4,6 +4,7 @@ import CheckContactAuthFeature ...@@ -4,6 +4,7 @@ import CheckContactAuthFeature
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation import ComposablePresentation
import ConfirmRequestFeature import ConfirmRequestFeature
import ContactLookupFeature
import SendRequestFeature import SendRequestFeature
import SwiftUI import SwiftUI
import VerifyContactFeature import VerifyContactFeature
...@@ -26,6 +27,7 @@ public struct ContactView: View { ...@@ -26,6 +27,7 @@ public struct ContactView: View {
var importUsername: Bool var importUsername: Bool
var importEmail: Bool var importEmail: Bool
var importPhone: Bool var importPhone: Bool
var canLookup: Bool
var canSendRequest: Bool var canSendRequest: Bool
var canVerifyContact: Bool var canVerifyContact: Bool
var canConfirmRequest: Bool var canConfirmRequest: Bool
...@@ -40,6 +42,7 @@ public struct ContactView: View { ...@@ -40,6 +42,7 @@ public struct ContactView: View {
importUsername = state.importUsername importUsername = state.importUsername
importEmail = state.importEmail importEmail = state.importEmail
importPhone = state.importPhone importPhone = state.importPhone
canLookup = state.dbContact?.id != nil
canSendRequest = state.xxContact != nil || state.dbContact?.marshaled != nil canSendRequest = state.xxContact != nil || state.dbContact?.marshaled != nil
canVerifyContact = state.dbContact?.marshaled != nil canVerifyContact = state.dbContact?.marshaled != nil
canConfirmRequest = state.dbContact?.marshaled != nil canConfirmRequest = state.dbContact?.marshaled != nil
...@@ -121,6 +124,17 @@ public struct ContactView: View { ...@@ -121,6 +124,17 @@ public struct ContactView: View {
Section { Section {
ContactAuthStatusView(dbContact.authStatus) ContactAuthStatusView(dbContact.authStatus)
Button {
viewStore.send(.lookupTapped)
} label: {
HStack {
Text("Lookup")
Spacer()
Image(systemName: "chevron.forward")
}
}
.disabled(!viewStore.canLookup)
Button { Button {
viewStore.send(.sendRequestTapped) viewStore.send(.sendRequestTapped)
} label: { } label: {
...@@ -186,6 +200,15 @@ public struct ContactView: View { ...@@ -186,6 +200,15 @@ public struct ContactView: View {
} }
.navigationTitle("Contact") .navigationTitle("Contact")
.task { viewStore.send(.start) } .task { viewStore.send(.start) }
.background(NavigationLinkWithStore(
store.scope(
state: \.lookup,
action: ContactAction.lookup
),
mapState: replayNonNil(),
onDeactivate: { viewStore.send(.lookupDismissed) },
destination: ContactLookupView.init(store:)
))
.background(NavigationLinkWithStore( .background(NavigationLinkWithStore(
store.scope( store.scope(
state: \.sendRequest, state: \.sendRequest,
......
...@@ -3,6 +3,7 @@ import CheckContactAuthFeature ...@@ -3,6 +3,7 @@ import CheckContactAuthFeature
import Combine import Combine
import ComposableArchitecture import ComposableArchitecture
import ConfirmRequestFeature import ConfirmRequestFeature
import ContactLookupFeature
import CustomDump import CustomDump
import SendRequestFeature import SendRequestFeature
import VerifyContactFeature import VerifyContactFeature
...@@ -99,6 +100,37 @@ final class ContactFeatureTests: XCTestCase { ...@@ -99,6 +100,37 @@ final class ContactFeatureTests: XCTestCase {
XCTAssertNoDifference(dbDidSaveContact, [expectedSavedContact]) XCTAssertNoDifference(dbDidSaveContact, [expectedSavedContact])
} }
func testLookupTapped() {
let contactId = "contact-id".data(using: .utf8)!
let store = TestStore(
initialState: ContactState(
id: contactId
),
reducer: contactReducer,
environment: .unimplemented
)
store.send(.lookupTapped) {
$0.lookup = ContactLookupState(id: contactId)
}
}
func testLookupDismissed() {
let contactId = "contact-id".data(using: .utf8)!
let store = TestStore(
initialState: ContactState(
id: contactId,
lookup: ContactLookupState(id: contactId)
),
reducer: contactReducer,
environment: .unimplemented
)
store.send(.lookupDismissed) {
$0.lookup = nil
}
}
func testSendRequestWithDBContact() { func testSendRequestWithDBContact() {
var dbContact = XXModels.Contact(id: "contact-id".data(using: .utf8)!) var dbContact = XXModels.Contact(id: "contact-id".data(using: .utf8)!)
dbContact.marshaled = "contact-data".data(using: .utf8)! dbContact.marshaled = "contact-data".data(using: .utf8)!
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment