данные корректно берутся с сервера
This commit is contained in:
parent
666b3a0508
commit
36d7e6927a
@ -49,7 +49,7 @@ export const Exercise = () => {
|
||||
// Состояние ошибки (пустая строка = нет ошибки, текст = описание ошибки)
|
||||
const [error, setError] = useState<string>("")
|
||||
|
||||
// ========== СОСТОЯНИЯ ТАЙМЕРА УПРАЖНЕНИЯ ==========
|
||||
// ========== СОСТОЯНИЯ ТАЙМЕРУ УПРАЖНЕНИЯ ==========
|
||||
// Играет ли сейчас таймер упражнения (true = идет, false = на паузе)
|
||||
const [isPlaying, setIsPlaying] = useState(false)
|
||||
|
||||
@ -95,7 +95,13 @@ export const Exercise = () => {
|
||||
// ========== ВОССТАНОВЛЕНИЕ ПРОГРЕССА ПРИ ЗАГРУЗКЕ СТРАНИЦЫ ==========
|
||||
// Этот код выполняется каждый раз при загрузке страницы или изменении упражнения
|
||||
useEffect(() => {
|
||||
// Пытаемся получить сохраненный прогресс из памяти браузера для конкретного курса и упражнения
|
||||
const loadProgress = async () => {
|
||||
const serverLoaded = await loadProgressFromServer()
|
||||
|
||||
if (!serverLoaded) {
|
||||
// Fallback to localStorage if server loading failed
|
||||
console.log("Пытаемся загрузить прогресс из localStorage как резервный вариант")
|
||||
|
||||
const savedProgress = localStorage.getItem(`exerciseProgress_${courseId}_${exerciseId}`)
|
||||
|
||||
if (savedProgress) {
|
||||
@ -124,7 +130,11 @@ export const Exercise = () => {
|
||||
setIsCompleted(false) // Упражнение не завершено
|
||||
}
|
||||
}
|
||||
}, [exerciseId]) // Код выполняется при изменении ID упражнения
|
||||
}
|
||||
}
|
||||
|
||||
loadProgress()
|
||||
}, [courseId, exerciseId, totalTime, totalSets]) // Зависимости для повторного выполнения
|
||||
|
||||
// ========== ЗАГРУЗКА ДАННЫХ УПРАЖНЕНИЯ С СЕРВЕРА ==========
|
||||
useEffect(() => {
|
||||
@ -173,8 +183,6 @@ export const Exercise = () => {
|
||||
console.log("Установлено количество подходов:", exerciseData.count)
|
||||
}
|
||||
|
||||
loadProgressFromServer(exerciseData.id)
|
||||
|
||||
// Загрузка завершена успешно
|
||||
setLoading(false)
|
||||
})
|
||||
@ -203,140 +211,80 @@ export const Exercise = () => {
|
||||
|
||||
// ========== ФУНКЦИЯ ЗАГРУЗКИ ПРОГРЕССА С СЕРВЕРА ==========
|
||||
// Эта функция получает сохраненный прогресс упражнения с бэкенда
|
||||
const loadProgressFromServer = async (exerciseId: number) => {
|
||||
const loadProgressFromServer = async () => {
|
||||
try {
|
||||
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)
|
||||
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("Отфильтрованный прогресс для курса", 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 (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`)
|
||||
}
|
||||
|
||||
const data = await response.json()
|
||||
|
||||
// Extract user_progress from server response
|
||||
const userProgress = data.user_progress || []
|
||||
|
||||
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
|
||||
})
|
||||
|
||||
// Восстанавливаем состояние на основе данных с сервера
|
||||
if (completedSetsFromServer.length > 0) {
|
||||
console.log("Восстанавливаем завершенные подходы:", completedSetsFromServer)
|
||||
setCompletedSets(completedSetsFromServer)
|
||||
}
|
||||
console.log("Загружен прогресс с сервера:", latestProgress)
|
||||
|
||||
// Если есть незавершенный подход, восстанавливаем его состояние
|
||||
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) // Сбрасываем флаг сохранения
|
||||
}
|
||||
} else {
|
||||
console.log("Прогресс на сервере не найден, начинаем с чистого листа")
|
||||
// Если прогресса нет, оставляем начальные значения
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Ошибка при загрузке прогресса с сервера:", error)
|
||||
|
||||
// Если произошла ошибка, пытаемся загрузить из localStorage как резервный вариант
|
||||
console.log("Пытаемся загрузить прогресс из localStorage как резервный вариант")
|
||||
|
||||
// Пытаемся получить сохраненный прогресс из памяти браузера для конкретного курса и упражнения
|
||||
const savedProgress = localStorage.getItem(`exerciseProgress_${courseId}_${exerciseId}`)
|
||||
|
||||
if (savedProgress) {
|
||||
const progress = JSON.parse(savedProgress)
|
||||
|
||||
console.log("Найден резервный прогресс в localStorage для курса", courseId, ":", progress)
|
||||
|
||||
if (progress.status === 1) {
|
||||
// СТАТУС 1 = упражнение было полностью завершено ранее
|
||||
// Convert server data to component state format
|
||||
if (latestProgress.status === 1) {
|
||||
// Exercise completed
|
||||
setIsCompleted(true)
|
||||
setCurrentTime(progress.totalTime || totalTime)
|
||||
setCompletedSets(progress.completedSets || [])
|
||||
setCurrentSet(progress.set || totalSets)
|
||||
setCurrentTime(totalTime)
|
||||
setCurrentSet(latestProgress.set || totalSets)
|
||||
setCompletedSets(Array.from({ length: latestProgress.set || totalSets }, (_, i) => i + 1))
|
||||
setHasSavedProgress(false)
|
||||
} else {
|
||||
// СТАТУС 0 = упражнение было на паузе или в процессе выполнения
|
||||
setCurrentTime(progress.position)
|
||||
setCurrentSet(progress.set)
|
||||
setCompletedSets(progress.completedSets || [])
|
||||
setIsResting(progress.isResting || false)
|
||||
setRestTime(progress.restTime || 0)
|
||||
setIsRestPaused(progress.isRestPaused || false)
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true // Successfully loaded from server
|
||||
}
|
||||
|
||||
// ========== ФУНКЦИЯ КОНВЕРТАЦИИ ВРЕМЕНИ ИЗ 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 // Получаем секунды
|
||||
const totalSeconds = minutes * 60 + seconds // Конвертируем в секунды
|
||||
|
||||
console.log(`Конвертируем время ${timeString} в ${totalSeconds} секунд`)
|
||||
return totalSeconds
|
||||
} else {
|
||||
console.warn("Неверный формат времени:", timeString)
|
||||
return 0
|
||||
}
|
||||
return false // No progress found on server
|
||||
} catch (error) {
|
||||
console.error("Ошибка при конвертации времени:", error)
|
||||
return 0
|
||||
console.error("Ошибка при загрузке прогресса с сервера:", error)
|
||||
return false // Failed to load from server
|
||||
}
|
||||
}
|
||||
|
||||
const parseTimeToSeconds = (timeString) => {
|
||||
if (!timeString || typeof timeString !== "string") return 0
|
||||
|
||||
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
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// ========== ФУНКЦИЯ СОХРАНЕНИЯ ПРОГРЕССА ПОДХОДА НА СЕРВЕР ==========
|
||||
const saveSetProgress = async (setNumber: number, timeString: string, status: number) => {
|
||||
try {
|
||||
|
Loading…
x
Reference in New Issue
Block a user