114 lines
3.1 KiB
Swift
114 lines
3.1 KiB
Swift
import SwiftUI
|
|
|
|
struct ContentView: View {
|
|
@StateObject private var dataManager = ClimbingDataManager()
|
|
@State private var selectedTab = 0
|
|
@Environment(\.scenePhase) private var scenePhase
|
|
|
|
var body: some View {
|
|
TabView(selection: $selectedTab) {
|
|
SessionsView()
|
|
.tabItem {
|
|
Image(systemName: "play.fill")
|
|
Text("Sessions")
|
|
}
|
|
.tag(0)
|
|
|
|
ProblemsView()
|
|
.tabItem {
|
|
Image(systemName: "star.fill")
|
|
Text("Problems")
|
|
}
|
|
.tag(1)
|
|
|
|
AnalyticsView()
|
|
.tabItem {
|
|
Image(systemName: "chart.bar.fill")
|
|
Text("Analytics")
|
|
}
|
|
.tag(2)
|
|
|
|
GymsView()
|
|
.tabItem {
|
|
Image(systemName: "location.fill")
|
|
Text("Gyms")
|
|
}
|
|
.tag(3)
|
|
|
|
SettingsView()
|
|
.tabItem {
|
|
Image(systemName: "gear")
|
|
Text("Settings")
|
|
}
|
|
.tag(4)
|
|
}
|
|
.environmentObject(dataManager)
|
|
.onChange(of: scenePhase) {
|
|
if scenePhase == .active {
|
|
dataManager.onAppBecomeActive()
|
|
}
|
|
}
|
|
.overlay(alignment: .top) {
|
|
if let message = dataManager.successMessage {
|
|
SuccessMessageView(message: message)
|
|
.transition(.move(edge: .top).combined(with: .opacity))
|
|
.animation(.easeInOut, value: dataManager.successMessage)
|
|
}
|
|
|
|
if let error = dataManager.errorMessage {
|
|
ErrorMessageView(message: error)
|
|
.transition(.move(edge: .top).combined(with: .opacity))
|
|
.animation(.easeInOut, value: dataManager.errorMessage)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct SuccessMessageView: View {
|
|
let message: String
|
|
|
|
var body: some View {
|
|
HStack {
|
|
Image(systemName: "checkmark.circle.fill")
|
|
.foregroundColor(.green)
|
|
Text(message)
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
}
|
|
.padding()
|
|
.background(
|
|
RoundedRectangle(cornerRadius: 12)
|
|
.fill(.regularMaterial)
|
|
.shadow(radius: 4)
|
|
)
|
|
.padding(.horizontal)
|
|
.padding(.top, 8)
|
|
}
|
|
}
|
|
|
|
struct ErrorMessageView: View {
|
|
let message: String
|
|
|
|
var body: some View {
|
|
HStack {
|
|
Image(systemName: "exclamationmark.triangle.fill")
|
|
.foregroundColor(.red)
|
|
Text(message)
|
|
.font(.subheadline)
|
|
.foregroundColor(.primary)
|
|
}
|
|
.padding()
|
|
.background(
|
|
RoundedRectangle(cornerRadius: 12)
|
|
.fill(.regularMaterial)
|
|
.shadow(radius: 4)
|
|
)
|
|
.padding(.horizontal)
|
|
.padding(.top, 8)
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
ContentView()
|
|
}
|