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() }