Files
WhiteNights_iOS/WhiteNights/AppState.swift
15lu.akari a87a3d12ab big update
2025-08-26 23:37:39 +03:00

87 lines
3.2 KiB
Swift
Raw Permalink 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] = [] // все достопримечательности маршрута
@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
}
}