feat: ios mobil arayüz tasarımı
This commit is contained in:
61
ios/Bookibra/ViewModels/HomeViewModel.swift
Normal file
61
ios/Bookibra/ViewModels/HomeViewModel.swift
Normal file
@@ -0,0 +1,61 @@
|
||||
import Foundation
|
||||
import SwiftUI
|
||||
|
||||
struct ShelfCategory: Identifiable {
|
||||
let id: String
|
||||
let name: String
|
||||
let books: [BookRemote]
|
||||
}
|
||||
|
||||
@MainActor
|
||||
final class HomeViewModel: ObservableObject {
|
||||
@Published var categories: [ShelfCategory] = []
|
||||
|
||||
func refresh(from localBooks: [LibraryBook]) {
|
||||
var map: [String: [BookRemote]] = [:]
|
||||
for local in localBooks {
|
||||
let targets = local.categories.isEmpty ? ["Design"] : local.categories
|
||||
let remote = Self.makeRemote(from: local)
|
||||
for name in targets {
|
||||
map[name, default: []].append(remote)
|
||||
}
|
||||
}
|
||||
|
||||
let preferred = ["Design", "Psychology", "Novels"]
|
||||
var built = preferred.map { name in
|
||||
ShelfCategory(id: name, name: name, books: map[name] ?? [])
|
||||
}
|
||||
|
||||
let extras = map.keys
|
||||
.filter { !preferred.contains($0) }
|
||||
.sorted()
|
||||
.map { ShelfCategory(id: $0, name: $0, books: map[$0] ?? []) }
|
||||
built.append(contentsOf: extras)
|
||||
|
||||
categories = built
|
||||
}
|
||||
|
||||
func gradient(for name: String) -> LinearGradient {
|
||||
switch name.lowercased() {
|
||||
case "design": return Theme.designShelf
|
||||
case "psychology": return Theme.psychologyShelf
|
||||
case "novels": return Theme.novelsShelf
|
||||
default: return Theme.novelsShelf
|
||||
}
|
||||
}
|
||||
|
||||
private static func makeRemote(from local: LibraryBook) -> BookRemote {
|
||||
BookRemote(
|
||||
title: local.title,
|
||||
authors: local.authors,
|
||||
publishedYear: local.publishedYear,
|
||||
isbn10: local.isbn10,
|
||||
isbn13: local.isbn13,
|
||||
coverImageUrl: local.coverUrlString.flatMap(URL.init(string:)),
|
||||
language: local.language,
|
||||
description: local.summary,
|
||||
categories: local.categories,
|
||||
sourceLocale: local.sourceLocale
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user