72 lines
2.1 KiB
Swift
72 lines
2.1 KiB
Swift
//
|
||
// WorkoutLogCardView.swift
|
||
// Workouts
|
||
//
|
||
// Created by rzen on 7/22/25 at 9:56 PM.
|
||
//
|
||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||
//
|
||
|
||
import SwiftUI
|
||
|
||
struct WorkoutLogCardView: View {
|
||
let log: WorkoutLog
|
||
|
||
var body: some View {
|
||
VStack(alignment: .leading, spacing: 8) {
|
||
Text(log.exerciseName)
|
||
.font(.headline)
|
||
.lineLimit(1)
|
||
|
||
Text(getStatusText(for: log))
|
||
.font(.caption)
|
||
.foregroundStyle(Color.accentColor)
|
||
|
||
HStack(spacing: 12) {
|
||
Text("\(log.weight) lbs")
|
||
|
||
Spacer()
|
||
|
||
Text("\(log.sets) × \(log.reps)")
|
||
}
|
||
}
|
||
}
|
||
|
||
private func getStatusText(for log: WorkoutLog) -> String {
|
||
guard let status = log.status else {
|
||
return "Not Started"
|
||
}
|
||
|
||
if status == .inProgress, let currentStateIndex = log.currentStateIndex {
|
||
let currentSet = getCurrentSetNumber(stateIndex: currentStateIndex, totalSets: log.sets)
|
||
if currentSet > 0 {
|
||
return "In Progress, Set #\(currentSet)"
|
||
}
|
||
}
|
||
|
||
return status.name
|
||
}
|
||
|
||
private func getCurrentSetNumber(stateIndex: Int, totalSets: Int) -> Int {
|
||
// Exercise states are structured as: intro(0) → set1(1) → rest1(2) → set2(3) → rest2(4) → ... → done
|
||
// For each set number n, set state index = 2n-1, rest state index = 2n
|
||
|
||
if stateIndex <= 0 {
|
||
return 0 // intro or invalid
|
||
}
|
||
|
||
// Check if we're in a rest state (even indices > 0)
|
||
let isRestState = stateIndex > 0 && stateIndex % 2 == 0
|
||
|
||
if isRestState {
|
||
// During rest, show the next set number
|
||
let nextSetNumber = (stateIndex / 2) + 1
|
||
return min(nextSetNumber, totalSets)
|
||
} else {
|
||
// During set, show current set number
|
||
let currentSetNumber = (stateIndex + 1) / 2
|
||
return min(currentSetNumber, totalSets)
|
||
}
|
||
}
|
||
}
|