import SwiftUI struct MainHomeBannerSection: View { let items: [RecommendationBannerResponse] let onTapBanner: (RecommendationBannerResponse) -> Void init( items: [RecommendationBannerResponse], onTapBanner: @escaping (RecommendationBannerResponse) -> Void = { _ in } ) { self.items = items self.onTapBanner = onTapBanner } var body: some View { if !items.isEmpty { BannerCarousel(items: carouselItems) { item in guard let banner = banner(for: item) else { return } onTapBanner(banner) } } } private var carouselItems: [BannerCarouselItem] { items.enumerated().map { index, item in BannerCarouselItem( id: fallbackId(for: item, index: index), imageUrl: item.imageUrl ) } } private func banner(for carouselItem: BannerCarouselItem) -> RecommendationBannerResponse? { items.enumerated().first { index, item in fallbackId(for: item, index: index) == carouselItem.id }?.element } private func fallbackId(for item: RecommendationBannerResponse, index: Int) -> String { if let eventItem = item.eventItem { return "banner-\(index)-event-\(eventItem.id)" } if let creatorId = item.creatorId { return "banner-\(index)-creator-\(creatorId)" } if let seriesId = item.seriesId { return "banner-\(index)-series-\(seriesId)" } if let link = item.link, !link.isEmpty { return "banner-\(index)-link-\(link)" } return "banner-\(index)-image-\(item.imageUrl)" } } struct MainHomeBannerSection_Previews: PreviewProvider { static var previews: some View { MainHomeBannerSection( items: [ RecommendationBannerResponse( imageUrl: "https://picsum.photos/500/500", eventItem: nil, creatorId: nil, seriesId: nil, link: nil ), RecommendationBannerResponse( imageUrl: "https://picsum.photos/500/500", eventItem: nil, creatorId: 1, seriesId: nil, link: nil ) ] ) .background(Color.black) .previewLayout(.sizeThatFits) } }