TM-SGNL-iOS/SignalUI/Views/ConversationAvatarView+SwiftUI.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

92 lines
2.9 KiB
Swift

//
// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
public import SwiftUI
public import SignalServiceKit
public struct AvatarView: View {
public typealias Configuration = ConversationAvatarView.Configuration
public var dataSource: ConversationAvatarDataSource?
public var sizeClass: Configuration.SizeClass
public var localUserDisplayMode: LocalUserDisplayMode
public var badged: Bool
public var shape: Configuration.Shape
public init(
dataSource: ConversationAvatarDataSource?,
sizeClass: Configuration.SizeClass,
localUserDisplayMode: LocalUserDisplayMode,
badged: Bool = true,
shape: Configuration.Shape = .circular
) {
self.dataSource = dataSource
self.sizeClass = sizeClass
self.localUserDisplayMode = localUserDisplayMode
self.badged = badged
self.shape = shape
}
public var body: some View {
AvatarViewRepresentable(
dataSource: self.dataSource,
sizeClass: self.sizeClass,
localUserDisplayMode: self.localUserDisplayMode,
badged: self.badged,
shape: self.shape,
useAutolayout: true
)
.fixedSize()
}
private struct AvatarViewRepresentable: UIViewRepresentable {
var dataSource: ConversationAvatarDataSource?
var sizeClass: Configuration.SizeClass
var localUserDisplayMode: LocalUserDisplayMode
var badged: Bool
var shape: Configuration.Shape
var useAutolayout: Bool
func makeUIView(context: Context) -> ConversationAvatarView {
let uiView = ConversationAvatarView(
sizeClass: self.sizeClass,
localUserDisplayMode: self.localUserDisplayMode,
badged: self.badged,
shape: self.shape,
useAutolayout: self.useAutolayout
)
if let dataSource {
uiView.updateWithSneakyTransactionIfNecessary { config in
config.dataSource = dataSource
}
}
return uiView
}
func updateUIView(_ uiView: ConversationAvatarView, context: Context) {
uiView.updateWithSneakyTransactionIfNecessary { config in
config.dataSource = self.dataSource
config.sizeClass = self.sizeClass
config.localUserDisplayMode = self.localUserDisplayMode
config.addBadgeIfApplicable = self.badged
config.shape = self.shape
config.useAutolayout = self.useAutolayout
}
}
}
}
#Preview {
AvatarView(
dataSource: .asset(
avatar: .init(named: "avatar_cat"),
badge: nil
),
sizeClass: .eightyEight,
localUserDisplayMode: .asLocalUser,
badged: false,
shape: .circular
)
}