diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 0a381d866..5ef14e3df 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -159,7 +159,6 @@ 7BCD116C27016062006330F1 /* WebRTCSession+DataChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BCD116B27016062006330F1 /* WebRTCSession+DataChannel.swift */; }; 7BD477A827EC39F5004E2822 /* Atomic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD477A727EC39F5004E2822 /* Atomic.swift */; }; 7BD687D12A5D0D1200D8E455 /* MessageInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD687D02A5D0D1200D8E455 /* MessageInfoView.swift */; }; - 7BD687D42A5E852600D8E455 /* ProfilePictureView+SwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD687D32A5E852600D8E455 /* ProfilePictureView+SwiftUI.swift */; }; 7BD976972A776C76001B466F /* SessionCarouselView+SwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BE2701D2A64C11500CEB71A /* SessionCarouselView+SwiftUI.swift */; }; 7BDCFC08242186E700641C39 /* NotificationServiceExtensionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BDCFC07242186E700641C39 /* NotificationServiceExtensionContext.swift */; }; 7BDCFC0B2421EB7600641C39 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B6F509951AA53F760068F56A /* Localizable.strings */; }; @@ -1276,7 +1275,6 @@ 7BD477A727EC39F5004E2822 /* Atomic.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Atomic.swift; sourceTree = ""; }; 7BD687D02A5D0D1200D8E455 /* MessageInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageInfoView.swift; sourceTree = ""; }; 7BD687D22A5D283200D8E455 /* build_libSession_util.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = build_libSession_util.sh; sourceTree = ""; }; - 7BD687D32A5E852600D8E455 /* ProfilePictureView+SwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProfilePictureView+SwiftUI.swift"; sourceTree = ""; }; 7BDCFC0424206E7300641C39 /* SessionNotificationServiceExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SessionNotificationServiceExtension.entitlements; sourceTree = ""; }; 7BDCFC07242186E700641C39 /* NotificationServiceExtensionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationServiceExtensionContext.swift; sourceTree = ""; }; 7BE2701D2A64C11500CEB71A /* SessionCarouselView+SwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SessionCarouselView+SwiftUI.swift"; sourceTree = ""; }; @@ -2945,7 +2943,6 @@ FD52090628B49738006098F6 /* ConfirmationModal.swift */, C38EF2A3255B6D93007E1867 /* PlaceholderIcon.swift */, C38EF2A4255B6D93007E1867 /* ProfilePictureView.swift */, - 7BD687D32A5E852600D8E455 /* ProfilePictureView+SwiftUI.swift */, FD71165A28E6DDBC00B47552 /* StyledNavigationController.swift */, FD0B77AF29B69A65009169BA /* TopBannerController.swift */, ); @@ -5490,7 +5487,6 @@ FD71162C28E1451400B47552 /* Position.swift in Sources */, FD52090328B4680F006098F6 /* RadioButton.swift in Sources */, C331FFE82558FB0000070591 /* TextView.swift in Sources */, - 7BD687D42A5E852600D8E455 /* ProfilePictureView+SwiftUI.swift in Sources */, FD71162028D97ABC00B47552 /* UIImage+Tinting.swift in Sources */, FD71162A28DA83DF00B47552 /* GradientView.swift in Sources */, FD37E9D728A20B5D003AE748 /* UIColor+Utilities.swift in Sources */, diff --git a/SessionMessagingKit/Utilities/ProfilePictureView+Convenience.swift b/SessionMessagingKit/Utilities/ProfilePictureView+Convenience.swift index 16958927c..a5a6ecc17 100644 --- a/SessionMessagingKit/Utilities/ProfilePictureView+Convenience.swift +++ b/SessionMessagingKit/Utilities/ProfilePictureView+Convenience.swift @@ -13,21 +13,46 @@ public extension ProfilePictureView { 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 update(Info(imageData: customImageData)) } + guard customImageData == nil else { return (Info(imageData: customImageData), nil) } // Otherwise there are conversation-type-specific behaviours switch threadVariant { case .community: let placeholderImage: UIImage = { - switch self.size { + switch size { case .navigation, .message: return #imageLiteral(resourceName: "SessionWhite16") case .list: return #imageLiteral(resourceName: "SessionWhite24") case .hero: return #imageLiteral(resourceName: "SessionWhite40") } }() - update( + return ( Info( imageData: placeholderImage.pngData(), inset: UIEdgeInsets( @@ -38,13 +63,14 @@ public extension ProfilePictureView { ), icon: profileIcon, forcedBackgroundColor: .theme(.classicDark, color: .borderSeparator) - ) + ), + nil ) case .legacyGroup, .group: - guard !publicKey.isEmpty else { return } + guard !publicKey.isEmpty else { return (nil, nil) } - update( + return ( Info( imageData: ( profile.map { ProfileManager.profileAvatar(profile: $0) } ?? @@ -53,14 +79,14 @@ public extension ProfilePictureView { text: (profile?.displayName(for: threadVariant)) .defaulting(to: publicKey), size: (additionalProfile != nil ? - self.size.multiImageSize : - self.size.viewSize + size.multiImageSize : + size.viewSize ) ).pngData() ), icon: profileIcon ), - additionalInfo: additionalProfile + additionalProfile .map { otherProfile in Info( imageData: ( @@ -68,7 +94,7 @@ public extension ProfilePictureView { PlaceholderIcon.generate( seed: otherProfile.id, text: otherProfile.displayName(for: threadVariant), - size: self.size.multiImageSize + size: size.multiImageSize ).pngData() ), icon: additionalProfileIcon @@ -91,9 +117,9 @@ public extension ProfilePictureView { ) case .contact: - guard !publicKey.isEmpty else { return } + guard !publicKey.isEmpty else { return (nil, nil) } - update( + return ( Info( imageData: ( profile.map { ProfileManager.profileAvatar(profile: $0) } ?? @@ -102,13 +128,14 @@ public extension ProfilePictureView { text: (profile?.displayName(for: threadVariant)) .defaulting(to: publicKey), size: (additionalProfile != nil ? - self.size.multiImageSize : - self.size.viewSize + size.multiImageSize : + size.viewSize ) ).pngData() ), icon: profileIcon - ) + ), + nil ) } } diff --git a/SessionUIKit/Components/ProfilePictureView+SwiftUI.swift b/SessionUIKit/Components/ProfilePictureView+SwiftUI.swift deleted file mode 100644 index 7f3ffd5e5..000000000 --- a/SessionUIKit/Components/ProfilePictureView+SwiftUI.swift +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved. - -import SwiftUI - -public struct ProfilePictureSwiftUI: UIViewRepresentable { - public typealias UIViewType = ProfilePictureView - - var size: ProfilePictureView.Size - - public init(size: ProfilePictureView.Size) { - self.size = size - } - - public func makeUIView(context: Context) -> ProfilePictureView { - ProfilePictureView(size: size) - } - - public func updateUIView(_ uiView: ProfilePictureView, context: Context) { - - } -} diff --git a/SessionUIKit/Components/ProfilePictureView.swift b/SessionUIKit/Components/ProfilePictureView.swift index b05e69606..01db3d50d 100644 --- a/SessionUIKit/Components/ProfilePictureView.swift +++ b/SessionUIKit/Components/ProfilePictureView.swift @@ -550,3 +550,34 @@ public final class ProfilePictureView: UIView { additionalProfileIconBackgroundView.layer.cornerRadius = (size.iconSize / 2) } } + +import SwiftUI + +struct ProfilePictureSwiftUI: UIViewRepresentable { + typealias UIViewType = ProfilePictureView + + var size: ProfilePictureView.Size + var info: ProfilePictureView.Info + var additionalInfo: ProfilePictureView.Info? + + public init( + size: ProfilePictureView.Size, + info: ProfilePictureView.Info, + additionalInfo: ProfilePictureView.Info? = nil + ) { + self.size = size + self.info = info + self.additionalInfo = additionalInfo + } + + func makeUIView(context: Context) -> ProfilePictureView { + ProfilePictureView(size: size) + } + + func updateUIView(_ profilePictureView: ProfilePictureView, context: Context) { + profilePictureView.update( + info, + additionalInfo: additionalInfo + ) + } +}