|
@@ -1,13 +1,12 @@
|
|
|
"use client";
|
|
|
|
|
|
import { useState, useEffect } from "react";
|
|
|
-import { Clock, Play, Pause, RotateCcw, X, Target, Weight } from "lucide-react";
|
|
|
+import { X, Target, Weight } from "lucide-react";
|
|
|
|
|
|
import { useCurrentLocale, useI18n } from "locales/client";
|
|
|
import { type WeightUnit } from "@/shared/lib/weight-conversion";
|
|
|
import { cn } from "@/shared/lib/utils";
|
|
|
import { useWorkoutSession } from "@/features/workout-session/model/use-workout-session";
|
|
|
-import { Timer } from "@/components/ui/timer";
|
|
|
import { Button } from "@/components/ui/button";
|
|
|
|
|
|
import { QuitWorkoutDialog } from "../../workout-builder/ui/quit-workout-dialog";
|
|
@@ -60,14 +59,9 @@ export function WorkoutSessionHeader({
|
|
|
setShowQuitDialog(false);
|
|
|
};
|
|
|
|
|
|
- const handleReset = () => {
|
|
|
- onResetTimer();
|
|
|
- setResetCount((c) => c + 1);
|
|
|
- };
|
|
|
-
|
|
|
return (
|
|
|
<>
|
|
|
- <div className="w-full mt-4 mb-8 px-2 sm:px-6">
|
|
|
+ <div className="w-full mt-4 mb-12 px-2 sm:px-6">
|
|
|
<div className="rounded-xl p-3 bg-slate-50 dark:bg-slate-900/80 border border-slate-200 dark:border-slate-700">
|
|
|
<div className="flex items-center justify-between mb-4">
|
|
|
<div className="flex items-center gap-2">
|
|
@@ -87,65 +81,27 @@ export function WorkoutSessionHeader({
|
|
|
</Button>
|
|
|
</div>
|
|
|
|
|
|
- <div className="grid grid-cols-1 sm:grid-cols-3 gap-3">
|
|
|
- {/* Card 1: elapsed time */}
|
|
|
- <div className="bg-white dark:bg-slate-800 rounded-lg p-3 border border-slate-200 dark:border-slate-700 transition-colors duration-200 dark:text-white dark:hover:bg-slate-700">
|
|
|
- <div className="flex items-center gap-2 mb-2">
|
|
|
- <div className="w-8 h-8 rounded-full bg-blue-500/20 flex items-center justify-center">
|
|
|
- <Clock className="h-4 w-4 text-blue-400" />
|
|
|
- </div>
|
|
|
- <div>
|
|
|
- <h3 className="text-slate-700 dark:text-white font-semibold text-base">{t("workout_builder.session.chronometer")}</h3>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div className="text-center">
|
|
|
- <div className="text-2xl font-mono font-bold text-slate-900 dark:text-white mb-2 tracking-wider">
|
|
|
- <Timer initialSeconds={typeof elapsedTime === "number" ? elapsedTime : 0} isRunning={isTimerRunning} key={resetCount} />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div className="flex items-center justify-center gap-2">
|
|
|
- <Button
|
|
|
- className={cn(
|
|
|
- "w-8 h-8 rounded-full p-0 text-white",
|
|
|
- isTimerRunning ? "bg-amber-500 hover:bg-amber-600" : "bg-emerald-500 hover:bg-emerald-600",
|
|
|
- )}
|
|
|
- onClick={onToggleTimer}
|
|
|
- >
|
|
|
- {isTimerRunning ? <Pause className="h-4 w-4" /> : <Play className="h-4 w-4" />}
|
|
|
- </Button>
|
|
|
-
|
|
|
- <Button
|
|
|
- className="w-8 h-8 rounded-full p-0 border-slate-200 text-slate-400 hover:bg-slate-200 dark:border-slate-600 hover:dark:bg-slate-700"
|
|
|
- onClick={handleReset}
|
|
|
- variant="outline"
|
|
|
- >
|
|
|
- <RotateCcw className="h-4 w-4" />
|
|
|
- </Button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
+ <div className="grid grid-cols-2 sm:grid-cols-3 gap-2 sm:gap-3">
|
|
|
{/* Card 2: progress */}
|
|
|
- <div className="bg-white dark:bg-slate-800 rounded-lg p-3 border border-slate-200 dark:border-slate-700 transition-colors duration-200 dark:text-white dark:hover:bg-slate-700">
|
|
|
- <div className="flex items-center gap-2 mb-2">
|
|
|
- <div className="w-8 h-8 rounded-full bg-purple-500/20 flex items-center justify-center">
|
|
|
- <Target className="h-4 w-4 text-purple-400" />
|
|
|
+ <div className="bg-white dark:bg-slate-800 rounded-lg p-2 sm:p-3 border border-slate-200 dark:border-slate-700 transition-colors duration-200 dark:text-white dark:hover:bg-slate-700">
|
|
|
+ <div className="flex items-center gap-1.5 sm:gap-2 mb-1.5 sm:mb-2">
|
|
|
+ <div className="w-6 h-6 sm:w-8 sm:h-8 rounded-full bg-purple-500/20 flex items-center justify-center">
|
|
|
+ <Target className="h-3 w-3 sm:h-4 sm:w-4 text-purple-400" />
|
|
|
</div>
|
|
|
<div>
|
|
|
- <h3 className="text-slate-700 dark:text-white font-semibold text-base">
|
|
|
+ <h3 className="text-slate-700 dark:text-white font-semibold text-sm sm:text-base">
|
|
|
{t("workout_builder.session.exercise_progress")}
|
|
|
</h3>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div className="space-y-2">
|
|
|
+ <div className="space-y-1.5 sm:space-y-2">
|
|
|
<div className="flex items-center justify-between">
|
|
|
- <span className="text-lg font-bold text-slate-900 dark:text-white">{exercisesCompleted}</span>
|
|
|
+ <span className="text-base sm:text-lg font-bold text-slate-900 dark:text-white">{exercisesCompleted}</span>
|
|
|
<span className="text-slate-400 dark:text-slate-400">/ {totalExercises}</span>
|
|
|
</div>
|
|
|
|
|
|
- <div className="w-full bg-slate-200 dark:bg-slate-700 rounded-full h-2 overflow-hidden">
|
|
|
+ <div className="w-full bg-slate-200 dark:bg-slate-700 rounded-full h-1.5 sm:h-2 overflow-hidden">
|
|
|
<div
|
|
|
className="h-full bg-gradient-to-r from-purple-500 to-pink-500 transition-all duration-500 ease-out"
|
|
|
style={{ width: `${(exercisesCompleted / totalExercises) * 100}%` }}
|
|
@@ -161,24 +117,26 @@ export function WorkoutSessionHeader({
|
|
|
</div>
|
|
|
|
|
|
{/* Card 3: Volume Total */}
|
|
|
- <div className="bg-white dark:bg-slate-800 rounded-lg p-3 border border-slate-200 dark:border-slate-700 transition-colors duration-200 dark:text-white dark:hover:bg-slate-700">
|
|
|
- <div className="flex items-center gap-2 mb-2">
|
|
|
- <div className="w-8 h-8 rounded-full bg-orange-500/20 flex items-center justify-center">
|
|
|
- <Weight className="h-4 w-4 text-orange-400" />
|
|
|
+ <div className="bg-white dark:bg-slate-800 rounded-lg p-2 sm:p-3 border border-slate-200 dark:border-slate-700 transition-colors duration-200 dark:text-white dark:hover:bg-slate-700">
|
|
|
+ <div className="flex items-center gap-1.5 sm:gap-2 mb-1.5 sm:mb-2">
|
|
|
+ <div className="w-6 h-6 sm:w-8 sm:h-8 rounded-full bg-orange-500/20 flex items-center justify-center">
|
|
|
+ <Weight className="h-3 w-3 sm:h-4 sm:w-4 text-orange-400" />
|
|
|
</div>
|
|
|
<div>
|
|
|
- <h3 className="text-slate-700 dark:text-white font-semibold text-base">{t("workout_builder.session.total_volume")}</h3>
|
|
|
+ <h3 className="text-slate-700 dark:text-white font-semibold text-sm sm:text-base">
|
|
|
+ {t("workout_builder.session.total_volume")}
|
|
|
+ </h3>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div className="text-center">
|
|
|
- <div className="text-2xl font-bold text-slate-900 dark:text-white mb-1">
|
|
|
+ <div className="text-xl sm:text-2xl font-bold text-slate-900 dark:text-white mb-1">
|
|
|
{totalVolume.toFixed(volumeUnit === "lbs" ? 1 : 0)}
|
|
|
</div>
|
|
|
<div className="flex items-center justify-center gap-1">
|
|
|
<button
|
|
|
className={cn(
|
|
|
- "text-xs px-2 py-1 rounded transition-colors",
|
|
|
+ "text-xs px-1.5 sm:px-2 py-0.5 sm:py-1 rounded transition-colors",
|
|
|
volumeUnit === "kg"
|
|
|
? "bg-orange-100 text-orange-700 dark:bg-orange-900 dark:text-orange-100"
|
|
|
: "text-slate-400 hover:text-slate-600 dark:hover:text-slate-300",
|
|
@@ -190,7 +148,7 @@ export function WorkoutSessionHeader({
|
|
|
<span className="text-slate-300 dark:text-slate-600">|</span>
|
|
|
<button
|
|
|
className={cn(
|
|
|
- "text-xs px-2 py-1 rounded transition-colors",
|
|
|
+ "text-xs px-1.5 sm:px-2 py-0.5 sm:py-1 rounded transition-colors",
|
|
|
volumeUnit === "lbs"
|
|
|
? "bg-orange-100 text-orange-700 dark:bg-orange-900 dark:text-orange-100"
|
|
|
: "text-slate-400 hover:text-slate-600 dark:hover:text-slate-300",
|