Initial commit
This commit is contained in:
108
WhiteNights/Widgets/RouteView.swift
Normal file
108
WhiteNights/Widgets/RouteView.swift
Normal file
@ -0,0 +1,108 @@
|
||||
import SwiftUI
|
||||
|
||||
struct RouteView: View {
|
||||
@EnvironmentObject var appState: AppState
|
||||
|
||||
@State private var firstStationName: String = "Загрузка..."
|
||||
@State private var lastStationName: String = "Загрузка..."
|
||||
@State private var engStationsName: 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: engStationsName,
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Fetch Stations
|
||||
private func fetchStations(forRoute routeID: Int) async {
|
||||
firstStationName = "Загрузка..."
|
||||
lastStationName = "Загрузка..."
|
||||
engStationsName = "Loading..."
|
||||
|
||||
guard let url = URL(string: "https://white-nights.krbl.ru/services/content/route/\(routeID)/station"),
|
||||
let urlEng = URL(string: "https://white-nights.krbl.ru/services/content/route/\(routeID)/station?lang=en") else { return }
|
||||
|
||||
do {
|
||||
let (data, _) = try await URLSession.shared.data(from: url)
|
||||
let (dataEn, _) = try await URLSession.shared.data(from: urlEng)
|
||||
|
||||
let stations = try JSONDecoder().decode([Station].self, from: data)
|
||||
let stationsEn = try JSONDecoder().decode([Station].self, from: dataEn)
|
||||
|
||||
if let firstStation = stations.first { firstStationName = firstStation.name }
|
||||
if let lastStation = stations.last { lastStationName = lastStation.name }
|
||||
|
||||
let firstStationEn = stationsEn.first?.name ?? "Loading..."
|
||||
let lastStationEn = stationsEn.last?.name ?? "Loading..."
|
||||
engStationsName = "\(firstStationEn) - \(lastStationEn)"
|
||||
|
||||
} catch {
|
||||
print("Ошибка загрузки станций: \(error)")
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user