47 lines
1.4 KiB
Swift
47 lines
1.4 KiB
Swift
import SwiftUI
|
|
|
|
struct CircularAvatarView: View {
|
|
let name: String
|
|
var imageData: Data?
|
|
var size: CGFloat = 32
|
|
var isGroup: Bool = false
|
|
|
|
var body: some View {
|
|
if let imageData = imageData, let uiImage = UIImage(data: imageData) {
|
|
Image(uiImage: uiImage)
|
|
.resizable()
|
|
.aspectRatio(contentMode: .fill)
|
|
.frame(width: size, height: size)
|
|
.clipShape(Circle())
|
|
} else {
|
|
// Default: colored circle with initial letter
|
|
ZStack {
|
|
Circle()
|
|
.fill(avatarColor)
|
|
.frame(width: size, height: size)
|
|
|
|
Text(initial)
|
|
.font(.system(size: size * 0.4, weight: .semibold))
|
|
.foregroundStyle(.white)
|
|
}
|
|
}
|
|
}
|
|
|
|
private var initial: String {
|
|
String(name.prefix(1)).uppercased()
|
|
}
|
|
|
|
/// Deterministic color from name hash (matching Python gui_client behavior)
|
|
private var avatarColor: Color {
|
|
let colors: [Color] = [
|
|
.red, .orange, .yellow, .green, .mint,
|
|
.teal, .cyan, .blue, .indigo, .purple, .pink
|
|
]
|
|
var hash = 0
|
|
for char in name.unicodeScalars {
|
|
hash = hash &* 31 &+ Int(char.value)
|
|
}
|
|
return colors[abs(hash) % colors.count]
|
|
}
|
|
}
|