Initial commit
This commit is contained in:
72
WhiteNights/AppState.swift
Normal file
72
WhiteNights/AppState.swift
Normal 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
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user