84 lines
2.5 KiB
Swift
84 lines
2.5 KiB
Swift
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)
|
|
}
|
|
}
|