данные корректно берутся с сервера

This commit is contained in:
Tatyana 2025-09-03 15:31:08 +03:00
parent 666b3a0508
commit 36d7e6927a

View File

@ -49,7 +49,7 @@ export const Exercise = () => {
// Состояние ошибки (пустая строка = нет ошибки, текст = описание ошибки) // Состояние ошибки (пустая строка = нет ошибки, текст = описание ошибки)
const [error, setError] = useState<string>("") const [error, setError] = useState<string>("")
// ========== СОСТОЯНИЯ ТАЙМЕРА УПРАЖНЕНИЯ ========== // ========== СОСТОЯНИЯ ТАЙМЕРУ УПРАЖНЕНИЯ ==========
// Играет ли сейчас таймер упражнения (true = идет, false = на паузе) // Играет ли сейчас таймер упражнения (true = идет, false = на паузе)
const [isPlaying, setIsPlaying] = useState(false) const [isPlaying, setIsPlaying] = useState(false)
@ -95,7 +95,13 @@ export const Exercise = () => {
// ========== ВОССТАНОВЛЕНИЕ ПРОГРЕССА ПРИ ЗАГРУЗКЕ СТРАНИЦЫ ========== // ========== ВОССТАНОВЛЕНИЕ ПРОГРЕССА ПРИ ЗАГРУЗКЕ СТРАНИЦЫ ==========
// Этот код выполняется каждый раз при загрузке страницы или изменении упражнения // Этот код выполняется каждый раз при загрузке страницы или изменении упражнения
useEffect(() => { 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}`) const savedProgress = localStorage.getItem(`exerciseProgress_${courseId}_${exerciseId}`)
if (savedProgress) { if (savedProgress) {
@ -124,7 +130,11 @@ export const Exercise = () => {
setIsCompleted(false) // Упражнение не завершено setIsCompleted(false) // Упражнение не завершено
} }
} }
}, [exerciseId]) // Код выполняется при изменении ID упражнения }
}
loadProgress()
}, [courseId, exerciseId, totalTime, totalSets]) // Зависимости для повторного выполнения
// ========== ЗАГРУЗКА ДАННЫХ УПРАЖНЕНИЯ С СЕРВЕРА ========== // ========== ЗАГРУЗКА ДАННЫХ УПРАЖНЕНИЯ С СЕРВЕРА ==========
useEffect(() => { useEffect(() => {
@ -173,8 +183,6 @@ export const Exercise = () => {
console.log("Установлено количество подходов:", exerciseData.count) console.log("Установлено количество подходов:", exerciseData.count)
} }
loadProgressFromServer(exerciseData.id)
// Загрузка завершена успешно // Загрузка завершена успешно
setLoading(false) setLoading(false)
}) })
@ -203,140 +211,80 @@ export const Exercise = () => {
// ========== ФУНКЦИЯ ЗАГРУЗКИ ПРОГРЕССА С СЕРВЕРА ========== // ========== ФУНКЦИЯ ЗАГРУЗКИ ПРОГРЕССА С СЕРВЕРА ==========
// Эта функция получает сохраненный прогресс упражнения с бэкенда // Эта функция получает сохраненный прогресс упражнения с бэкенда
const loadProgressFromServer = async (exerciseId: number) => { const loadProgressFromServer = async () => {
try { try {
console.log("Загружаем сохраненный прогресс с сервера для упражнения:", exerciseId, "в курсе:", courseId) const response = await fetch(`/api/pacient/${courseId}/${exerciseId}`, {
method: "GET",
const response = await connect.get(`pacient/${courseId}/${exerciseId}/progress?course_id=${courseId}`) headers: {
"Content-Type": "application/json",
if (response.data && response.data.length > 0) { // Add authorization header if needed
console.log("Найден сохраненный прогресс на сервере для курса", courseId, ":", response.data) // 'Authorization': `Bearer ${token}`
},
// Получаем все записи прогресса для этого упражнения В ЭТОМ КУРСЕ
const progressData = response.data
const filteredProgress = progressData.filter((record: any) => {
// Проверяем что запись относится к текущему курсу
return record.course_id === Number.parseInt(courseId) || record.CourseId === Number.parseInt(courseId)
}) })
console.log("Отфильтрованный прогресс для курса", courseId, ":", filteredProgress) if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`)
// Находим завершенные подходы (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}`)
} }
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
}) })
// Восстанавливаем состояние на основе данных с сервера console.log("Загружен прогресс с сервера:", latestProgress)
if (completedSetsFromServer.length > 0) {
console.log("Восстанавливаем завершенные подходы:", completedSetsFromServer)
setCompletedSets(completedSetsFromServer)
}
// Если есть незавершенный подход, восстанавливаем его состояние // Convert server data to component state format
if (lastIncompleteSet) { if (latestProgress.status === 1) {
console.log("Восстанавливаем незавершенный подход:", lastIncompleteSet.set) // Exercise completed
// Конвертируем время из формата 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 = упражнение было полностью завершено ранее
setIsCompleted(true) setIsCompleted(true)
setCurrentTime(progress.totalTime || totalTime) setCurrentTime(totalTime)
setCompletedSets(progress.completedSets || []) setCurrentSet(latestProgress.set || totalSets)
setCurrentSet(progress.set || totalSets) setCompletedSets(Array.from({ length: latestProgress.set || totalSets }, (_, i) => i + 1))
setHasSavedProgress(false) setHasSavedProgress(false)
} else { } else {
// СТАТУС 0 = упражнение было на паузе или в процессе выполнения // Exercise in progress or paused
setCurrentTime(progress.position) // Parse time_users string to get current position
setCurrentSet(progress.set) const timePosition = parseTimeToSeconds(latestProgress.time_users || "00:00")
setCompletedSets(progress.completedSets || []) setCurrentTime(timePosition)
setIsResting(progress.isResting || false) setCurrentSet(latestProgress.set || 1)
setRestTime(progress.restTime || 0) setCompletedSets(Array.from({ length: (latestProgress.set || 1) - 1 }, (_, i) => i + 1))
setIsRestPaused(progress.isRestPaused || false) setIsResting(false)
setRestTime(0)
setIsRestPaused(false)
setHasSavedProgress(true) setHasSavedProgress(true)
setIsCompleted(false) setIsCompleted(false)
} }
}
} return true // Successfully loaded from server
} }
// ========== ФУНКЦИЯ КОНВЕРТАЦИИ ВРЕМЕНИ ИЗ MM:SS В СЕКУНДЫ ========== return false // No progress found on server
// Преобразует время из формата "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
}
} catch (error) { } catch (error) {
console.error("Ошибка при конвертации времени:", error) console.error("Ошибка при загрузке прогресса с сервера:", error)
return 0 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) => { const saveSetProgress = async (setNumber: number, timeString: string, status: number) => {
try { try {