87 lines
3.2 KiB
Swift
87 lines
3.2 KiB
Swift
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
|
||
}
|
||
}
|