Signal-iOS/Signal/ConversationView/ConversationViewModel.swift
2026-05-12 14:03:51 -04:00

72 lines
2.5 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import SignalServiceKit
import SignalUI
class ConversationViewModel {
enum BadgeType {
case verified
case official
}
let groupCallInProgress: Bool
let isSystemContact: Bool
let badgeType: BadgeType?
let unreadMentionMessageIds: [String]
static func load(for thread: TSThread, tx: DBReadTransaction) -> 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)!.aci,
in: thread.uniqueId,
includeReadMessages: false,
tx: tx,
).map { $0.uniqueId }
return ConversationViewModel(
groupCallInProgress: groupCallInProgress,
isSystemContact: isSystemContact,
badgeType: badgeType(for: thread, tx: tx),
unreadMentionMessageIds: unreadMentionMessageIds,
)
}
init(
groupCallInProgress: Bool,
isSystemContact: Bool,
badgeType: BadgeType?,
unreadMentionMessageIds: [String],
) {
self.groupCallInProgress = groupCallInProgress
self.isSystemContact = isSystemContact
self.badgeType = badgeType
self.unreadMentionMessageIds = unreadMentionMessageIds
}
private static func badgeType(for thread: TSThread, tx: DBReadTransaction) -> BadgeType? {
let identityManager = DependenciesBridge.shared.identityManager
switch thread {
case let groupThread as TSGroupThread:
if groupThread.groupModel.groupMembers.isEmpty {
return nil
}
return identityManager.groupContainsUnverifiedMember(groupThread.uniqueId, tx: tx) ? nil : .verified
case let contactThread as TSContactThread:
return identityManager.verificationState(for: contactThread.contactAddress, tx: tx) == .verified ? .verified : nil
case is TSReleaseNotesThread:
return .official
default:
owsFailDebug("Showing conversation for unexpected thread type.")
return nil
}
}
}