Initial commit

This commit is contained in:
15lu.akari
2025-08-24 14:44:50 +03:00
parent dca1ae410b
commit 5a583d9415
50 changed files with 2019 additions and 17 deletions

View File

@ -0,0 +1,72 @@
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
}
}