TM-SGNL-iOS/SignalServiceKit/Messages/Interactions/TSInfoMessage+ThreadMerge.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

66 lines
2.6 KiB
Swift

//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
extension TSInfoMessage {
static func makeForThreadMerge(
mergedThread: TSContactThread,
timestamp: UInt64 = MessageTimestampGenerator.sharedInstance.generateTimestamp(),
previousE164: String?
) -> TSInfoMessage {
let infoMessageUserInfo: [InfoMessageUserInfoKey: Any] = if let previousE164 {
[.threadMergePhoneNumber: previousE164]
} else {
[:]
}
return TSInfoMessage(
thread: mergedThread,
messageType: .threadMerge,
timestamp: timestamp,
infoMessageUserInfo: infoMessageUserInfo
)
}
}
public extension TSInfoMessage {
/// If this info message represents an E164/PNI -> ACI thread merge event,
/// returns the "before" thread's E164.
var threadMergePhoneNumber: String? {
return infoMessageValue(forKey: .threadMergePhoneNumber)
}
@objc
func threadMergeDescription(tx: SDSAnyReadTransaction) -> String {
let displayName = contactThreadDisplayName(tx: tx)
if let phoneNumber = threadMergePhoneNumber {
let formatString = OWSLocalizedString(
"THREAD_MERGE_PHONE_NUMBER",
comment: "A system event shown in a conversation when multiple conversations for the same person have been merged into one. The parameters are replaced with the contact's name (eg John Doe) and their phone number (eg +1 650 555 0100)."
)
let formattedPhoneNumber = PhoneNumber.bestEffortLocalizedPhoneNumber(e164: phoneNumber)
return String(format: formatString, displayName, formattedPhoneNumber)
} else {
let formatString = OWSLocalizedString(
"THREAD_MERGE_NO_PHONE_NUMBER",
comment: "A system event shown in a conversation when multiple conversations for the same person have been merged into one. The parameter is replaced with the contact's name (eg John Doe)."
)
return String(format: formatString, displayName)
}
}
private func contactThreadDisplayName(tx: SDSAnyReadTransaction) -> String {
guard
let contactThread = DependenciesBridge.shared.threadStore
.fetchThread(uniqueId: uniqueThreadId, tx: tx.asV2Read) as? TSContactThread
else {
return CommonStrings.unknownUser
}
return SSKEnvironment.shared.contactManagerRef.displayName(
for: contactThread.contactAddress,
tx: tx
).resolvedValue()
}
}