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] } }