forked from mirrors/linphone-iphone
99 lines
3.3 KiB
Swift
99 lines
3.3 KiB
Swift
/*
|
|
* Copyright (c) 2010-2024 Belledonne Communications SARL.
|
|
*
|
|
* This file is part of Linphone
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
import Foundation
|
|
import linphonesw
|
|
import SwiftUI
|
|
|
|
class AccountModel: ObservableObject {
|
|
let account: Account
|
|
@Published var humanReadableRegistrationState: String = ""
|
|
@Published var registrationStateAssociatedUIColor: Color = .clear
|
|
@Published var notificationsCount: Int = 0
|
|
@Published var isDefaultAccount: Bool = false
|
|
@Published var displayName: String = ""
|
|
@Published var address: String = ""
|
|
|
|
init(account: Account, corePublisher: CoreDelegatePublisher?) {
|
|
self.account = account
|
|
CoreContext.shared.doOnCoreQueue { _ in
|
|
self.update()
|
|
}
|
|
account.publisher?.onRegistrationStateChanged?.postOnCoreQueue { _ in
|
|
self.update()
|
|
}
|
|
corePublisher?.onChatRoomRead?.postOnCoreQueue(
|
|
receiveValue: { _ in
|
|
self.computeNotificationsCount()
|
|
})
|
|
corePublisher?.onMessagesReceived?.postOnCoreQueue(
|
|
receiveValue: { _ in
|
|
self.computeNotificationsCount()
|
|
})
|
|
corePublisher?.onCallStateChanged?.postOnCoreQueue(
|
|
receiveValue: { _ in
|
|
self.computeNotificationsCount()
|
|
})
|
|
}
|
|
|
|
private func update() {
|
|
let state = account.state
|
|
var isDefault: Bool = false
|
|
if let defaultAccount = account.core?.defaultAccount {
|
|
isDefault = (defaultAccount == account)
|
|
}
|
|
let displayName = account.displayName()
|
|
let address = account.params?.identityAddress?.asString()
|
|
DispatchQueue.main.async { [self] in
|
|
switch state {
|
|
case .Cleared, .None:
|
|
humanReadableRegistrationState = "drawer_menu_account_connection_status_cleared".localized()
|
|
registrationStateAssociatedUIColor = .orangeWarning600
|
|
case .Progress:
|
|
humanReadableRegistrationState = "drawer_menu_account_connection_status_progress".localized()
|
|
registrationStateAssociatedUIColor = .greenSuccess500
|
|
case .Failed:
|
|
humanReadableRegistrationState = "drawer_menu_account_connection_status_failed".localized()
|
|
registrationStateAssociatedUIColor = .redDanger500
|
|
case .Ok:
|
|
humanReadableRegistrationState = "drawer_menu_account_connection_status_connected".localized()
|
|
registrationStateAssociatedUIColor = .greenSuccess500
|
|
case .Refreshing:
|
|
humanReadableRegistrationState = "drawer_menu_account_connection_status_refreshing".localized()
|
|
registrationStateAssociatedUIColor = .grayMain2c500
|
|
}
|
|
isDefaultAccount = isDefault
|
|
self.displayName = displayName
|
|
address.map {self.address = $0}
|
|
}
|
|
}
|
|
|
|
private func computeNotificationsCount() {
|
|
let count = account.unreadChatMessageCount + account.missedCallsCount
|
|
DispatchQueue.main.async { [self] in
|
|
notificationsCount = count
|
|
}
|
|
}
|
|
|
|
func refreshRegiter() {
|
|
CoreContext.shared.doOnCoreQueue { _ in
|
|
self.account.refreshRegister()
|
|
}
|
|
}
|
|
}
|