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] = [] // все достопримечательности маршрута @Published var selectedLanguage: String = "ru" { didSet { // если язык поменялся и маршрут уже выбран, перезагружаем достопримечательности if let routeId = selectedRoute?.id { Task { await fetchSights(for: routeId) } } } } // язык с начальным значением "ru" // MARK: - Fetch Sights private func fetchSights(for routeId: Int) async { // Добавляем параметр выбранного языка let urlString = "https://white-nights.krbl.ru/services/content/route/\(routeId)/sight?lang=\(selectedLanguage)" 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?lang=\(selectedLanguage)") 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 } }