// // Miniplayer.swift // WorkoutsPlus // // Created by Felix Förtsch on 07.09.24. // import SwiftUI import SwiftData // Maybe: https://github.com/LeoNatan/LNPopupController/tree/master // TODO:The Miniplayer is the same view that we use for the Live Activity // .safeAreaInset(edge: .bottom) { } struct MiniPlayer: View { @Default(\.isWorkingOut) var isWorkingOut // @Query private var workouts: [Workout] @State private var isFullScreenCoverPresented = false @State private var workout = Workout.sampleData @State private var workoutSession: WorkoutSession? var body: some View { Group { if (isWorkingOut) { Button(action: { withAnimation() { isFullScreenCoverPresented.toggle() }}) { HStack { VStack(alignment: .leading) { Text("8x Push-ups") .font(.headline) Text("Recommended Routine - 35 minutes") .font(.subheadline) .foregroundColor(.secondary) } Spacer() // TODO: Maybe replace it with a clock Button(action: { withAnimation() { // TODO: This button has to do something with the workout (pause it, next exercise, etc) }}) { Image(systemName: "pause.circle.fill") .font(.title) .symbolRenderingMode(.palette) .foregroundStyle(.white, .orange) } } .padding() } .buttonStyle(.plain) .fullScreenCover(isPresented: $isFullScreenCoverPresented) { // ActiveWorkoutSession(workout: workout, workoutSession: workoutSession) } } else { Button(action: { withAnimation() { isFullScreenCoverPresented.toggle() }}) { HStack { VStack(alignment: .leading) { Text("Start Workout") .font(.headline) // TODO: Replace this with the upcoming/planned workout // Text(selectedWorkoutId) // .font(.subheadline) // .foregroundColor(.secondary) } Spacer() Button(action: { withAnimation() { // TODO: This button "quick starts" the workout (skips over the ActiveWorkoutSession fullscreen cover) // if let workoutId = selectedWorkoutId { // If you selectedWorkoutId is set, get the corresponding workout. This idea is generally okay, but feels off (DRY?) // workout = workouts.filter({ $0.id == UUID(uuidString: workoutId) }).first // } }}) { Image(systemName: "play.circle.fill") .font(.title) .symbolRenderingMode(.palette) .foregroundStyle(.white, .green) } } .padding() } .buttonStyle(.plain) .fullScreenCover(isPresented: $isFullScreenCoverPresented) { // ActiveWorkoutSession(workout: workout, workoutSession: workoutSession) } } } .padding() .frame(maxWidth: .infinity, maxHeight: 60) .background(Color(.secondarySystemBackground)) .cornerRadius(12) .shadow(radius: 10) .padding(.horizontal) // .padding(.bottom, 65) } } #Preview { ZStack(alignment: .bottom) { TabView { List { Button(action: { Defaults.shared.isWorkingOut.toggle() }) { Text("Toggle") } ForEach(0..<20) { _ in Text("An item") } } .tabItem { Image(systemName: "calendar.badge.clock") Text("Plans & Goals") } Text("Dummy") .tabItem { Image(systemName: "calendar.badge.clock") Text("Plans & Goals") } } } .safeAreaInset(edge: .bottom) { MiniPlayer() .onAppear { Defaults.shared.isWorkingOut = false } } }