правки по дизайну

This commit is contained in:
Tatyana 2025-09-03 16:21:22 +03:00
parent 36d7e6927a
commit cf9803ef6f

View File

@ -208,83 +208,113 @@ export const Exercise = () => {
setLoading(false) setLoading(false)
}) })
}, [courseId, exerciseId]) // Код выполняется при изменении ID курса или упражнения }, [courseId, exerciseId]) // Код выполняется при изменении ID курса или упражнения
// ========== ФУНКЦИЯ ЗАГРУЗКИ ПРОГРЕССА С СЕРВЕРА ========== // ========== ФУНКЦИЯ ЗАГРУЗКИ ПРОГРЕССА С СЕРВЕРА ==========
// Эта функция получает сохраненный прогресс упражнения с бэкенда // Эта функция получает сохраненный прогресс упражнения с бэкенда
const loadProgressFromServer = async () => { const loadProgressFromServer = async (): Promise<boolean> => {
try { try {
const response = await fetch(`/api/pacient/${courseId}/${exerciseId}`, { console.log("Загружаем сохраненный прогресс с сервера для упражнения:", exerciseId, "в курсе:", courseId)
method: "GET",
headers: {
"Content-Type": "application/json",
// Add authorization header if needed
// 'Authorization': `Bearer ${token}`
},
})
if (!response.ok) { const response = await connect.get(`pacient/${courseId}/${exerciseId}/progress?course_id=${courseId}`)
throw new Error(`HTTP error! status: ${response.status}`)
}
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) { const filteredProgress = progressData.filter((record: any) => {
// Find the latest progress entry for current exercise // Проверяем что запись относится к текущему курсу
const latestProgress = userProgress.reduce((latest, current) => { return record.course_id === Number.parseInt(courseId) || record.CourseId === Number.parseInt(courseId)
return new Date(current.updated_at || current.created_at) > new Date(latest.updated_at || latest.created_at)
? current
: latest
}) })
console.log("Загружен прогресс с сервера:", latestProgress) console.log("Отфильтрованный прогресс для курса", courseId, ":", filteredProgress)
// Convert server data to component state format // Находим завершенные подходы (status = 1) и незавершенные (status = 0)
if (latestProgress.status === 1) { const completedSetsFromServer: number[] = []
// Exercise completed let lastIncompleteSet = null
setIsCompleted(true) let lastSavedTime = "00:00"
setCurrentTime(totalTime)
setCurrentSet(latestProgress.set || totalSets) // Обрабатываем каждую запись прогресса ТОЛЬКО ДЛЯ ТЕКУЩЕГО КУРСА
setCompletedSets(Array.from({ length: latestProgress.set || totalSets }, (_, i) => i + 1)) filteredProgress.forEach((record: any) => {
setHasSavedProgress(false) console.log(
} else { `Обрабатываем запись для курса ${courseId}: подход ${record.set}, статус ${record.status}, время ${record.time_users}`,
// Exercise in progress or paused )
// Parse time_users string to get current position
const timePosition = parseTimeToSeconds(latestProgress.time_users || "00:00") if (record.status === 1) {
setCurrentTime(timePosition) // СТАТУС 1 = подход завершен
setCurrentSet(latestProgress.set || 1) completedSetsFromServer.push(record.set)
setCompletedSets(Array.from({ length: (latestProgress.set || 1) - 1 }, (_, i) => i + 1)) console.log(`Подход ${record.set} завершен`)
setIsResting(false) } else if (record.status === 0) {
setRestTime(0) // СТАТУС 0 = подход в процессе или на паузе
setIsRestPaused(false) lastIncompleteSet = record
setHasSavedProgress(true) lastSavedTime = record.time_users || "00:00"
setIsCompleted(false) 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 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) { } catch (error) {
console.error("Ошибка при загрузке прогресса с сервера:", error) console.error("Ошибка при загрузке прогресса с сервера:", error)
return false // Failed to load from server return false // Failed to load from server
} }
} }
const parseTimeToSeconds = (timeString) => { // ========== ФУНКЦИЯ КОНВЕРТАЦИИ ВРЕМЕНИ ИЗ MM:SS В СЕКУНДЫ ==========
if (!timeString || typeof timeString !== "string") return 0 // Преобразует время из формата "MM:SS" в секунды (например: "02:30" = 150 секунд)
const convertTimeToSeconds = (timeString: string): number => {
try {
// Разделяем строку по двоеточию
const parts = timeString.split(":")
const parts = timeString.split(":") if (parts.length === 2) {
if (parts.length === 2) { const minutes = Number.parseInt(parts[0]) || 0 // Получаем минуты
const minutes = Number.parseInt(parts[0]) || 0 const seconds = Number.parseInt(parts[1]) || 0 // Получаем секунды
const seconds = Number.parseInt(parts[1]) || 0 const totalSeconds = minutes * 60 + seconds // Конвертируем в секунды
return 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) => { const saveSetProgress = async (setNumber: number, timeString: string, status: number) => {
try { try {
@ -315,13 +345,14 @@ export const Exercise = () => {
console.log("Переходим к следующему упражнению") console.log("Переходим к следующему упражнению")
// Получаем текущий номер упражнения и увеличиваем на 1 // Получаем текущий номер упражнения и увеличиваем на 1
const currentExerciseNum = Number.parseInt(exerciseId) const currentExerciseNum = Number.parseInt(exerciseId);
const nextExerciseId = currentExerciseNum + 1 const nextExerciseId = currentExerciseNum;
console.log(`Текущее упражнение: ${currentExerciseNum}, следующее: ${nextExerciseId}`)
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 = () => {
{/* Заголовок страницы с названием упражнения */} {/* Заголовок страницы с названием упражнения */}
<HeaderNav item={exercise.title} text={`упражнение ${exercise.position}`} /> <HeaderNav item={exercise.title} text={`упражнение ${exercise.position}`} />
{/* Временное предупреждение для разработчика */}
<p className="bg-red-400 font-bold">Если упражнение меньше минуты, то скидывает сразу на отдых</p>
<div className="px-4 sm:px-6 mt-10 mb-6"> <div className="px-4 sm:px-6 mt-10 mb-6">
{/* Основная карточка с изображением и кнопкой воспроизведения */} {/* Основная карточка с изображением и кнопкой воспроизведения */}
<div className="glass-morphism rounded-3xl overflow-hidden shadow-2xl border border-white/20 backdrop-blur-2xl"> <div className="glass-morphism rounded-3xl overflow-hidden shadow-2xl border border-white/20 backdrop-blur-2xl">
@ -841,11 +869,9 @@ export const Exercise = () => {
<> <>
<button <button
onClick={goToNextExercise} onClick={goToNextExercise}
className="flex-1 font-bold py-3 px-4 rounded-xl bg-green-500 hover:bg-green-600 text-white flex items-center justify-center space-x-2 transition-all duration-300" className="flex-1 font-bold py-3 px-4 rounded-xl bg-orange-400 hover:bg-yellow-500 hover:scale-105 text-white flex items-center justify-center space-x-2 transition-all duration-300"
> >
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z" />
</svg>
<span>Следующее упражнение</span> <span>Следующее упражнение</span>
</button> </button>
<div className="px-4 py-3 bg-cyan-500 text-white font-bold rounded-xl flex items-center justify-center space-x-2"> <div className="px-4 py-3 bg-cyan-500 text-white font-bold rounded-xl flex items-center justify-center space-x-2">
@ -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 ${ className={`flex-1 font-bold py-3 px-4 rounded-xl transition-all duration-300 flex items-center justify-center space-x-2 ${
isRestPaused 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 ? ( {isRestPaused ? (