TM-SGNL-iOS/SignalUI/ContactSharing/ContactShareField.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

102 lines
2.6 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import SignalServiceKit
protocol ContactShareField: AnyObject {
var isIncluded: Bool { get set }
var localizedLabel: String { get }
func applyToContact(contact: ContactShareDraft)
}
class ContactShareFieldBase<ContactFieldType: OWSContactField>: ContactShareField {
let value: ContactFieldType
init(_ value: ContactFieldType) {
self.value = value
}
private var isIncludedFlag = true
var isIncluded: Bool {
get { isIncludedFlag }
set { isIncludedFlag = newValue }
}
var localizedLabel: String {
return value.localizedLabel
}
func applyToContact(contact: ContactShareDraft) {
fatalError("applyToContact(contact:) has not been implemented")
}
}
class ContactSharePhoneNumber: ContactShareFieldBase<OWSContactPhoneNumber> {
override func applyToContact(contact: ContactShareDraft) {
owsPrecondition(isIncluded)
var values = [OWSContactPhoneNumber]()
values += contact.phoneNumbers
values.append(value)
contact.phoneNumbers = values
}
}
class ContactShareEmail: ContactShareFieldBase<OWSContactEmail> {
override func applyToContact(contact: ContactShareDraft) {
owsPrecondition(isIncluded)
var values = [OWSContactEmail]()
values += contact.emails
values.append(value)
contact.emails = values
}
}
class ContactShareAddress: ContactShareFieldBase<OWSContactAddress> {
override func applyToContact(contact: ContactShareDraft) {
owsPrecondition(isIncluded)
var values = [OWSContactAddress]()
values += contact.addresses
values.append(value)
contact.addresses = values
}
}
// Stub class so that avatars conform to OWSContactField.
class OWSContactAvatar: NSObject, OWSContactField {
let avatarImage: UIImage
let avatarData: Data
let existingAttachment: ReferencedAttachment?
init(avatarImage: UIImage, avatarData: Data, existingAttachment: ReferencedAttachment?) {
self.avatarImage = avatarImage
self.avatarData = avatarData
self.existingAttachment = existingAttachment
super.init()
}
var isValid: Bool { true }
var localizedLabel: String { "" }
}
class ContactShareAvatarField: ContactShareFieldBase<OWSContactAvatar> {
override func applyToContact(contact: ContactShareDraft) {
owsPrecondition(isIncluded)
contact.avatarImageData = value.avatarData
contact.existingAvatarAttachment = value.existingAttachment
}
}