"use client" import { useState, useEffect } from "react" import { useHistory, useParams } from "react-router-dom" import BottomNavigation from "../components/BottomNavigation" import { getRouteCourseComplete } from "../shared/consts/router" import HeaderNav from "../components/HeaderNav" import video from "../assets/img/video.mov" import { connect } from "../confconnect" export interface Exercise { id: number title: string desc: string url_file: string url_file_img: string time: string repeats: number count: number position: number day: number sessionname: string } interface RouteParams { courseId: string exerciseId: string } export const Exercise = () => { const history = useHistory() const { courseId, exerciseId } = useParams() const [exercise, setExercise] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState("") const [isPlaying, setIsPlaying] = useState(false) const [currentTime, setCurrentTime] = useState(0) const [totalTime, setTotalTime] = useState(900) // Default 15 minutes const [currentSet, setCurrentSet] = useState(1) const [totalSets, setTotalSets] = useState(3) useEffect(() => { console.log("Course ID:", courseId) console.log("Exercise ID:", exerciseId) if (!courseId || !exerciseId) { setError("ID курса или упражнения не найден") setLoading(false) return } // Получаем данные упражнения через API: GET /pacient/:course_id/:exercise_id connect .get(`pacient/${courseId}/${exerciseId}`) .then((response) => { console.log("Response status:", response.status) console.log("Response data:", response.data) const exerciseData = response.data setExercise({ id: exerciseData.id, title: exerciseData.title, desc: exerciseData.desc, url_file: exerciseData.url_file, url_file_img: exerciseData.url_file_img, time: exerciseData.time, repeats: exerciseData.repeats, count: exerciseData.count, position: exerciseData.position, day: exerciseData.day, sessionname: exerciseData.sessionname, }) // Устанавливаем время и подходы из данных упражнения if (exerciseData.time) { setTotalTime(Number.parseInt(exerciseData.time) * 60) // Конвертируем минуты в секунды } if (exerciseData.count) { setTotalSets(exerciseData.count) } setLoading(false) }) .catch((error) => { console.error("Ошибка при получении упражнения:", error) if (error.response) { console.error("Ошибка ответа сервера:", error.response.status, error.response.data) setError(`Ошибка сервера: ${error.response.status}`) } else if (error.request) { console.error("Нет ответа от сервера:", error.request) setError("Нет ответа от сервера") } else { console.error("Ошибка при настройке запроса:", error.message) setError(`Ошибка: ${error.message}`) } setLoading(false) }) }, [courseId, exerciseId]) useEffect(() => { let interval: NodeJS.Timeout | undefined if (isPlaying) { interval = setInterval(() => { setCurrentTime((prev) => { if (prev >= totalTime) { setIsPlaying(false) // Отправляем результат на сервер при завершении submitProgress() // Show completion animation history.push(getRouteCourseComplete()) return totalTime } return prev + 1 }) }, 1000) } return () => { if (interval) clearInterval(interval) } }, [isPlaying, totalTime, history]) // Функция для отправки прогресса на сервер const submitProgress = async () => { if (!courseId || !exerciseId) return try { const timeUsers = formatTime(currentTime) // Отправляем время в формате MM:SS await connect.post(`pacient/${courseId}/${exerciseId}`, { time_users: timeUsers, }) console.log("Прогресс отправлен на сервер:", timeUsers) } catch (error) { console.error("Ошибка при отправке прогресса:", error) } } const formatTime = (seconds: number) => { const mins = Math.floor(seconds / 60) const secs = seconds % 60 return `${mins.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}` } const progress = (currentTime / totalTime) * 100 const PlayIcon = () => ( ) const PauseIcon = () => ( ) const RefreshIcon = () => ( ) const CheckIcon = () => ( ) // Генерируем инструкции на основе реальных данных упражнения const exerciseSteps = [ { title: "Описание упражнения", description: exercise?.desc || "Выполните упражнение согласно инструкции.", }, { title: "Продолжительность", description: `Время выполнения: ${exercise?.time || 15} минут`, }, { title: "Подходы и повторения", description: `Выполните ${exercise?.count || 1} подход по ${exercise?.repeats || 12} повторений с отдыхом 60 секунд между подходами.`, }, { title: "Позиция в программе", description: `Это упражнение №${exercise?.position || 1} в программе дня ${exercise?.day || 1}.`, }, { title: "Техника безопасности", description: "Следите за правильной техникой выполнения. При появлении боли немедленно прекратите упражнение.", }, ] if (loading) { return (

Загрузка упражнения...

) } if (error) { return (

{error}

) } if (!exercise) { return (

Упражнение не найдено

) } return (
{exercise.title}
{isPlaying && (
Выполнение
)}
{formatTime(currentTime)}
{exerciseSteps.map((step, index) => (

{step.title}

{step.description}

))}
{/* Fixed Timer at Bottom */}
Подход {currentSet} из {totalSets}
{formatTime(currentTime)} / {formatTime(totalTime)}
) }