правки по дизайну
This commit is contained in:
parent
36d7e6927a
commit
cf9803ef6f
@ -208,83 +208,113 @@ export const Exercise = () => {
|
||||
setLoading(false)
|
||||
})
|
||||
}, [courseId, exerciseId]) // Код выполняется при изменении ID курса или упражнения
|
||||
|
||||
// ========== ФУНКЦИЯ ЗАГРУЗКИ ПРОГРЕССА С СЕРВЕРА ==========
|
||||
// Эта функция получает сохраненный прогресс упражнения с бэкенда
|
||||
const loadProgressFromServer = async () => {
|
||||
const loadProgressFromServer = async (): Promise<boolean> => {
|
||||
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)
|
||||
|
||||
const response = await connect.get(`pacient/${courseId}/${exerciseId}/progress?course_id=${courseId}`)
|
||||
|
||||
if (response.data && response.data.length > 0) {
|
||||
console.log("Найден сохраненный прогресс на сервере для курса", courseId, ":", response.data)
|
||||
|
||||
// Получаем все записи прогресса для этого упражнения В ЭТОМ КУРСЕ
|
||||
const progressData = response.data
|
||||
|
||||
const filteredProgress = progressData.filter((record: any) => {
|
||||
// Проверяем что запись относится к текущему курсу
|
||||
return record.course_id === Number.parseInt(courseId) || record.CourseId === Number.parseInt(courseId)
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`)
|
||||
console.log("Отфильтрованный прогресс для курса", courseId, ":", filteredProgress)
|
||||
|
||||
// Находим завершенные подходы (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)
|
||||
}
|
||||
|
||||
const data = await response.json()
|
||||
// Если есть незавершенный подход, восстанавливаем его состояние
|
||||
if (lastIncompleteSet) {
|
||||
console.log("Восстанавливаем незавершенный подход:", lastIncompleteSet.set)
|
||||
|
||||
// Extract user_progress from server response
|
||||
const userProgress = data.user_progress || []
|
||||
// Конвертируем время из формата MM:SS в секунды
|
||||
const timeInSeconds = convertTimeToSeconds(lastSavedTime)
|
||||
|
||||
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
|
||||
})
|
||||
setCurrentSet(lastIncompleteSet.set) // Устанавливаем текущий подход
|
||||
setCurrentTime(timeInSeconds) // Восстанавливаем время
|
||||
setHasSavedProgress(true) // Помечаем что есть сохраненный прогресс
|
||||
setIsCompleted(false) // Упражнение не завершено
|
||||
|
||||
console.log("Загружен прогресс с сервера:", latestProgress)
|
||||
console.log(`Восстановлено состояние: подход ${lastIncompleteSet.set}, время ${timeInSeconds} секунд`)
|
||||
}
|
||||
|
||||
// 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)
|
||||
// Проверяем, завершены ли все подходы
|
||||
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
|
||||
}
|
||||
} 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(":")
|
||||
|
||||
if (parts.length === 2) {
|
||||
const minutes = Number.parseInt(parts[0]) || 0
|
||||
const seconds = Number.parseInt(parts[1]) || 0
|
||||
return minutes * 60 + seconds
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
// ========== ФУНКЦИЯ СОХРАНЕНИЯ ПРОГРЕССА ПОДХОДА НА СЕРВЕР ==========
|
||||
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
|
||||
const currentExerciseNum = Number.parseInt(exerciseId);
|
||||
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}`} />
|
||||
|
||||
{/* Временное предупреждение для разработчика */}
|
||||
<p className="bg-red-400 font-bold">Если упражнение меньше минуты, то скидывает сразу на отдых</p>
|
||||
|
||||
<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">
|
||||
@ -841,11 +869,9 @@ export const Exercise = () => {
|
||||
<>
|
||||
<button
|
||||
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>
|
||||
</button>
|
||||
<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 ${
|
||||
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 ? (
|
||||
|
Loading…
x
Reference in New Issue
Block a user