import Foundation import ManaCore import Observation /// Holt Explore-Daten und Browse-Resultate. Browse hat einen aktuellen /// Query-/Sort-State; bei Änderung wird neu gefetcht. @MainActor @Observable final class MarketplaceStore { private(set) var featured: [PublicDeckEntry] = [] private(set) var trending: [PublicDeckEntry] = [] private(set) var browseResults: [PublicDeckEntry] = [] private(set) var isLoadingExplore = false private(set) var isLoadingBrowse = false private(set) var errorMessage: String? var browseQuery: String = "" var browseSort: MarketplaceSort = .recent var browseLanguage: String? private let api: CardsAPI init(auth: AuthClient) { api = CardsAPI(auth: auth) } func loadExplore() async { isLoadingExplore = true errorMessage = nil defer { isLoadingExplore = false } do { let res = try await api.explore() featured = res.featured trending = res.trending } catch { let message = (error as? LocalizedError)?.errorDescription ?? String(describing: error) errorMessage = message Log.api.error("Explore failed: \(message, privacy: .public)") } } func browse() async { isLoadingBrowse = true errorMessage = nil defer { isLoadingBrowse = false } do { let res = try await api.browseMarketplace( query: browseQuery, sort: browseSort, language: browseLanguage ) browseResults = res.items } catch { errorMessage = (error as? LocalizedError)?.errorDescription ?? String(describing: error) } } }