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" } } }