Untitled

 avatar
unknown
plain_text
a year ago
3.8 kB
6
Indexable
import SwiftUI
import Cosmos

struct FacesStackView: View {
    @State var items: [String] = []
    @State var borderColor: Color = Color.white
    @State var widthSize: CGFloat = 24
    @State var label: String = ""
    
    var body: some View {
        VStack {
            if items.isEmpty {
                EmptyView()
            } else {
                HStack(spacing: 16) {
                    ForEach(createIcons(items), id: \.self) { icon in
                        icon
                    }
                    Spacer(minLength: 18)
                    Text(label)
                        .modifier(StyleNames.shareFacesModify)
                }
            }
        }
    }
    
    func layout(_ newItems: [String]) {
        items = newItems
        if items.isEmpty {
            return
        }
        label = String(format: NSLocalizedString("%d user", comment: "%d"), max(0, items.count - createIcons(items).count))
    }
    
    func layoutFriends(_ newItems: [String]) {
        items = newItems
        if items.isEmpty {
            return
        }
        label = String(format: NSLocalizedString("%d followersJoin", comment: "%d"), max(0, items.count))
    }
    
    func layoutHosts(_ organizers: EventOrganizers) {
        items = organizers.hosts.map { $0.avatar }
        if items.isEmpty {
            return
        }
        if items.count == 1 {
            layoutHost(organizer: organizers.hosts.first!, rating: organizers.rating)
            return
        }
        label = String(format: NSLocalizedString("%d host", comment: "%d"), max(0, organizers.hosts.count)).uppercased()
    }
    
    private func createSpacing(_ space: CGFloat) -> some View {
        return Spacer().frame(width: space)
    }
    
    private func layoutHost(organizer: CompactOrganizer, rating: Double) {
        items = [organizer.avatar]
        label = organizer.displayName
        if organizer.status.superhost {
            // Handle superhost layout
        }
    }
    
    private func createRatingView(_ rating: Double) -> some View {
        return CosmosView(settings: CosmosSettings.default).frame(height: 6).rating(rating)
    }
    
    private func createIcons(_ items: [String]) -> [some View] {
        return items.prefix(4).map { url in
            ZStack {
                ImageView(url: url, placeholder: "userPlaceholder")
                    .frame(width: widthSize, height: widthSize)
                    .border(Color(borderColor), width: 2)
                    .clipShape(Circle())
                    .background(Color.white)
                    .cornerRadius(widthSize / 2)
                    .shadow(color: Color.gray.opacity(0.5), radius: 10, x: 2, y: 1)
            }
            .frame(width: 14, height: widthSize)
        }
    }
}

struct ImageView: View {
    let url: String
    let placeholder: String
    
    var body: some View {
        // Use appropriate image loading library here, e.g. SDWebImageSwiftUI
        AsyncImage(url: URL(string: url)) { phase in
            if let image = phase.image {
                image.resizable().scaledToFill()
            } else {
                Image(placeholder).resizable().scaledToFill()
            }
        }
    }
}

// Placeholder for styles and other utility structures
struct StyleNames {
    static let shareFacesModify = ViewModifier { content in
        content.font(.system(size: 12))
    }
}

// Placeholder for EventOrganizers, CompactOrganizer, etc.
struct EventOrganizers {
    var hosts: [CompactOrganizer]
    var rating: Double
}

struct CompactOrganizer {
    var avatar: String
    var displayName: String
    var status: Status
}

struct Status {
    var superhost: Bool
}

struct FacesStackView_Previews: PreviewProvider {
    static var previews: some View {
        FacesStackView()
    }
}
Editor is loading...
Leave a Comment