diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift index 5ce26cb99ecae9bcc0a4f8d080c3d73370e12553..1254c0e0f58a0028cce730198987a8e2d835039d 100644 --- a/Examples/xx-messenger/Package.swift +++ b/Examples/xx-messenger/Package.swift @@ -158,7 +158,6 @@ let package = Package( .target( name: "UserSearchFeature", dependencies: [ - .target(name: "AppCore"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), .product(name: "ComposablePresentation", package: "swift-composable-presentation"), .product(name: "XXClient", package: "elixxir-dapps-sdk-swift"), diff --git a/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchResultFeature.swift b/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchResultFeature.swift index f13c4b10a010c2a46d3c2c4ad71a9ebcba9b6bc7..ece68742bced9b709e988607948b99fad9de28f8 100644 --- a/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchResultFeature.swift +++ b/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchResultFeature.swift @@ -1,22 +1,18 @@ -import AppCore import ComposableArchitecture import Foundation import XCTestDynamicOverlay import XXClient -import XXModels public struct UserSearchResultState: Equatable, Identifiable { public init( id: Data, xxContact: XXClient.Contact, - dbContact: XXModels.Contact? = nil, username: String? = nil, email: String? = nil, phone: String? = nil ) { self.id = id self.xxContact = xxContact - self.dbContact = dbContact self.username = username self.email = email self.phone = phone @@ -24,7 +20,6 @@ public struct UserSearchResultState: Equatable, Identifiable { public var id: Data public var xxContact: XXClient.Contact - public var dbContact: XXModels.Contact? public var username: String? public var email: String? public var phone: String? @@ -32,60 +27,30 @@ public struct UserSearchResultState: Equatable, Identifiable { public enum UserSearchResultAction: Equatable { case start - case didUpdateContact(XXModels.Contact?) - case sendRequestButtonTapped + case tapped } public struct UserSearchResultEnvironment { - public init( - db: DBManagerGetDB, - mainQueue: AnySchedulerOf<DispatchQueue>, - bgQueue: AnySchedulerOf<DispatchQueue> - ) { - self.db = db - self.mainQueue = mainQueue - self.bgQueue = bgQueue - } - - public var db: DBManagerGetDB - public var mainQueue: AnySchedulerOf<DispatchQueue> - public var bgQueue: AnySchedulerOf<DispatchQueue> + public init() {} } #if DEBUG extension UserSearchResultEnvironment { - public static let unimplemented = UserSearchResultEnvironment( - db: .unimplemented, - mainQueue: .unimplemented, - bgQueue: .unimplemented - ) + public static let unimplemented = UserSearchResultEnvironment() } #endif public let userSearchResultReducer = Reducer<UserSearchResultState, UserSearchResultAction, UserSearchResultEnvironment> { state, action, env in - enum DBFetchEffectID {} - switch action { case .start: let facts = (try? state.xxContact.getFacts()) ?? [] state.username = facts.first(where: { $0.type == 0 })?.fact state.email = facts.first(where: { $0.type == 1 })?.fact state.phone = facts.first(where: { $0.type == 2 })?.fact - return try! env.db().fetchContactsPublisher(.init(id: [state.id])) - .assertNoFailure() - .map(\.first) - .map(UserSearchResultAction.didUpdateContact) - .subscribe(on: env.bgQueue) - .receive(on: env.mainQueue) - .eraseToEffect() - .cancellable(id: DBFetchEffectID.self, cancelInFlight: true) - - case .didUpdateContact(let contact): - state.dbContact = contact return .none - case .sendRequestButtonTapped: + case .tapped: return .none } } diff --git a/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchResultView.swift b/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchResultView.swift index 4eb4ca8bb3f0b3ff56b057342fba118985faaa71..fd29a84fb819761505b8b973c757f29a46597490 100644 --- a/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchResultView.swift +++ b/Examples/xx-messenger/Sources/UserSearchFeature/UserSearchResultView.swift @@ -13,13 +13,11 @@ public struct UserSearchResultView: View { var username: String? var email: String? var phone: String? - var dbContactAuth: XXModels.Contact.AuthStatus? init(state: UserSearchResultState) { username = state.username email = state.email phone = state.phone - dbContactAuth = state.dbContact?.authStatus } var isEmpty: Bool { @@ -30,103 +28,28 @@ public struct UserSearchResultView: View { public var body: some View { WithViewStore(store.scope(state: ViewState.init)) { viewStore in Section { - if viewStore.isEmpty { - Image(systemName: "questionmark") - .frame(maxWidth: .infinity) - } else { - if let username = viewStore.username { - Text(username) - } - if let email = viewStore.email { - Text(email) - } - if let phone = viewStore.phone { - Text(phone) - } - } - switch viewStore.dbContactAuth { - case .none, .stranger: - Button { - viewStore.send(.sendRequestButtonTapped) - } label: { - HStack { - Text("Send request") - Spacer() - Image(systemName: "person.badge.plus") - } - } - - case .requesting: - HStack { - Text("Sending auth request") - Spacer() - ProgressView() - } - - case .requested: - HStack { - Text("Request sent") - Spacer() - Image(systemName: "paperplane") - } - - case .requestFailed: - HStack { - Text("Sending request failed") - Spacer() - Image(systemName: "xmark.diamond.fill") - .foregroundColor(.red) - } - - case .verificationInProgress: - HStack { - Text("Verification is progress") - Spacer() - ProgressView() - } - - case .verified: - HStack { - Text("Verified") - Spacer() - Image(systemName: "person.fill.checkmark") - } - - case .verificationFailed: - HStack { - Text("Verification failed") - Spacer() - Image(systemName: "xmark.diamond.fill") - .foregroundColor(.red) - } - - case .confirming: - HStack { - Text("Confirming auth request") - Spacer() - ProgressView() - } - - case .confirmationFailed: - HStack { - Text("Confirmation failed") - Spacer() - Image(systemName: "xmark.diamond.fill") - .foregroundColor(.red) - } - - case .friend: + Button { + viewStore.send(.tapped) + } label: { HStack { - Text("Friend") - Spacer() - Image(systemName: "person.fill.checkmark") - } - - case .hidden: - HStack { - Text("Hidden") + VStack { + if viewStore.isEmpty { + Image(systemName: "questionmark") + .frame(maxWidth: .infinity) + } else { + if let username = viewStore.username { + Text(username) + } + if let email = viewStore.email { + Text(email) + } + if let phone = viewStore.phone { + Text(phone) + } + } + } Spacer() - Image(systemName: "eye.slash") + Image(systemName: "chevron.forward") } } }