92 lines
2.9 KiB
Swift
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
|
|
)
|
|
}
|