feat: ios mobil arayüz tasarımı

This commit is contained in:
2026-02-11 18:06:35 +03:00
parent 69884db0ab
commit 261b2f58cc
42 changed files with 2501 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
import Foundation
import SwiftData
import UIKit
@MainActor
final class BookDetailViewModel: ObservableObject {
@Published var book: BookRemote
@Published var isInLibrary = false
init(book: BookRemote) {
self.book = book
}
func refresh(context: ModelContext) {
let all = (try? context.fetch(FetchDescriptor<LibraryBook>())) ?? []
isInLibrary = all.contains(where: { local in
match(local: local, remote: book)
})
}
func toggleLibrary(context: ModelContext) {
let all = (try? context.fetch(FetchDescriptor<LibraryBook>())) ?? []
if let existing = all.first(where: { match(local: $0, remote: book) }) {
context.delete(existing)
isInLibrary = false
UINotificationFeedbackGenerator().notificationOccurred(.warning)
} else {
let local = LibraryBook(
title: book.title,
authorsString: book.authors.joined(separator: ", "),
coverUrlString: book.coverImageUrl?.absoluteString,
isbn10: book.isbn10,
isbn13: book.isbn13,
publishedYear: book.publishedYear,
categoriesString: book.categories.joined(separator: ", "),
summary: book.description,
language: book.language,
sourceLocale: book.sourceLocale,
remotePayloadJson: nil
)
context.insert(local)
isInLibrary = true
UINotificationFeedbackGenerator().notificationOccurred(.success)
}
try? context.save()
}
private func match(local: LibraryBook, remote: BookRemote) -> Bool {
if let lhs = local.isbn13, let rhs = remote.isbn13 { return lhs == rhs }
if let lhs = local.isbn10, let rhs = remote.isbn10 { return lhs == rhs }
return local.title == remote.title
}
}