mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.1 KiB
Swift
159 lines
5.1 KiB
Swift
//
|
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
@objc
|
|
public class ContactShareViewModel: NSObject {
|
|
|
|
public let dbRecord: OWSContact
|
|
|
|
public let avatarImageData: Data?
|
|
lazy var avatarImage: UIImage? = {
|
|
guard let avatarImageData = self.avatarImageData else {
|
|
return nil
|
|
}
|
|
|
|
return UIImage(data: avatarImageData)
|
|
}()
|
|
|
|
public required init(contactShareRecord: OWSContact, avatarImageData: Data?) {
|
|
self.dbRecord = contactShareRecord
|
|
self.avatarImageData = avatarImageData
|
|
}
|
|
|
|
public convenience init(contactShareRecord: OWSContact, transaction: YapDatabaseReadTransaction) {
|
|
if let avatarAttachment = contactShareRecord.avatarAttachment(with: transaction) as? TSAttachmentStream {
|
|
self.init(contactShareRecord: contactShareRecord, avatarImageData: avatarAttachment.validStillImageData())
|
|
} else {
|
|
self.init(contactShareRecord: contactShareRecord, avatarImageData: nil)
|
|
}
|
|
}
|
|
|
|
public func getAvatarImage(diameter: CGFloat, contactsManager: OWSContactsManager) -> UIImage {
|
|
if let avatarImage = avatarImage {
|
|
return avatarImage
|
|
}
|
|
|
|
// TODO: What's the best colorSeed value to use?
|
|
let avatarBuilder = OWSContactAvatarBuilder(nonSignalName: displayName,
|
|
colorSeed: displayName,
|
|
diameter: UInt(diameter),
|
|
contactsManager: contactsManager)
|
|
return avatarBuilder.build()
|
|
}
|
|
|
|
// MARK: Delegated -> dbRecord
|
|
|
|
public var addresses: [OWSContactAddress] {
|
|
get {
|
|
return dbRecord.addresses
|
|
}
|
|
set {
|
|
return dbRecord.addresses = newValue
|
|
}
|
|
}
|
|
|
|
public var emails: [OWSContactEmail] {
|
|
get {
|
|
return dbRecord.emails
|
|
}
|
|
set {
|
|
dbRecord.emails = newValue
|
|
}
|
|
}
|
|
|
|
public var phoneNumbers: [OWSContactPhoneNumber] {
|
|
get {
|
|
return dbRecord.phoneNumbers
|
|
}
|
|
set {
|
|
dbRecord.phoneNumbers = newValue
|
|
}
|
|
}
|
|
|
|
public func systemContactsWithSignalAccountPhoneNumbers(_ contactsManager: ContactsManagerProtocol) -> [String] {
|
|
return dbRecord.systemContactsWithSignalAccountPhoneNumbers(contactsManager)
|
|
}
|
|
|
|
public func systemContactPhoneNumbers(_ contactsManager: ContactsManagerProtocol) -> [String] {
|
|
return dbRecord.systemContactPhoneNumbers(contactsManager)
|
|
}
|
|
|
|
public func e164PhoneNumbers() -> [String] {
|
|
return dbRecord.e164PhoneNumbers()
|
|
}
|
|
|
|
public var displayName: String {
|
|
return dbRecord.displayName
|
|
}
|
|
|
|
public var ows_isValid: Bool {
|
|
return dbRecord.ows_isValid()
|
|
}
|
|
|
|
public var namePrefix: String? {
|
|
return dbRecord.namePrefix
|
|
}
|
|
|
|
public var givenName: String? {
|
|
return dbRecord.givenName
|
|
}
|
|
|
|
public var middleName: String? {
|
|
return dbRecord.middleName
|
|
}
|
|
|
|
public var familyName: String? {
|
|
return dbRecord.familyName
|
|
}
|
|
|
|
public var nameSuffix: String? {
|
|
return dbRecord.nameSuffix
|
|
}
|
|
|
|
public var isProfileAvatar: Bool {
|
|
return dbRecord.isProfileAvatar
|
|
}
|
|
|
|
public func cnContact(mergedWithExistingContact existingContact: Contact) -> CNContact? {
|
|
|
|
guard let newCNContact = OWSContacts.systemContact(for: self.dbRecord, imageData: self.avatarImageData) else {
|
|
owsFail("\(logTag) in \(#function) newCNContact was unexpectedly nil")
|
|
return nil
|
|
}
|
|
|
|
return existingContact.buildCNContact(mergedWithNewContact: newCNContact)
|
|
}
|
|
|
|
public func copy(withNamePrefix namePrefix: String?,
|
|
givenName: String?,
|
|
middleName: String?,
|
|
familyName: String?,
|
|
nameSuffix: String?) -> ContactShareViewModel {
|
|
|
|
// TODO move the `copy` logic into the view model?
|
|
let newDbRecord = dbRecord.copy(withNamePrefix: namePrefix, givenName: givenName, middleName: middleName, familyName: familyName, nameSuffix: nameSuffix)
|
|
|
|
return ContactShareViewModel(contactShareRecord: newDbRecord, avatarImageData: self.avatarImageData)
|
|
}
|
|
|
|
public func newContact(withNamePrefix namePrefix: String?,
|
|
givenName: String?,
|
|
middleName: String?,
|
|
familyName: String?,
|
|
nameSuffix: String?) -> ContactShareViewModel {
|
|
|
|
// TODO move the `newContact` logic into the view model?
|
|
let newDbRecord = dbRecord.newContact(withNamePrefix: namePrefix,
|
|
givenName: givenName,
|
|
middleName: middleName,
|
|
familyName: familyName,
|
|
nameSuffix: nameSuffix)
|
|
|
|
return ContactShareViewModel(contactShareRecord: newDbRecord, avatarImageData: self.avatarImageData)
|
|
}
|
|
|
|
}
|