From cf9803ef6ff4f76b492ce3bb392f0604fd977f91 Mon Sep 17 00:00:00 2001 From: Tatyana Date: Wed, 3 Sep 2025 16:21:22 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Exercise.tsx | 162 ++++++++++++++++++++++++----------------- 1 file changed, 94 insertions(+), 68 deletions(-) diff --git a/src/pages/Exercise.tsx b/src/pages/Exercise.tsx index eae7de9..ac02749 100644 --- a/src/pages/Exercise.tsx +++ b/src/pages/Exercise.tsx @@ -208,83 +208,113 @@ export const Exercise = () => { setLoading(false) }) }, [courseId, exerciseId]) // Код выполняется при изменении ID курса или упражнения - // ========== ФУНКЦИЯ ЗАГРУЗКИ ПРОГРЕССА С СЕРВЕРА ========== // Эта функция получает сохраненный прогресс упражнения с бэкенда - const loadProgressFromServer = async () => { + const loadProgressFromServer = async (): Promise => { try { - const response = await fetch(`/api/pacient/${courseId}/${exerciseId}`, { - method: "GET", - headers: { - "Content-Type": "application/json", - // Add authorization header if needed - // 'Authorization': `Bearer ${token}` - }, - }) + console.log("Загружаем сохраненный прогресс с сервера для упражнения:", exerciseId, "в курсе:", courseId) - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`) - } + const response = await connect.get(`pacient/${courseId}/${exerciseId}/progress?course_id=${courseId}`) - const data = await response.json() + if (response.data && response.data.length > 0) { + console.log("Найден сохраненный прогресс на сервере для курса", courseId, ":", response.data) - // Extract user_progress from server response - const userProgress = data.user_progress || [] + // Получаем все записи прогресса для этого упражнения В ЭТОМ КУРСЕ + const progressData = response.data - if (userProgress.length > 0) { - // Find the latest progress entry for current exercise - const latestProgress = userProgress.reduce((latest, current) => { - return new Date(current.updated_at || current.created_at) > new Date(latest.updated_at || latest.created_at) - ? current - : latest + const filteredProgress = progressData.filter((record: any) => { + // Проверяем что запись относится к текущему курсу + return record.course_id === Number.parseInt(courseId) || record.CourseId === Number.parseInt(courseId) }) - console.log("Загружен прогресс с сервера:", latestProgress) + console.log("Отфильтрованный прогресс для курса", courseId, ":", filteredProgress) - // Convert server data to component state format - if (latestProgress.status === 1) { - // Exercise completed - setIsCompleted(true) - setCurrentTime(totalTime) - setCurrentSet(latestProgress.set || totalSets) - setCompletedSets(Array.from({ length: latestProgress.set || totalSets }, (_, i) => i + 1)) - setHasSavedProgress(false) - } else { - // Exercise in progress or paused - // Parse time_users string to get current position - const timePosition = parseTimeToSeconds(latestProgress.time_users || "00:00") - setCurrentTime(timePosition) - setCurrentSet(latestProgress.set || 1) - setCompletedSets(Array.from({ length: (latestProgress.set || 1) - 1 }, (_, i) => i + 1)) - setIsResting(false) - setRestTime(0) - setIsRestPaused(false) - setHasSavedProgress(true) - setIsCompleted(false) + // Находим завершенные подходы (status = 1) и незавершенные (status = 0) + const completedSetsFromServer: number[] = [] + let lastIncompleteSet = null + let lastSavedTime = "00:00" + + // Обрабатываем каждую запись прогресса ТОЛЬКО ДЛЯ ТЕКУЩЕГО КУРСА + filteredProgress.forEach((record: any) => { + console.log( + `Обрабатываем запись для курса ${courseId}: подход ${record.set}, статус ${record.status}, время ${record.time_users}`, + ) + + if (record.status === 1) { + // СТАТУС 1 = подход завершен + completedSetsFromServer.push(record.set) + console.log(`Подход ${record.set} завершен`) + } else if (record.status === 0) { + // СТАТУС 0 = подход в процессе или на паузе + lastIncompleteSet = record + lastSavedTime = record.time_users || "00:00" + console.log(`Подход ${record.set} в процессе, время: ${lastSavedTime}`) + } + }) + + // Восстанавливаем состояние на основе данных с сервера + if (completedSetsFromServer.length > 0) { + console.log("Восстанавливаем завершенные подходы:", completedSetsFromServer) + setCompletedSets(completedSetsFromServer) + } + + // Если есть незавершенный подход, восстанавливаем его состояние + if (lastIncompleteSet) { + console.log("Восстанавливаем незавершенный подход:", lastIncompleteSet.set) + + // Конвертируем время из формата MM:SS в секунды + const timeInSeconds = convertTimeToSeconds(lastSavedTime) + + setCurrentSet(lastIncompleteSet.set) // Устанавливаем текущий подход + setCurrentTime(timeInSeconds) // Восстанавливаем время + setHasSavedProgress(true) // Помечаем что есть сохраненный прогресс + setIsCompleted(false) // Упражнение не завершено + + console.log(`Восстановлено состояние: подход ${lastIncompleteSet.set}, время ${timeInSeconds} секунд`) + } + + // Проверяем, завершены ли все подходы + if (completedSetsFromServer.length >= totalSets) { + console.log("ВСЕ ПОДХОДЫ ЗАВЕРШЕНЫ согласно серверу!") + setIsCompleted(true) // Помечаем упражнение как завершенное + setCurrentTime(totalTime) // Устанавливаем время на максимум + setHasSavedProgress(false) // Сбрасываем флаг сохранения } return true // Successfully loaded from server + } else { + console.log("Прогресс на сервере не найден, начинаем с чистого листа") + return false // No progress found on server } - - return false // No progress found on server } catch (error) { console.error("Ошибка при загрузке прогресса с сервера:", error) return false // Failed to load from server } } - const parseTimeToSeconds = (timeString) => { - if (!timeString || typeof timeString !== "string") return 0 + // ========== ФУНКЦИЯ КОНВЕРТАЦИИ ВРЕМЕНИ ИЗ MM:SS В СЕКУНДЫ ========== + // Преобразует время из формата "MM:SS" в секунды (например: "02:30" = 150 секунд) + const convertTimeToSeconds = (timeString: string): number => { + try { + // Разделяем строку по двоеточию + const parts = timeString.split(":") - const parts = timeString.split(":") - if (parts.length === 2) { - const minutes = Number.parseInt(parts[0]) || 0 - const seconds = Number.parseInt(parts[1]) || 0 - return minutes * 60 + seconds + if (parts.length === 2) { + const minutes = Number.parseInt(parts[0]) || 0 // Получаем минуты + const seconds = Number.parseInt(parts[1]) || 0 // Получаем секунды + const totalSeconds = minutes * 60 + seconds // Конвертируем в секунды + + console.log(`Конвертируем время ${timeString} в ${totalSeconds} секунд`) + return totalSeconds + } else { + console.warn("Неверный формат времени:", timeString) + return 0 + } + } catch (error) { + console.error("Ошибка при конвертации времени:", error) + return 0 } - return 0 } - // ========== ФУНКЦИЯ СОХРАНЕНИЯ ПРОГРЕССА ПОДХОДА НА СЕРВЕР ========== const saveSetProgress = async (setNumber: number, timeString: string, status: number) => { try { @@ -315,13 +345,14 @@ export const Exercise = () => { console.log("Переходим к следующему упражнению") // Получаем текущий номер упражнения и увеличиваем на 1 - const currentExerciseNum = Number.parseInt(exerciseId) - const nextExerciseId = currentExerciseNum + 1 - - console.log(`Текущее упражнение: ${currentExerciseNum}, следующее: ${nextExerciseId}`) + const currentExerciseNum = Number.parseInt(exerciseId); + const nextExerciseId = currentExerciseNum; + console.log(`!!!!Текущее упражнение: ${currentExerciseNum}, следующее: ${nextExerciseId}`) + + console.log({courseId}, {nextExerciseId}) // Переходим к следующему упражнению в том же курсе - history.push(`/pacient/course/${courseId}/${nextExerciseId}`) + history.push(`${courseId}/${nextExerciseId}`) } // ========== ФУНКЦИЯ ЗАВЕРШЕНИЯ ТЕКУЩЕГО ПОДХОДА ========== @@ -652,9 +683,6 @@ export const Exercise = () => { {/* Заголовок страницы с названием упражнения */} - {/* Временное предупреждение для разработчика */} -

Если упражнение меньше минуты, то скидывает сразу на отдых

-
{/* Основная карточка с изображением и кнопкой воспроизведения */}
@@ -841,11 +869,9 @@ export const Exercise = () => { <>
@@ -865,8 +891,8 @@ export const Exercise = () => { }} className={`flex-1 font-bold py-3 px-4 rounded-xl transition-all duration-300 flex items-center justify-center space-x-2 ${ isRestPaused - ? "bg-[#2BACBE] hover:bg-[#2099A8] text-white" - : "bg-yellow-500 hover:bg-yellow-600 text-white" + ? "bg-yellow-500 hover:bg-yellow-600 text-white" + : "bg-[#2BACBE] hover:bg-[#2099A8] text-white" }`} > {isRestPaused ? (