import Foundation import SwiftUI @MainActor class AppState: ObservableObject { @Published var selectedRoute: Route? = nil { didSet { if let routeId = selectedRoute?.id { Task { await fetchSights(for: routeId) } } else { self.sights = [] self.sightId = nil } } } @Published var allRoutes: [Route] = [] @Published var sightId: Int? = nil @Published var sights: [SightModel] = [] // <- все достопримечательности маршрута // MARK: - Fetch Sights private func fetchSights(for routeId: Int) async { let urlString = "https://white-nights.krbl.ru/services/content/route/\(routeId)/sight" guard let url = URL(string: urlString) else { return } do { let (data, _) = try await URLSession.shared.data(from: url) let decodedSights = try JSONDecoder().decode([SightModel].self, from: data) DispatchQueue.main.async { self.sights = decodedSights self.sightId = decodedSights.first?.id } // 🔹 Предзагрузка миниатюр preloadThumbnails(for: decodedSights) } catch { print("Ошибка загрузки достопримечательностей: \(error)") DispatchQueue.main.async { self.sights = [] self.sightId = nil } } } // MARK: - Preload thumbnails into URLCache private func preloadThumbnails(for sights: [SightModel]) { let session = URLSession.shared for sight in sights { guard let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(sight.thumbnail)/download") else { continue } let request = URLRequest(url: url) // Если уже в кэше, пропускаем if URLCache.shared.cachedResponse(for: request) != nil { continue } let task = session.dataTask(with: request) { data, response, _ in guard let data = data, let response = response else { return } let cachedResponse = CachedURLResponse(response: response, data: data) URLCache.shared.storeCachedResponse(cachedResponse, for: request) } task.resume() } } // Optional computed property var routeId: Int? { selectedRoute?.id } }