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.
session-ios/SessionMessagingKit/Utilities/ProfilePictureView+Convenie...

186 lines
7.3 KiB
Swift

// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved.
import UIKit
import SessionUIKit
import SessionUtilitiesKit
public extension ProfilePictureView {
func update(
publicKey: String,
threadVariant: SessionThread.Variant,
displayPictureFilename: String?,
profile: Profile?,
profileIcon: ProfileIcon = .none,
additionalProfile: Profile? = nil,
additionalProfileIcon: ProfileIcon = .none,
using dependencies: Dependencies
) {
let (info, additionalInfo): (Info?, Info?) = ProfilePictureView.getProfilePictureInfo(
size: self.size,
publicKey: publicKey,
threadVariant: threadVariant,
displayPictureFilename: displayPictureFilename,
profile: profile,
profileIcon: profileIcon,
additionalProfile: additionalProfile,
additionalProfileIcon: additionalProfileIcon,
using: dependencies
)
guard let info: Info = info else { return }
update(info, additionalInfo: additionalInfo)
}
static func getProfilePictureInfo(
size: Size,
publicKey: String,
threadVariant: SessionThread.Variant,
displayPictureFilename: String?,
profile: Profile?,
profileIcon: ProfileIcon = .none,
additionalProfile: Profile? = nil,
additionalProfileIcon: ProfileIcon = .none,
using dependencies: Dependencies
) -> (Info?, Info?) {
// If we are given an explicit 'displayPictureFilename' then only use that (this could be for
// either Community conversations or updated groups)
if let displayPictureFilename: String = displayPictureFilename {
return (Info(
imageData: dependencies[singleton: .displayPictureManager].displayPicture(
owner: .file(displayPictureFilename)
),
icon: profileIcon
), nil)
}
// Otherwise there are conversation-type-specific behaviours
switch threadVariant {
case .community:
let placeholderImage: UIImage = {
switch size {
case .navigation, .message: return #imageLiteral(resourceName: "SessionWhite16")
case .list: return #imageLiteral(resourceName: "SessionWhite24")
case .hero: return #imageLiteral(resourceName: "SessionWhite40")
}
}()
return (
Info(
imageData: placeholderImage.pngData(),
inset: UIEdgeInsets(
top: 12,
left: 12,
bottom: 12,
right: 12
),
icon: profileIcon,
forcedBackgroundColor: .theme(.classicDark, color: .borderSeparator)
),
nil
)
case .legacyGroup, .group:
guard !publicKey.isEmpty else { return (nil, nil) }
return (
Info(
imageData: (
profile.map { dependencies[singleton: .displayPictureManager].displayPicture(owner: .user($0)) } ??
PlaceholderIcon.generate(
seed: (profile?.id ?? publicKey),
text: (profile?.displayName(for: threadVariant))
.defaulting(to: publicKey),
size: (additionalProfile != nil ?
size.multiImageSize :
size.viewSize
)
).pngData()
),
icon: profileIcon
),
additionalProfile
.map { otherProfile in
Info(
imageData: (
dependencies[singleton: .displayPictureManager].displayPicture(owner: .user(otherProfile)) ??
PlaceholderIcon.generate(
seed: otherProfile.id,
text: otherProfile.displayName(for: threadVariant),
size: size.multiImageSize
).pngData()
),
icon: additionalProfileIcon
)
}
.defaulting(
to: Info(
imageData: UIImage(systemName: "person.fill")?.pngData(),
renderingMode: .alwaysTemplate,
themeTintColor: .white,
inset: UIEdgeInsets(
top: 3,
left: 0,
bottom: -5,
right: 0
),
icon: additionalProfileIcon
)
)
)
case .contact:
guard !publicKey.isEmpty else { return (nil, nil) }
return (
Info(
imageData: (
profile.map { dependencies[singleton: .displayPictureManager].displayPicture(owner: .user($0)) } ??
PlaceholderIcon.generate(
seed: publicKey,
text: (profile?.displayName(for: threadVariant))
.defaulting(to: publicKey),
size: size.viewSize
).pngData()
),
icon: profileIcon
),
nil
)
}
}
}
public extension ProfilePictureSwiftUI {
init?(
size: ProfilePictureView.Size,
publicKey: String,
threadVariant: SessionThread.Variant,
displayPictureFilename: String?,
profile: Profile?,
profileIcon: ProfilePictureView.ProfileIcon = .none,
additionalProfile: Profile? = nil,
additionalProfileIcon: ProfilePictureView.ProfileIcon = .none,
using dependencies: Dependencies
) {
let (info, additionalInfo) = ProfilePictureView.getProfilePictureInfo(
size: size,
publicKey: publicKey,
threadVariant: threadVariant,
displayPictureFilename: displayPictureFilename,
profile: profile,
profileIcon: profileIcon,
additionalProfile: additionalProfile,
additionalProfileIcon: additionalProfileIcon,
using: dependencies
)
if let info = info {
self.init(size: size, info: info, additionalInfo: additionalInfo)
} else {
return nil
}
}
}