40 lines
1.3 KiB
Swift
40 lines
1.3 KiB
Swift
import Foundation
|
|
|
|
@MainActor
|
|
final class CategoryViewModel: ObservableObject {
|
|
enum SortOption: String, CaseIterable {
|
|
case recentlyAdded = "Recently Added"
|
|
case titleAZ = "Title A-Z"
|
|
case author = "Author"
|
|
}
|
|
|
|
let categoryName: String
|
|
@Published var searchText = ""
|
|
@Published var sortOption: SortOption = .recentlyAdded
|
|
|
|
init(categoryName: String) {
|
|
self.categoryName = categoryName
|
|
}
|
|
|
|
func books(from allBooks: [LibraryBook]) -> [LibraryBook] {
|
|
var filtered = allBooks.filter { $0.categories.contains(categoryName) || (categoryName == "Design" && $0.categories.isEmpty) }
|
|
|
|
if !searchText.isEmpty {
|
|
filtered = filtered.filter {
|
|
$0.title.localizedCaseInsensitiveContains(searchText)
|
|
|| $0.authorsString.localizedCaseInsensitiveContains(searchText)
|
|
}
|
|
}
|
|
|
|
switch sortOption {
|
|
case .recentlyAdded:
|
|
filtered.sort { $0.dateAdded > $1.dateAdded }
|
|
case .titleAZ:
|
|
filtered.sort { $0.title.localizedCaseInsensitiveCompare($1.title) == .orderedAscending }
|
|
case .author:
|
|
filtered.sort { $0.authorsString.localizedCaseInsensitiveCompare($1.authorsString) == .orderedAscending }
|
|
}
|
|
return filtered
|
|
}
|
|
}
|