Skip to content

Commit

Permalink
Refactor BPKImageGalleryImageGridStyle to use structs for chip and im…
Browse files Browse the repository at this point in the history
…age categories (#1948)
  • Loading branch information
frugoman committed Apr 26, 2024
1 parent b65db53 commit 0615c50
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 86 deletions.
110 changes: 59 additions & 51 deletions Backpack-SwiftUI/ImageGalleryGrid/Classes/BPKImageGalleryGrid.swift
Expand Up @@ -47,55 +47,63 @@ struct ImageGalleryGrid<Categories: View, ImageView: View>: ViewModifier {
public extension View {
// swiftlint:disable function_parameter_count
@ViewBuilder
func bpkImageGalleryGrid<Content>(
func bpkImageGalleryGrid<CategoryView, Content>(
isPresented: Binding<Bool>,
selectedCategory: Binding<Int>,
style: BPKImageGalleryImageGridStyle<Content>,
categories: [BPKImageGalleryImageCategory<CategoryView, Content>],
closeAccessibilityLabel: String,
onImageTapped: @escaping (_ category: Int, _ image: Int) -> Void,
onCloseTapped: @escaping () -> Void
) -> some View {
switch style {
case .chip(let categories):
modifier(
ImageGalleryGrid(
categories: {
ImageGalleryChipCategoryView(
categories: categories.map(\.title),
selectedCategoryIndex: selectedCategory
)
},
images: categories[selectedCategory.wrappedValue].images,
closeAccessibilityLabel: closeAccessibilityLabel,
onImageTapped: onImageTapped,
onCloseTapped: onCloseTapped,
selectedCategoryIndex: selectedCategory,
isPresented: isPresented
)
modifier(
ImageGalleryGrid(
categories: {
ImageGalleryImageCategoryView(
categories: categories.map {
.init(
title: $0.title,
categoryImage: $0.categoryImage
)
},
selectedCategory: selectedCategory
)
},
images: categories[selectedCategory.wrappedValue].images,
closeAccessibilityLabel: closeAccessibilityLabel,
onImageTapped: onImageTapped,
onCloseTapped: onCloseTapped,
selectedCategoryIndex: selectedCategory,
isPresented: isPresented
)
case .image(let categories):
modifier(
ImageGalleryGrid(
categories: {
ImageGalleryImageCategoryView(
categories: categories.map {
.init(
title: $0.title,
categoryImage: $0.categoryImage
)
},
selectedCategory: selectedCategory
)
},
images: categories[selectedCategory.wrappedValue].images,
closeAccessibilityLabel: closeAccessibilityLabel,
onImageTapped: onImageTapped,
onCloseTapped: onCloseTapped,
selectedCategoryIndex: selectedCategory,
isPresented: isPresented
)
)
}

// swiftlint:disable function_parameter_count
@ViewBuilder
func bpkImageGalleryGrid<Content>(
isPresented: Binding<Bool>,
selectedCategory: Binding<Int>,
categories: [BPKImageGalleryChipCategory<Content>],
closeAccessibilityLabel: String,
onImageTapped: @escaping (_ category: Int, _ image: Int) -> Void,
onCloseTapped: @escaping () -> Void
) -> some View {
modifier(
ImageGalleryGrid(
categories: {
ImageGalleryChipCategoryView(
categories: categories.map(\.title),
selectedCategoryIndex: selectedCategory
)
},
images: categories[selectedCategory.wrappedValue].images,
closeAccessibilityLabel: closeAccessibilityLabel,
onImageTapped: onImageTapped,
onCloseTapped: onCloseTapped,
selectedCategoryIndex: selectedCategory,
isPresented: isPresented
)
}
)
}
}

Expand All @@ -106,7 +114,7 @@ struct BPKImageGalleryImageGrid_Previews: PreviewProvider {
.bpkImageGalleryGrid(
isPresented: .constant(true),
selectedCategory: .constant(0),
style: .image(testImageCategories),
categories: testImageCategories,
closeAccessibilityLabel: "Close",
onImageTapped: { _, _ in },
onCloseTapped: {}
Expand All @@ -117,44 +125,44 @@ struct BPKImageGalleryImageGrid_Previews: PreviewProvider {
.bpkImageGalleryGrid(
isPresented: .constant(true),
selectedCategory: .constant(0),
style: .chip(testChipCategories),
categories: testChipCategories,
closeAccessibilityLabel: "Close",
onImageTapped: { _, _ in },
onCloseTapped: {}
)
.previewDisplayName("Chips")
}

private static var testChipCategories: [BPKImageGalleryImageGridStyle<Color>.ChipCategory] {
private static var testChipCategories: [BPKImageGalleryChipCategory<Color>] {
[
BPKImageGalleryImageGridStyle.ChipCategory(
.init(
title: "Green but with very long title indeed (40)",
images: testImages(40, color: .green)
),
BPKImageGalleryImageGridStyle.ChipCategory(
.init(
title: "Blue photos (10)",
images: testImages(5, color: .blue)
),
BPKImageGalleryImageGridStyle.ChipCategory(
.init(
title: "Red photos (10)",
images: testImages(6, color: .red)
)
]
}

private static var testImageCategories: [BPKImageGalleryImageGridStyle<Color>.ImageCategory] {
private static var testImageCategories: [BPKImageGalleryImageCategory<Color, Color>] {
[
BPKImageGalleryImageGridStyle.ImageCategory(
.init(
title: "Green but with very long title indeed (40)",
images: testImages(40, color: .green),
categoryImage: { Color.green }
),
BPKImageGalleryImageGridStyle.ImageCategory(
.init(
title: "Blue photos (10)",
images: testImages(5, color: .blue),
categoryImage: { Color.blue }
),
BPKImageGalleryImageGridStyle.ImageCategory(
.init(
title: "Red photos (10)",
images: testImages(6, color: .red),
categoryImage: { Color.red }
Expand Down
Expand Up @@ -18,36 +18,31 @@

import SwiftUI

public enum BPKImageGalleryImageGridStyle<ImageView: View> {
case chip(_ categories: [ChipCategory])
case image(_ categories: [ImageCategory])
public struct BPKImageGalleryChipCategory<ImageView: View> {
public let title: String
public let images: [BPKImageGalleryImage<ImageView>]

public struct ChipCategory {
public let title: String
public let images: [BPKImageGalleryImage<ImageView>]

public init(
title: String,
images: [BPKImageGalleryImage<ImageView>]
) {
self.title = title
self.images = images
}
public init(
title: String,
images: [BPKImageGalleryImage<ImageView>]
) {
self.title = title
self.images = images
}

public struct ImageCategory {
public let title: String
public let images: [BPKImageGalleryImage<ImageView>]
public let categoryImage: () -> ImageView
}

public struct BPKImageGalleryImageCategory<CategoryImageView: View, ImageView: View> {
public let title: String
public let images: [BPKImageGalleryImage<ImageView>]
public let categoryImage: () -> CategoryImageView

public init(
title: String,
images: [BPKImageGalleryImage<ImageView>],
categoryImage: @escaping () -> ImageView
) {
self.title = title
self.images = images
self.categoryImage = categoryImage
}
public init(
title: String,
images: [BPKImageGalleryImage<ImageView>],
categoryImage: @escaping () -> CategoryImageView
) {
self.title = title
self.images = images
self.categoryImage = categoryImage
}
}
Expand Up @@ -40,7 +40,7 @@ struct ImageGalleryGridExampleView: View {
.bpkImageGalleryGrid(
isPresented: $chipsPresented,
selectedCategory: $selectedCategory,
style: .chip(chipCategories(imageForIndex: image(forIndex:))),
categories: chipCategories(imageForIndex: image(forIndex:)),
closeAccessibilityLabel: "Close Gallery",
onImageTapped: { category, image in
onImageTapped(category: category, image: image)
Expand All @@ -50,7 +50,10 @@ struct ImageGalleryGridExampleView: View {
.bpkImageGalleryGrid(
isPresented: $imagesPresented,
selectedCategory: $selectedCategory,
style: .image(imageCategories(imageForIndex: image(forIndex:))),
categories: imageCategories(
imageForIndex: image(forIndex:),
categoryImageForIndex: image(forIndex:)
),
closeAccessibilityLabel: "Close Gallery",
onImageTapped: { category, image in
onImageTapped(category: category, image: image)
Expand All @@ -72,9 +75,10 @@ struct ImageGalleryGridExampleView: View {
][categoryIndex]
}

private func imageCategories<Image: View>(
imageForIndex: @escaping (Int) -> Image
) -> [BPKImageGalleryImageGridStyle<Image>.ImageCategory] {
private func imageCategories<Category: View, Image: View>(
imageForIndex: @escaping (Int) -> Image,
categoryImageForIndex: @escaping (Int) -> Category
) -> [BPKImageGalleryImageCategory<Category, Image>] {
(0...3)
.map { categoryIndex in
.init(
Expand All @@ -88,15 +92,15 @@ struct ImageGalleryGridExampleView: View {
)
},
categoryImage: {
imageForIndex(categoryIndex)
categoryImageForIndex(categoryIndex)
}
)
}
}

private func chipCategories<Image: View>(
imageForIndex: @escaping (Int) -> Image
) -> [BPKImageGalleryImageGridStyle<Image>.ChipCategory] {
) -> [BPKImageGalleryChipCategory<Image>] {
(0...3).map { categoryIndex in
.init(
title: categoryName(categoryIndex),
Expand Down

0 comments on commit 0615c50

Please sign in to comment.