wip
This commit is contained in:
parent
22b6f415d2
commit
ad7a2b4f59
|
@ -131,6 +131,7 @@
|
||||||
54E594BE2523C34B00E4172B /* MLPubSub.m in Sources */ = {isa = PBXBuildFile; fileRef = 54E594BC2523C34A00E4172B /* MLPubSub.m */; };
|
54E594BE2523C34B00E4172B /* MLPubSub.m in Sources */ = {isa = PBXBuildFile; fileRef = 54E594BC2523C34A00E4172B /* MLPubSub.m */; };
|
||||||
54F0B81928231691003664BD /* WelcomeLogIn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F0B81828231690003664BD /* WelcomeLogIn.swift */; };
|
54F0B81928231691003664BD /* WelcomeLogIn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F0B81828231690003664BD /* WelcomeLogIn.swift */; };
|
||||||
54F0B81C282316F5003664BD /* RegisterAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F0B81B282316F5003664BD /* RegisterAccount.swift */; };
|
54F0B81C282316F5003664BD /* RegisterAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F0B81B282316F5003664BD /* RegisterAccount.swift */; };
|
||||||
|
598A717356906687AD101542 /* MonalWrapperModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 282FE922A600668B10016B4C /* MonalWrapperModels.swift */; };
|
||||||
6E9488F6997650B805476F25 /* Pods_another_im.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F29121F912380F72CCE51747 /* Pods_another_im.framework */; };
|
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 */; };
|
7D40218FEAB3BA882811A682 /* Pods_Monal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C40963CED187B2F1B4B88F7 /* Pods_Monal.framework */; };
|
||||||
7E1C0AC72CEF68C000B8FEC0 /* MainTabScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E1C0AC62CEF68C000B8FEC0 /* MainTabScreen.swift */; };
|
7E1C0AC72CEF68C000B8FEC0 /* MainTabScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E1C0AC62CEF68C000B8FEC0 /* MainTabScreen.swift */; };
|
||||||
|
@ -559,6 +560,7 @@
|
||||||
26FC619524EB6C270094C302 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = external/en.lproj/iosShare.strings; sourceTree = "<group>"; };
|
26FC619524EB6C270094C302 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = external/en.lproj/iosShare.strings; sourceTree = "<group>"; };
|
||||||
26FE3BC91C61A6C3003CC230 /* MLResizingTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLResizingTextView.h; sourceTree = "<group>"; };
|
26FE3BC91C61A6C3003CC230 /* MLResizingTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLResizingTextView.h; sourceTree = "<group>"; };
|
||||||
26FE3BCA1C61A6C3003CC230 /* MLResizingTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLResizingTextView.m; sourceTree = "<group>"; };
|
26FE3BCA1C61A6C3003CC230 /* MLResizingTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLResizingTextView.m; sourceTree = "<group>"; };
|
||||||
|
282FE922A600668B10016B4C /* MonalWrapperModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MonalWrapperModels.swift; sourceTree = "<group>"; };
|
||||||
29250DA62DD2322383585B2B /* Pods_MonalUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MonalUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
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 = "<group>"; };
|
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||||
2B7A5555D807EE78C95217FD /* Pods_NotificationService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NotificationService.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
2B7A5555D807EE78C95217FD /* Pods_NotificationService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NotificationService.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
@ -1409,7 +1411,7 @@
|
||||||
name = tools;
|
name = tools;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
|
29B97314FDCFA39411CA2CEA = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
8414ADF92A7ABAC900EFFCCC /* Packages */,
|
8414ADF92A7ABAC900EFFCCC /* Packages */,
|
||||||
|
@ -1499,6 +1501,7 @@
|
||||||
children = (
|
children = (
|
||||||
7E6AF38E2CEB9110004328B5 /* MonalXmppWrapper.swift */,
|
7E6AF38E2CEB9110004328B5 /* MonalXmppWrapper.swift */,
|
||||||
404FB187FD6CB3DD41DAC820 /* AimErrors.swift */,
|
404FB187FD6CB3DD41DAC820 /* AimErrors.swift */,
|
||||||
|
282FE922A600668B10016B4C /* MonalWrapperModels.swift */,
|
||||||
);
|
);
|
||||||
path = XMPP;
|
path = XMPP;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -2061,7 +2064,7 @@
|
||||||
eu,
|
eu,
|
||||||
"es-AR",
|
"es-AR",
|
||||||
);
|
);
|
||||||
mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
|
mainGroup = 29B97314FDCFA39411CA2CEA;
|
||||||
packageReferences = (
|
packageReferences = (
|
||||||
C1F5C7AD2777638B0001F295 /* XCRemoteSwiftPackageReference "swift-collections" */,
|
C1F5C7AD2777638B0001F295 /* XCRemoteSwiftPackageReference "swift-collections" */,
|
||||||
841898A82957712000FEC77D /* XCRemoteSwiftPackageReference "ViewExtractor" */,
|
841898A82957712000FEC77D /* XCRemoteSwiftPackageReference "ViewExtractor" */,
|
||||||
|
@ -2656,6 +2659,7 @@
|
||||||
C11E557980B75AA90738EC9C /* LoginScreen.swift in Sources */,
|
C11E557980B75AA90738EC9C /* LoginScreen.swift in Sources */,
|
||||||
1C8760F8FB99C27D0C3A6ED1 /* RegistrationScreen.swift in Sources */,
|
1C8760F8FB99C27D0C3A6ED1 /* RegistrationScreen.swift in Sources */,
|
||||||
1767C5109B06AA6FDCD990E6 /* AimErrors.swift in Sources */,
|
1767C5109B06AA6FDCD990E6 /* AimErrors.swift in Sources */,
|
||||||
|
598A717356906687AD101542 /* MonalWrapperModels.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -99,7 +99,6 @@ struct LoginScreen: View {
|
||||||
private func tryLogin() async {
|
private func tryLogin() async {
|
||||||
do {
|
do {
|
||||||
try await wrapper.tryLogin(jidStr, pass)
|
try await wrapper.tryLogin(jidStr, pass)
|
||||||
wrapper.accountsAvailability = .someEnabled
|
|
||||||
} catch {
|
} catch {
|
||||||
router.showAlert(
|
router.showAlert(
|
||||||
.alert,
|
.alert,
|
||||||
|
|
|
@ -40,9 +40,6 @@ struct MainTabScreen: View {
|
||||||
TabBar(selectedTab: $selectedTab)
|
TabBar(selectedTab: $selectedTab)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onLoad {
|
|
||||||
wrapper.reconnectAll()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
39
Monal/another.im/XMPP/MonalWrapperModels.swift
Normal file
39
Monal/another.im/XMPP/MonalWrapperModels.swift
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Contact: Identifiable {
|
||||||
|
let jid: String
|
||||||
|
|
||||||
|
var id: String { jid }
|
||||||
|
}
|
|
@ -1,18 +1,17 @@
|
||||||
import Foundation
|
import Foundation
|
||||||
import monalxmpp
|
import monalxmpp
|
||||||
|
|
||||||
enum AccountsAvailability {
|
|
||||||
case noAccounts
|
|
||||||
case allDisabled
|
|
||||||
case someEnabled
|
|
||||||
}
|
|
||||||
|
|
||||||
final class MonalXmppWrapper: ObservableObject {
|
final class MonalXmppWrapper: ObservableObject {
|
||||||
@Published var accountsAvailability: AccountsAvailability = .noAccounts
|
@Published private(set) var accountsAvailability: AccountsAvailability = .noAccounts
|
||||||
|
@Published private(set) var accounts: [Account] = []
|
||||||
|
@Published private(set) var contacts: [Contact] = []
|
||||||
|
|
||||||
private let xmpp: MLXMPPManager
|
private let xmpp: MLXMPPManager
|
||||||
private let db: DataLayer
|
private let db: DataLayer
|
||||||
|
|
||||||
|
private var notificationObservers: [AnyObject] = []
|
||||||
|
private var isInitialized: Bool = false
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
// here is some inits (just for now)
|
// here is some inits (just for now)
|
||||||
MLProcessLock.initialize(forProcess: "MainApp")
|
MLProcessLock.initialize(forProcess: "MainApp")
|
||||||
|
@ -21,7 +20,13 @@ final class MonalXmppWrapper: ObservableObject {
|
||||||
xmpp = MLXMPPManager.sharedInstance()
|
xmpp = MLXMPPManager.sharedInstance()
|
||||||
db = DataLayer.sharedInstance()
|
db = DataLayer.sharedInstance()
|
||||||
|
|
||||||
checkAccountsOnLoad()
|
// subscribe to monalxmpp notifications and fire notification for update
|
||||||
|
subscribeToUpdates()
|
||||||
|
NotificationCenter.default.post(name: Notification.Name(kMonalRefresh), object: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
notificationObservers.forEach { NotificationCenter.default.removeObserver($0) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// try login
|
// try login
|
||||||
|
@ -30,27 +35,8 @@ final class MonalXmppWrapper: ObservableObject {
|
||||||
let result = await loginObject.tryLogin(login, password)
|
let result = await loginObject.tryLogin(login, password)
|
||||||
if !result {
|
if !result {
|
||||||
throw AimErrors.loginError
|
throw AimErrors.loginError
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func reconnectAll() {
|
|
||||||
xmpp.reconnectAll()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Accounts
|
|
||||||
private extension MonalXmppWrapper {
|
|
||||||
// Check accounts state on launch
|
|
||||||
func checkAccountsOnLoad() {
|
|
||||||
let enabledAcocunts = db.enabledAccountList()
|
|
||||||
let allAccounts = db.accountList()
|
|
||||||
|
|
||||||
if allAccounts.isEmpty {
|
|
||||||
accountsAvailability = .noAccounts
|
|
||||||
} else if !enabledAcocunts.isEmpty {
|
|
||||||
accountsAvailability = .someEnabled
|
|
||||||
} else {
|
} else {
|
||||||
accountsAvailability = .allDisabled
|
NotificationCenter.default.post(name: Notification.Name(kMonalRefresh), object: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,3 +84,37 @@ private final class LoginTry {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Handle notifications
|
||||||
|
private extension MonalXmppWrapper {
|
||||||
|
func subscribeToUpdates() {
|
||||||
|
let generalRefresh = NotificationCenter.default.addObserver(forName: Notification.Name(kMonalRefresh), object: nil, queue: .main) { [weak self] _ in
|
||||||
|
// get accounts
|
||||||
|
let accounts = self?.db.accountList()
|
||||||
|
.compactMap { dict -> Account? in
|
||||||
|
guard let dict = dict as? NSDictionary else { return nil }
|
||||||
|
return Account(dict)
|
||||||
|
} ?? []
|
||||||
|
self?.accounts = accounts
|
||||||
|
|
||||||
|
// start connect if it initialization process
|
||||||
|
if !(self?.isInitialized ?? true) {
|
||||||
|
self?.xmpp.reconnectAll()
|
||||||
|
self?.isInitialized = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// mark accounts availability
|
||||||
|
if accounts.isEmpty {
|
||||||
|
self?.accountsAvailability = .noAccounts
|
||||||
|
} else if !accounts.filter({ $0.isEnabled }).isEmpty {
|
||||||
|
self?.accountsAvailability = .allDisabled
|
||||||
|
} else {
|
||||||
|
self?.accountsAvailability = .someEnabled
|
||||||
|
}
|
||||||
|
|
||||||
|
// get contacts for active accounts
|
||||||
|
//
|
||||||
|
}
|
||||||
|
notificationObservers.append(generalRefresh)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue