148 lines
7.0 KiB
Swift
148 lines
7.0 KiB
Swift
import SwiftUI
|
||
|
||
struct RouteView: View {
|
||
@EnvironmentObject var appState: AppState
|
||
|
||
@State private var firstStationName: String = "Загрузка..."
|
||
@State private var lastStationName: String = "Загрузка..."
|
||
@State private var stationsRangeName: String = "Загрузка..."
|
||
|
||
private var topBackgroundColor = Color(hex: 0xFCD500)
|
||
|
||
var body: some View {
|
||
NavigationLink(destination: RouteSelectionView()) {
|
||
GeometryReader { geo in
|
||
VStack(spacing: 0) {
|
||
|
||
// Верхняя половина: номер маршрута
|
||
VStack {
|
||
if let route = appState.selectedRoute {
|
||
Text("\(route.routeNumber)")
|
||
.font(.system(size: 36, weight: .black))
|
||
.foregroundColor(.black)
|
||
.multilineTextAlignment(.center)
|
||
.frame(maxHeight: .infinity, alignment: .center)
|
||
}
|
||
}
|
||
.frame(height: geo.size.height / 2)
|
||
.frame(maxWidth: .infinity)
|
||
.background(topBackgroundColor)
|
||
.cornerRadius(16, corners: [.topLeft, .topRight])
|
||
|
||
// Нижняя половина: станции
|
||
VStack(spacing: 0) {
|
||
MarqueeText(
|
||
text: firstStationName,
|
||
font: .headline.bold(),
|
||
foregroundColor: .white
|
||
)
|
||
MarqueeText(
|
||
text: lastStationName,
|
||
font: .headline.bold(),
|
||
foregroundColor: .white
|
||
)
|
||
MarqueeText(
|
||
text: stationsRangeName,
|
||
font: .caption,
|
||
foregroundColor: .white.opacity(0.5)
|
||
)
|
||
}
|
||
.padding(10)
|
||
.frame(height: geo.size.height / 2)
|
||
.frame(maxWidth: .infinity)
|
||
.background(
|
||
ZStack {
|
||
Color(hex: 0x806C59)
|
||
LinearGradient(
|
||
stops: [
|
||
.init(color: .white.opacity(0.0), location: 0.0871),
|
||
.init(color: .white.opacity(0.16), location: 0.6969)
|
||
],
|
||
startPoint: .bottomLeading,
|
||
endPoint: .topTrailing
|
||
)
|
||
}
|
||
)
|
||
.cornerRadius(16, corners: [.bottomLeft, .bottomRight])
|
||
}
|
||
}
|
||
.aspectRatio(1, contentMode: .fit)
|
||
.shadow(color: Color.black.opacity(0.10), radius: 8, x: 0, y: 2)
|
||
}
|
||
.buttonStyle(.plain)
|
||
.onChange(of: appState.selectedRoute?.id) { newRouteID in
|
||
guard let routeID = newRouteID else { return }
|
||
Task {
|
||
await fetchStations(forRoute: routeID)
|
||
}
|
||
}
|
||
.onChange(of: appState.selectedLanguage) { _ in
|
||
if let routeID = appState.selectedRoute?.id {
|
||
Task {
|
||
await fetchStations(forRoute: routeID)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// MARK: - Fetch Stations
|
||
private func fetchStations(forRoute routeID: Int) async {
|
||
// текст загрузки
|
||
switch appState.selectedLanguage {
|
||
case "ru":
|
||
firstStationName = "Загрузка..."
|
||
lastStationName = "Загрузка..."
|
||
stationsRangeName = "Loading..."
|
||
case "zh":
|
||
firstStationName = "正在加载..."
|
||
lastStationName = "正在加载..."
|
||
stationsRangeName = "正在加载..."
|
||
default:
|
||
firstStationName = "Loading..."
|
||
lastStationName = "Loading..."
|
||
stationsRangeName = "Loading..."
|
||
}
|
||
|
||
do {
|
||
// Загружаем станции на русском для диапазона
|
||
guard let urlRu = URL(string: "https://white-nights.krbl.ru/services/content/route/\(routeID)/station?lang=ru") else { return }
|
||
let (dataRu, _) = try await URLSession.shared.data(from: urlRu)
|
||
let stationsRu = try JSONDecoder().decode([Station].self, from: dataRu)
|
||
|
||
// Загружаем станции на английском для диапазона
|
||
guard let urlEn = URL(string: "https://white-nights.krbl.ru/services/content/route/\(routeID)/station?lang=en") else { return }
|
||
let (dataEn, _) = try await URLSession.shared.data(from: urlEn)
|
||
let stationsEn = try JSONDecoder().decode([Station].self, from: dataEn)
|
||
|
||
// Загружаем станции на языке интерфейса для отображения first/last
|
||
let langCode = appState.selectedLanguage
|
||
guard let urlCurrent = URL(string: "https://white-nights.krbl.ru/services/content/route/\(routeID)/station?lang=\(langCode)") else { return }
|
||
let (dataCurrent, _) = try await URLSession.shared.data(from: urlCurrent)
|
||
let stationsCurrent = try JSONDecoder().decode([Station].self, from: dataCurrent)
|
||
|
||
// Устанавливаем first и last на текущем языке интерфейса
|
||
if let first = stationsCurrent.first { firstStationName = first.name }
|
||
if let last = stationsCurrent.last { lastStationName = last.name }
|
||
|
||
// Диапазон станций
|
||
if appState.selectedLanguage == "ru" {
|
||
// для русского языка диапазон на английском
|
||
let firstEn = stationsEn.first?.name ?? ""
|
||
let lastEn = stationsEn.last?.name ?? ""
|
||
stationsRangeName = "\(firstEn) - \(lastEn)"
|
||
} else {
|
||
// для всех остальных языков диапазон на русском
|
||
let firstRu = stationsRu.first?.name ?? ""
|
||
let lastRu = stationsRu.last?.name ?? ""
|
||
stationsRangeName = "\(firstRu) - \(lastRu)"
|
||
}
|
||
|
||
} catch {
|
||
print("Ошибка загрузки станций: \(error)")
|
||
firstStationName = appState.selectedLanguage == "ru" ? "Ошибка загрузки" : appState.selectedLanguage == "zh" ? "加载失败" : "Failed to load"
|
||
lastStationName = appState.selectedLanguage == "ru" ? "Ошибка загрузки" : appState.selectedLanguage == "zh" ? "加载失败" : "Failed to load"
|
||
stationsRangeName = appState.selectedLanguage == "ru" ? "Ошибка загрузки" : appState.selectedLanguage == "zh" ? "加载失败" : "Failed to load"
|
||
}
|
||
}
|
||
}
|