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

148 lines
7.0 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 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"
}
}
}