|  |  |  | // Copyright © 2023 Rangeproof Pty Ltd. All rights reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import Foundation | 
					
						
							|  |  |  | import SessionUIKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public extension ProfilePictureView { | 
					
						
							|  |  |  |     func update( | 
					
						
							|  |  |  |         publicKey: String, | 
					
						
							|  |  |  |         threadVariant: SessionThread.Variant, | 
					
						
							|  |  |  |         customImageData: Data?, | 
					
						
							|  |  |  |         profile: Profile?, | 
					
						
							|  |  |  |         profileIcon: ProfileIcon = .none, | 
					
						
							|  |  |  |         additionalProfile: Profile? = nil, | 
					
						
							|  |  |  |         additionalProfileIcon: ProfileIcon = .none | 
					
						
							|  |  |  |     ) { | 
					
						
							|  |  |  |         let (info, additionalInfo): (Info?, Info?) = Self.getProfilePictureInfo( | 
					
						
							|  |  |  |             size: self.size, | 
					
						
							|  |  |  |             publicKey: publicKey, | 
					
						
							|  |  |  |             threadVariant: threadVariant, | 
					
						
							|  |  |  |             customImageData: customImageData, | 
					
						
							|  |  |  |             profile: profile, | 
					
						
							|  |  |  |             profileIcon: profileIcon, | 
					
						
							|  |  |  |             additionalProfile: additionalProfile, | 
					
						
							|  |  |  |             additionalProfileIcon: additionalProfileIcon | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         guard let info: Info = info else { return } | 
					
						
							|  |  |  |         update(info, additionalInfo: additionalInfo) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     static func getProfilePictureInfo( | 
					
						
							|  |  |  |         size: Size, | 
					
						
							|  |  |  |         publicKey: String, | 
					
						
							|  |  |  |         threadVariant: SessionThread.Variant, | 
					
						
							|  |  |  |         customImageData: Data?, | 
					
						
							|  |  |  |         profile: Profile?, | 
					
						
							|  |  |  |         profileIcon: ProfileIcon = .none, | 
					
						
							|  |  |  |         additionalProfile: Profile? = nil, | 
					
						
							|  |  |  |         additionalProfileIcon: ProfileIcon = .none | 
					
						
							|  |  |  |     ) -> (Info?, Info?) { | 
					
						
							|  |  |  |         // If we are given 'customImageData' then only use that | 
					
						
							|  |  |  |         guard customImageData == nil else { return (Info(imageData: customImageData), 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 { ProfileManager.profileAvatar(profile: $0) } ?? | 
					
						
							|  |  |  |                             PlaceholderIcon.generate( | 
					
						
							|  |  |  |                                 seed: 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: ( | 
					
						
							|  |  |  |                                     ProfileManager.profileAvatar(profile: 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 { ProfileManager.profileAvatar(profile: $0) } ?? | 
					
						
							|  |  |  |                             PlaceholderIcon.generate( | 
					
						
							|  |  |  |                                 seed: publicKey, | 
					
						
							|  |  |  |                                 text: (profile?.displayName(for: threadVariant)) | 
					
						
							|  |  |  |                                     .defaulting(to: publicKey), | 
					
						
							|  |  |  |                                 size: (additionalProfile != nil ? | 
					
						
							|  |  |  |                                     size.multiImageSize : | 
					
						
							|  |  |  |                                     size.viewSize | 
					
						
							|  |  |  |                                 ) | 
					
						
							|  |  |  |                             ).pngData() | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                         icon: profileIcon | 
					
						
							|  |  |  |                     ), | 
					
						
							|  |  |  |                     nil | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |