diff --git a/Sources/LaunchFeature/LaunchViewModel.swift b/Sources/LaunchFeature/LaunchViewModel.swift index 5178c2e25847abe17334cf10b4717981bff6cfbd..e35515a2de49c40f4917bf82d09f6517478131a3 100644 --- a/Sources/LaunchFeature/LaunchViewModel.swift +++ b/Sources/LaunchFeature/LaunchViewModel.swift @@ -145,10 +145,16 @@ final class LaunchViewModel { try messenger.connect() } - try generateGroupManager(messenger: messenger) + try messenger.e2e.get()?.registerListener( + senderId: nil, + messageType: 2, + callback: .init(handle: { + print(">>> \(String(data: $0.payload, encoding: .utf8))") + }) + ) + try generateGroupManager(messenger: messenger) try generateTrafficManager(messenger: messenger) - try generateTransferManager(messenger: messenger) if messenger.isLoggedIn() == false { @@ -448,8 +454,8 @@ extension LaunchViewModel { createdAt: Date() )) - if email == nil, phone == nil { - do { + do { + if email == nil, phone == nil { try performLookup(on: contact) { [weak self] in guard let self = self else { return } @@ -467,11 +473,27 @@ extension LaunchViewModel { try! self.database.saveContact(model) } } - } catch { - print(">>> Error \(#file):\(#line): \(error.localizedDescription)") + } else { + try performSearch(on: contact) { [weak self] in + guard let self = self else { return } + + switch $0 { + case .success(let searchedContact): + if try! self.verifyOwnership(contact, searchedContact) { // How could this ever throw? + model.authStatus = .verified + try! self.database.saveContact(model) + } else { + try! self.database.deleteContact(model) + } + case .failure(let error): + model.authStatus = .verificationFailed + print(">>> Error \(#file):\(#line): \(error.localizedDescription)") + try! self.database.saveContact(model) + } + } } - } else { - performSearch(on: contact) + } catch { + print(">>> Error \(#file):\(#line): \(error.localizedDescription)") } } @@ -494,7 +516,36 @@ extension LaunchViewModel { } private func handleGroupRequest(from group: XXClient.Group) { - // TODO + if let _ = try? database.fetchGroups(.init(id: [group.getId()])).first { + print(">>> Tried to handle a group request that is already handled") + return + } + + let leaderId = try! group.getMembership() // This is all users on the group, the 1st is the leader/creator. + + try! database.saveGroup(.init( + id: group.getId(), + name: String(data: group.getName(), encoding: .utf8)!, + leaderId: leaderId, + createdAt: Date.fromTimestamp(Int(group.getCreatedMS())), + authStatus: .pending, + serialized: group.serialize() + )) + + if let initialMessage = String(data: group.getInitMessage(), encoding: .utf8) { + try! database.saveMessage(.init( + senderId: leaderId, + recipientId: nil, + groupId: group.getId(), + date: Date.fromTimestamp(Int(group.getCreatedMS())), + status: .received, + isUnread: true, + text: initialMessage + )) + } + + // TODO: + // All other members should be added to the database as GroupMembers } private func performLookup( @@ -515,19 +566,40 @@ extension LaunchViewModel { switch $0 { case .success(let otherContact): print(">>> Lookup succeeded") - completion(.success(otherContact)) case .failure(let error): print(">>> Lookup failed: \(error.localizedDescription)") - completion(.failure(error)) } }) ) } - private func performSearch(on contact: XXClient.Contact) { - fatalError(">>> UD Search is not implemented yet") + private func performSearch( + on contact: XXClient.Contact, + completion: @escaping (Result<XXClient.Contact, Error>) -> Void + ) throws { + guard let messenger = try? DependencyInjection.Container.shared.resolve() as Messenger else { + fatalError(">>> Tried to search, but there's no messenger instance on DI container") + } + + print(">>> Performing Search") + + let _ = try SearchUD.live( + e2eId: messenger.e2e.get()!.getId(), + udContact: try messenger.ud.get()!.getContact(), + facts: contact.getFacts(), + callback: .init(handle: { + switch $0 { + case .success(let otherContact): + print(">>> Search succeeded") + completion(.success(otherContact.first!)) + case .failure(let error): + print(">>> Search failed: \(error.localizedDescription)") + completion(.failure(error)) + } + }) + ) } private func verifyOwnership( diff --git a/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift b/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift index ea8dd26ddfda1dc94f22991a81817d50d71d4bc6..96586dea576f39d472cc2ac41020fcdc3a4f79ee 100644 --- a/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift +++ b/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift @@ -1,9 +1,17 @@ import HUD import Combine +import Defaults import Foundation +import XXClient +import XXMessengerClient import DependencyInjection +import Models final class AccountDeleteViewModel { + @Dependency var messenger: Messenger + + @KeyObject(.username, defaultValue: nil) var username: String? + var deleting = false var hud: AnyPublisher<HUDStatus, Never> { hudRelay.eraseToAnyPublisher() } @@ -18,6 +26,10 @@ final class AccountDeleteViewModel { } do { + let fact = Fact(fact: username!, type: FactType.username.rawValue) + try messenger.ud.get()!.permanentDeleteAccount(username: fact) + try messenger.destroy() + DispatchQueue.main.async { [weak self] in self?.hudRelay.send(.error(.init( content: "Now kill the app and re-open", @@ -26,7 +38,6 @@ final class AccountDeleteViewModel { ))) } } catch { - DispatchQueue.main.async { [weak self] in self?.hudRelay.send(.error(.init(with: error))) } diff --git a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved index 4fd5a9556ed7b6cf460a8a9d1ae2e32487e19399..def30f909786b1a3dee029082a11de178bf0e989 100644 --- a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -105,7 +105,7 @@ "location" : "https://git.xx.network/elixxir/elixxir-dapps-sdk-swift", "state" : { "branch" : "development", - "revision" : "32ac1c46d6015069efa20dfe772f20adee6e3ecb" + "revision" : "108dd0bfc00775b051f848cdc8b3921c26be47e7" } }, {