Files
WhiteNights_iOS/WhiteNights/AppState.swift
2025-08-24 14:44:50 +03:00

73 lines
2.6 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}