From 87642a5a10e16442bd910ffc308462f998682801 Mon Sep 17 00:00:00 2001 From: Woit Date: Fri, 29 Nov 2024 18:35:20 +0100 Subject: [PATCH] wip --- Monal/Monal.xcodeproj/project.pbxproj | 46 +++++++- Monal/another.im/XMPP/Models/Account.swift | 33 ++++++ Monal/another.im/XMPP/Models/Chat.swift | 27 +++++ Monal/another.im/XMPP/Models/Contact.swift | 16 +++ Monal/another.im/XMPP/Models/Message.swift | 29 +++++ .../another.im/XMPP/MonalWrapperModels.swift | 110 ------------------ Monal/another.im/XMPP/MonalXmppWrapper.swift | 10 +- .../XMPP/Scenaries/ScenarioLogIn.swift | 1 + 8 files changed, 155 insertions(+), 117 deletions(-) create mode 100644 Monal/another.im/XMPP/Models/Account.swift create mode 100644 Monal/another.im/XMPP/Models/Chat.swift create mode 100644 Monal/another.im/XMPP/Models/Contact.swift create mode 100644 Monal/another.im/XMPP/Models/Message.swift delete mode 100644 Monal/another.im/XMPP/MonalWrapperModels.swift create mode 100644 Monal/another.im/XMPP/Scenaries/ScenarioLogIn.swift diff --git a/Monal/Monal.xcodeproj/project.pbxproj b/Monal/Monal.xcodeproj/project.pbxproj index 538283b..764fdf7 100644 --- a/Monal/Monal.xcodeproj/project.pbxproj +++ b/Monal/Monal.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 07D2570A3091519439B47A6A /* Chat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C9B95CF9DA11FCEE44990A0 /* Chat.swift */; }; 08CAF17FA202CF3CB760D93C /* Pods_NotificationService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B7A5555D807EE78C95217FD /* Pods_NotificationService.framework */; }; 1767C5109B06AA6FDCD990E6 /* AimErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 404FB187FD6CB3DD41DAC820 /* AimErrors.swift */; }; 1C8760F8FB99C27D0C3A6ED1 /* RegistrationScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D4382FFF3D97C4E1D7727C /* RegistrationScreen.swift */; }; @@ -86,6 +87,7 @@ 38720923251EDE07001837EB /* MLXEPSlashMeHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 38720921251EDE07001837EB /* MLXEPSlashMeHandler.m */; }; 389E298C25E901CA009A5268 /* MLAudioRecoderManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 389E298925E901CA009A5268 /* MLAudioRecoderManager.m */; }; 389E298D25E901CA009A5268 /* MLAudioRecoderManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 389E298B25E901CA009A5268 /* MLAudioRecoderManager.h */; }; + 3BBDABE6BF04654E4D73FE94 /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8DEED95641012F70DC22087 /* Account.swift */; }; 3D06A515281FFCC000DDAE90 /* NotificationDebugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D06A514281FFCC000DDAE90 /* NotificationDebugging.swift */; }; 3D27D956290B0BB60014748B /* AddContactMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D27D955290B0BB60014748B /* AddContactMenu.swift */; }; 3D27D958290B0BC80014748B /* ContactRequestsMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D27D957290B0BC80014748B /* ContactRequestsMenu.swift */; }; @@ -131,7 +133,7 @@ 54E594BE2523C34B00E4172B /* MLPubSub.m in Sources */ = {isa = PBXBuildFile; fileRef = 54E594BC2523C34A00E4172B /* MLPubSub.m */; }; 54F0B81928231691003664BD /* WelcomeLogIn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F0B81828231690003664BD /* WelcomeLogIn.swift */; }; 54F0B81C282316F5003664BD /* RegisterAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F0B81B282316F5003664BD /* RegisterAccount.swift */; }; - 598A717356906687AD101542 /* MonalWrapperModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 282FE922A600668B10016B4C /* MonalWrapperModels.swift */; }; + 5C2B6A5C14F38F315ECC3F5E /* ScenarioLogIn.swift in Sources */ = {isa = PBXBuildFile; fileRef = C02B964344F7E01D60E660D7 /* ScenarioLogIn.swift */; }; 6E9488F6997650B805476F25 /* Pods_another_im.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F29121F912380F72CCE51747 /* Pods_another_im.framework */; }; 7D40218FEAB3BA882811A682 /* Pods_Monal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C40963CED187B2F1B4B88F7 /* Pods_Monal.framework */; }; 7E1C0AC72CEF68C000B8FEC0 /* MainTabScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E1C0AC62CEF68C000B8FEC0 /* MainTabScreen.swift */; }; @@ -283,6 +285,7 @@ D09B51F62C7F30DD008D725B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 26B2A4BA1B73061400272E63 /* Images.xcassets */; }; D0FA79B12C7E5C7400216D2A /* ServerDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0FA79B02C7E5C7400216D2A /* ServerDetails.swift */; }; D7E74AF213445E39318BC648 /* Pods_MonalUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29250DA62DD2322383585B2B /* Pods_MonalUITests.framework */; }; + DEDA22BC3DBA90E586F6B7CE /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405F76B4AD0B916C50352D23 /* Message.swift */; }; E89DD32525C6626400925F62 /* MLFileTransferDataCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DD32025C6626300925F62 /* MLFileTransferDataCell.m */; }; E89DD32625C6626400925F62 /* MLFileTransferVideoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DD32125C6626300925F62 /* MLFileTransferVideoCell.m */; }; E89DD32725C6626400925F62 /* MLFileTransferFileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DD32225C6626300925F62 /* MLFileTransferFileViewController.m */; }; @@ -290,6 +293,7 @@ E8CF9CC726249640001A1952 /* MLSettingsAboutViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8CF9CC026249640001A1952 /* MLSettingsAboutViewController.m */; }; E8DED06225388BE8003167FF /* MLSearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8DED06125388BE8003167FF /* MLSearchViewController.m */; }; F9C277F46F5157194744C491 /* Pods_shareSheet.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F1488206B764014DD7EC92A /* Pods_shareSheet.framework */; }; + FB2F7FAE1616F093C3E3B7E3 /* Contact.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4345AD68A77CBACCCA9FA1D /* Contact.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -576,11 +580,11 @@ 26FC619524EB6C270094C302 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = external/en.lproj/iosShare.strings; sourceTree = ""; }; 26FE3BC91C61A6C3003CC230 /* MLResizingTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLResizingTextView.h; sourceTree = ""; }; 26FE3BCA1C61A6C3003CC230 /* MLResizingTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLResizingTextView.m; sourceTree = ""; }; - 282FE922A600668B10016B4C /* MonalWrapperModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MonalWrapperModels.swift; sourceTree = ""; }; 29250DA62DD2322383585B2B /* Pods_MonalUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MonalUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 2B7A5555D807EE78C95217FD /* Pods_NotificationService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NotificationService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2C59BAF969550DFAC27E5F2B /* Pods_MonalXMPPUnitTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MonalXMPPUnitTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2C9B95CF9DA11FCEE44990A0 /* Chat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Chat.swift; sourceTree = ""; }; 2D8673A73C41D0B1697FE97D /* LoginScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LoginScreen.swift; sourceTree = ""; }; 2E5021A8D40FCC591D952104 /* Pods-NotificaionService.alpha-ios.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificaionService.alpha-ios.xcconfig"; path = "Target Support Files/Pods-NotificaionService/Pods-NotificaionService.alpha-ios.xcconfig"; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* MonalSourceCodePrefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MonalSourceCodePrefix.pch; sourceTree = ""; }; @@ -607,6 +611,7 @@ 3EB7A7084FA9A8F68A3D251C /* Pods-MonalXMPPUnitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MonalXMPPUnitTests.debug.xcconfig"; path = "Target Support Files/Pods-MonalXMPPUnitTests/Pods-MonalXMPPUnitTests.debug.xcconfig"; sourceTree = ""; }; 4049F81F60EA5B7A57A4E9C6 /* Pods-NotificationService.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationService.beta.xcconfig"; path = "Target Support Files/Pods-NotificationService/Pods-NotificationService.beta.xcconfig"; sourceTree = ""; }; 404FB187FD6CB3DD41DAC820 /* AimErrors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AimErrors.swift; sourceTree = ""; }; + 405F76B4AD0B916C50352D23 /* Message.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Message.swift; sourceTree = ""; }; 43FFAD161EF5A0B1CB149814 /* Pods-shareSheet.alpha-ios.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-shareSheet.alpha-ios.xcconfig"; path = "Target Support Files/Pods-shareSheet/Pods-shareSheet.alpha-ios.xcconfig"; sourceTree = ""; }; 4862C3A0242FB4F709B8F3FF /* Pods-MonalXMPPUnitTests.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MonalXMPPUnitTests.beta.xcconfig"; path = "Target Support Files/Pods-MonalXMPPUnitTests/Pods-MonalXMPPUnitTests.beta.xcconfig"; sourceTree = ""; }; 4A614910EEF29D66DD4B37E3 /* Pods-NotificaionService.adhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificaionService.adhoc.xcconfig"; path = "Target Support Files/Pods-NotificaionService/Pods-NotificaionService.adhoc.xcconfig"; sourceTree = ""; }; @@ -779,6 +784,7 @@ B8155E63F8DE80FF36D0B3B7 /* Pods-NotificationService.adhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationService.adhoc.xcconfig"; path = "Target Support Files/Pods-NotificationService/Pods-NotificationService.adhoc.xcconfig"; sourceTree = ""; }; BC9E05245CF07072A35AE126 /* Pods-another.im.alpha.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-another.im.alpha.xcconfig"; path = "Target Support Files/Pods-another.im/Pods-another.im.alpha.xcconfig"; sourceTree = ""; }; BFA9EFD7A8064201C81F52CF /* Pods-Monal.alpha.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Monal.alpha.xcconfig"; path = "Target Support Files/Pods-Monal/Pods-Monal.alpha.xcconfig"; sourceTree = ""; }; + C02B964344F7E01D60E660D7 /* ScenarioLogIn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ScenarioLogIn.swift; sourceTree = ""; }; C10490482612ED2F0054AC9E /* MLEmoji.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MLEmoji.swift; sourceTree = ""; }; C10490E22612F3D00054AC9E /* MLCrypto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MLCrypto.swift; sourceTree = ""; }; C10490EA2612F3E00054AC9E /* EncryptedPayload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptedPayload.swift; sourceTree = ""; }; @@ -906,6 +912,8 @@ C1F5C7A72775DA000001F295 /* MLContactSoftwareVersionInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MLContactSoftwareVersionInfo.h; sourceTree = ""; }; C1F5C7A82775DA000001F295 /* MLContactSoftwareVersionInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MLContactSoftwareVersionInfo.m; sourceTree = ""; }; C1F5C7AB2777621B0001F295 /* ContactResources.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactResources.swift; sourceTree = ""; }; + C4345AD68A77CBACCCA9FA1D /* Contact.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Contact.swift; sourceTree = ""; }; + C8DEED95641012F70DC22087 /* Account.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = ""; }; CCF3CF336EBAA5802383370F /* WelcomeScreen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WelcomeScreen.swift; sourceTree = ""; }; D02192F22C89BB3800202A59 /* BlockedUsers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedUsers.swift; sourceTree = ""; }; D0FA79B02C7E5C7400216D2A /* ServerDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerDetails.swift; sourceTree = ""; }; @@ -1443,7 +1451,7 @@ name = tools; sourceTree = ""; }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { + 29B97314FDCFA39411CA2CEA = { isa = PBXGroup; children = ( 8414ADF92A7ABAC900EFFCCC /* Packages */, @@ -1571,7 +1579,8 @@ children = ( 7E6AF38E2CEB9110004328B5 /* MonalXmppWrapper.swift */, 404FB187FD6CB3DD41DAC820 /* AimErrors.swift */, - 282FE922A600668B10016B4C /* MonalWrapperModels.swift */, + E23C31EA05858AFC0AB43D06 /* Scenaries */, + 8C5F2E42A69F9A7B93A20F78 /* Models */, ); path = XMPP; sourceTree = ""; @@ -1765,6 +1774,18 @@ path = WebRTC; sourceTree = ""; }; + 8C5F2E42A69F9A7B93A20F78 /* Models */ = { + isa = PBXGroup; + children = ( + C8DEED95641012F70DC22087 /* Account.swift */, + C4345AD68A77CBACCCA9FA1D /* Contact.swift */, + 2C9B95CF9DA11FCEE44990A0 /* Chat.swift */, + 405F76B4AD0B916C50352D23 /* Message.swift */, + ); + name = Models; + path = Models; + sourceTree = ""; + }; C1049187261301530054AC9E /* MonalXMPPUnitTests */ = { isa = PBXGroup; children = ( @@ -1831,6 +1852,15 @@ name = Frameworks; sourceTree = ""; }; + E23C31EA05858AFC0AB43D06 /* Scenaries */ = { + isa = PBXGroup; + children = ( + C02B964344F7E01D60E660D7 /* ScenarioLogIn.swift */, + ); + name = Scenaries; + path = Scenaries; + sourceTree = ""; + }; EA534340732BF66B533E4C0B /* Generated */ = { isa = PBXGroup; children = ( @@ -2144,7 +2174,7 @@ eu, "es-AR", ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; + mainGroup = 29B97314FDCFA39411CA2CEA; packageReferences = ( C1F5C7AD2777638B0001F295 /* XCRemoteSwiftPackageReference "swift-collections" */, 841898A82957712000FEC77D /* XCRemoteSwiftPackageReference "ViewExtractor" */, @@ -2755,7 +2785,11 @@ C11E557980B75AA90738EC9C /* LoginScreen.swift in Sources */, 1C8760F8FB99C27D0C3A6ED1 /* RegistrationScreen.swift in Sources */, 1767C5109B06AA6FDCD990E6 /* AimErrors.swift in Sources */, - 598A717356906687AD101542 /* MonalWrapperModels.swift in Sources */, + 3BBDABE6BF04654E4D73FE94 /* Account.swift in Sources */, + FB2F7FAE1616F093C3E3B7E3 /* Contact.swift in Sources */, + 07D2570A3091519439B47A6A /* Chat.swift in Sources */, + DEDA22BC3DBA90E586F6B7CE /* Message.swift in Sources */, + 5C2B6A5C14F38F315ECC3F5E /* ScenarioLogIn.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Monal/another.im/XMPP/Models/Account.swift b/Monal/another.im/XMPP/Models/Account.swift new file mode 100644 index 0000000..613d9fd --- /dev/null +++ b/Monal/another.im/XMPP/Models/Account.swift @@ -0,0 +1,33 @@ +import Foundation +import SwiftUI + +struct Account: Identifiable { + let id: Int + let local: String + let domain: String + let resource: String + let isEnabled: Bool + + var jid: String { + "\(local)@\(domain)" + } + + init?(_ dict: NSDictionary) { + guard let id = dict.value(forKey: "account_id") as? Int else { return nil } + guard let local = dict.value(forKey: "username") as? String else { return nil } + guard let domain = dict.value(forKey: "domain") as? String else { return nil } + guard let resource = dict.value(forKey: "resource") as? String else { return nil } + guard let isEnabled = dict.value(forKey: "enabled") as? Bool else { return nil } + + self.id = id + self.local = local + self.domain = domain + self.resource = resource + self.isEnabled = isEnabled + } +} + +extension Account: UniversalInputSelectionElement { + var icon: Image? { nil } + var text: String? { jid } +} diff --git a/Monal/another.im/XMPP/Models/Chat.swift b/Monal/another.im/XMPP/Models/Chat.swift new file mode 100644 index 0000000..d452e16 --- /dev/null +++ b/Monal/another.im/XMPP/Models/Chat.swift @@ -0,0 +1,27 @@ +import Foundation +import monalxmpp + +struct Chat: Identifiable { + let accountId: Int + let participantJid: String + let participantName: String? + + var id: String { + "\(accountId)_\(participantJid)" + } + + var name: String { + if let participantName, !participantName.isEmpty { + return participantName + } else { + return participantJid + } + } + + init?(_ obj: MLContact) { + guard let accId = obj.accountID as? Int else { return nil } + accountId = accId + participantJid = obj.contactJid + participantName = obj.nickName + } +} diff --git a/Monal/another.im/XMPP/Models/Contact.swift b/Monal/another.im/XMPP/Models/Contact.swift new file mode 100644 index 0000000..0227c68 --- /dev/null +++ b/Monal/another.im/XMPP/Models/Contact.swift @@ -0,0 +1,16 @@ +import Foundation +import monalxmpp + +struct Contact: Identifiable { + let ownerId: Int + let contactJid: String + let name: String? + + var id: String { contactJid } + + init?(_ obj: MLContact) { + ownerId = obj.accountID.intValue + contactJid = obj.contactJid + name = obj.nickName.isEmpty ? nil : obj.nickName + } +} diff --git a/Monal/another.im/XMPP/Models/Message.swift b/Monal/another.im/XMPP/Models/Message.swift new file mode 100644 index 0000000..dbceecc --- /dev/null +++ b/Monal/another.im/XMPP/Models/Message.swift @@ -0,0 +1,29 @@ +import Foundation +import monalxmpp + +struct Message: Identifiable { + let accountId: Int + let participantJid: String + let dbId: Int + let stanzaId: String + let timestamp: Date + let body: String + let isInbound: Bool + let encrypted: Bool + + var id: String { + "\(accountId)|\(dbId)" + } + + init?(_ obj: MLMessage) { + guard let accId = obj.accountID as? Int, let dbId = obj.messageDBId as? Int else { return nil } + accountId = accId + participantJid = obj.participantJid + self.dbId = dbId + stanzaId = obj.stanzaId + timestamp = obj.timestamp + body = obj.messageText + isInbound = obj.inbound + encrypted = obj.encrypted + } +} diff --git a/Monal/another.im/XMPP/MonalWrapperModels.swift b/Monal/another.im/XMPP/MonalWrapperModels.swift deleted file mode 100644 index c77d95f..0000000 --- a/Monal/another.im/XMPP/MonalWrapperModels.swift +++ /dev/null @@ -1,110 +0,0 @@ -import Foundation -import monalxmpp -import SwiftUI - -// MARK: - Account -enum AccountsAvailability { - case noAccounts - case allDisabled - case someEnabled -} - -struct Account: Identifiable { - let id: Int - let local: String - let domain: String - let resource: String - let isEnabled: Bool - - var jid: String { - "\(local)@\(domain)" - } - - init?(_ dict: NSDictionary) { - guard let id = dict.value(forKey: "account_id") as? Int else { return nil } - guard let local = dict.value(forKey: "username") as? String else { return nil } - guard let domain = dict.value(forKey: "domain") as? String else { return nil } - guard let resource = dict.value(forKey: "resource") as? String else { return nil } - guard let isEnabled = dict.value(forKey: "enabled") as? Bool else { return nil } - - self.id = id - self.local = local - self.domain = domain - self.resource = resource - self.isEnabled = isEnabled - } -} - -extension Account: UniversalInputSelectionElement { - var icon: Image? { nil } - var text: String? { jid } -} - -// MARK: - Contact -struct Contact: Identifiable { - let ownerId: Int - let contactJid: String - let name: String? - - var id: String { contactJid } - - init?(_ obj: MLContact) { - ownerId = obj.accountID.intValue - contactJid = obj.contactJid - name = obj.nickName.isEmpty ? nil : obj.nickName - } -} - -// MARK: - Chat -struct Chat: Identifiable { - let accountId: Int - let participantJid: String - let participantName: String? - - var id: String { - "\(accountId)_\(participantJid)" - } - - var name: String { - if let participantName, !participantName.isEmpty { - return participantName - } else { - return participantJid - } - } - - init?(_ obj: MLContact) { - guard let accId = obj.accountID as? Int else { return nil } - accountId = accId - participantJid = obj.contactJid - participantName = obj.nickName - } -} - -// MARK: Message -struct Message: Identifiable { - let accountId: Int - let participantJid: String - let dbId: Int - let stanzaId: String - let timestamp: Date - let body: String - let isInbound: Bool - let encrypted: Bool - - var id: String { - "\(accountId)|\(dbId)" - } - - init?(_ obj: MLMessage) { - guard let accId = obj.accountID as? Int, let dbId = obj.messageDBId as? Int else { return nil } - accountId = accId - participantJid = obj.participantJid - self.dbId = dbId - stanzaId = obj.stanzaId - timestamp = obj.timestamp - body = obj.messageText - isInbound = obj.inbound - encrypted = obj.encrypted - } -} diff --git a/Monal/another.im/XMPP/MonalXmppWrapper.swift b/Monal/another.im/XMPP/MonalXmppWrapper.swift index 133d511..0bc6cfb 100644 --- a/Monal/another.im/XMPP/MonalXmppWrapper.swift +++ b/Monal/another.im/XMPP/MonalXmppWrapper.swift @@ -1,6 +1,12 @@ import Foundation import monalxmpp +enum AccountsAvailability { + case noAccounts + case allDisabled + case someEnabled +} + final class MonalXmppWrapper: ObservableObject { @Published private(set) var accountsAvailability: AccountsAvailability = .noAccounts @Published private(set) var accounts: [Account] = [] @@ -260,7 +266,9 @@ final class MonalChatWrapper: ObservableObject { acc.setMAMQueryMostRecentFor(monalContact, before: lastStanzaId) { [weak self] msgs, _ in self?.mamRequestInProgress = false if !(msgs ?? []).isEmpty { - self?.refreshMessages() + DispatchQueue.main.async { [weak self] in + self?.refreshMessages() + } } } } diff --git a/Monal/another.im/XMPP/Scenaries/ScenarioLogIn.swift b/Monal/another.im/XMPP/Scenaries/ScenarioLogIn.swift new file mode 100644 index 0000000..fecc4ab --- /dev/null +++ b/Monal/another.im/XMPP/Scenaries/ScenarioLogIn.swift @@ -0,0 +1 @@ +import Foundation