66 lines
2.4 KiB
Swift
66 lines
2.4 KiB
Swift
//
|
|
// Copyright 2023 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import SignalServiceKit
|
|
import SignalUI
|
|
|
|
class ConversationViewModel {
|
|
let groupCallInProgress: Bool
|
|
let isSystemContact: Bool
|
|
let shouldShowVerifiedBadge: Bool
|
|
let unreadMentionMessageIds: [String]
|
|
|
|
static func load(for thread: TSThread, tx: SDSAnyReadTransaction) -> ConversationViewModel {
|
|
let groupCallInProgress = GroupCallInteractionFinder().unendedCallsForGroupThread(thread, transaction: tx)
|
|
.filter { !$0.joinedMemberAcis.isEmpty }
|
|
.count > 0
|
|
|
|
let isSystemContact = thread.isSystemContact(contactsManager: SSKEnvironment.shared.contactManagerImplRef, tx: tx)
|
|
|
|
let unreadMentionMessageIds = MentionFinder.messagesMentioning(
|
|
aci: DependenciesBridge.shared.tsAccountManager.localIdentifiers(tx: tx.asV2Read)!.aci,
|
|
in: thread,
|
|
includeReadMessages: false,
|
|
tx: tx
|
|
).map { $0.uniqueId }
|
|
|
|
return ConversationViewModel(
|
|
groupCallInProgress: groupCallInProgress,
|
|
isSystemContact: isSystemContact,
|
|
shouldShowVerifiedBadge: shouldShowVerifiedBadge(for: thread, tx: tx),
|
|
unreadMentionMessageIds: unreadMentionMessageIds
|
|
)
|
|
}
|
|
|
|
init(
|
|
groupCallInProgress: Bool,
|
|
isSystemContact: Bool,
|
|
shouldShowVerifiedBadge: Bool,
|
|
unreadMentionMessageIds: [String]
|
|
) {
|
|
self.groupCallInProgress = groupCallInProgress
|
|
self.isSystemContact = isSystemContact
|
|
self.shouldShowVerifiedBadge = shouldShowVerifiedBadge
|
|
self.unreadMentionMessageIds = unreadMentionMessageIds
|
|
}
|
|
|
|
private static func shouldShowVerifiedBadge(for thread: TSThread, tx: SDSAnyReadTransaction) -> Bool {
|
|
let identityManager = DependenciesBridge.shared.identityManager
|
|
switch thread {
|
|
case let groupThread as TSGroupThread:
|
|
if groupThread.groupModel.groupMembers.isEmpty {
|
|
return false
|
|
}
|
|
return !identityManager.groupContainsUnverifiedMember(groupThread.uniqueId, tx: tx.asV2Read)
|
|
|
|
case let contactThread as TSContactThread:
|
|
return identityManager.verificationState(for: contactThread.contactAddress, tx: tx.asV2Read) == .verified
|
|
|
|
default:
|
|
owsFailDebug("Showing conversation for unexpected thread type.")
|
|
return false
|
|
}
|
|
}
|
|
}
|