данные корректно берутся с сервера
This commit is contained in:
parent
666b3a0508
commit
36d7e6927a
@ -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,36 +95,46 @@ export const Exercise = () => {
|
|||||||
// ========== ВОССТАНОВЛЕНИЕ ПРОГРЕССА ПРИ ЗАГРУЗКЕ СТРАНИЦЫ ==========
|
// ========== ВОССТАНОВЛЕНИЕ ПРОГРЕССА ПРИ ЗАГРУЗКЕ СТРАНИЦЫ ==========
|
||||||
// Этот код выполняется каждый раз при загрузке страницы или изменении упражнения
|
// Этот код выполняется каждый раз при загрузке страницы или изменении упражнения
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Пытаемся получить сохраненный прогресс из памяти браузера для конкретного курса и упражнения
|
const loadProgress = async () => {
|
||||||
const savedProgress = localStorage.getItem(`exerciseProgress_${courseId}_${exerciseId}`)
|
const serverLoaded = await loadProgressFromServer()
|
||||||
|
|
||||||
if (savedProgress) {
|
if (!serverLoaded) {
|
||||||
// Если прогресс найден, преобразуем его из текста в объект
|
// Fallback to localStorage if server loading failed
|
||||||
const progress = JSON.parse(savedProgress)
|
console.log("Пытаемся загрузить прогресс из localStorage как резервный вариант")
|
||||||
|
|
||||||
// Проверяем статус сохраненного прогресса
|
const savedProgress = localStorage.getItem(`exerciseProgress_${courseId}_${exerciseId}`)
|
||||||
if (progress.status === 1) {
|
|
||||||
// СТАТУС 1 = упражнение было полностью завершено ранее
|
if (savedProgress) {
|
||||||
console.log("Найден завершенный прогресс упражнения для курса", courseId)
|
// Если прогресс найден, преобразуем его из текста в объект
|
||||||
setIsCompleted(true) // Помечаем как завершенное
|
const progress = JSON.parse(savedProgress)
|
||||||
setCurrentTime(progress.totalTime || totalTime) // Устанавливаем время на максимум
|
|
||||||
setCompletedSets(progress.completedSets || []) // Восстанавливаем завершенные подходы
|
// Проверяем статус сохраненного прогресса
|
||||||
setCurrentSet(progress.set || totalSets) // Устанавливаем текущий подход на последний
|
if (progress.status === 1) {
|
||||||
setHasSavedProgress(false) // Сбрасываем флаг сохранения
|
// СТАТУС 1 = упражнение было полностью завершено ранее
|
||||||
} else {
|
console.log("Найден завершенный прогресс упражнения для курса", courseId)
|
||||||
// СТАТУС 0 = упражнение было на паузе или в процессе выполнения
|
setIsCompleted(true) // Помечаем как завершенное
|
||||||
console.log("Найден незавершенный прогресс упражнения для курса", courseId)
|
setCurrentTime(progress.totalTime || totalTime) // Устанавливаем время на максимум
|
||||||
setCurrentTime(progress.position) // Восстанавливаем время выполнения
|
setCompletedSets(progress.completedSets || []) // Восстанавливаем завершенные подходы
|
||||||
setCurrentSet(progress.set) // Восстанавливаем номер подхода
|
setCurrentSet(progress.set || totalSets) // Устанавливаем текущий подход на последний
|
||||||
setCompletedSets(progress.completedSets || []) // Восстанавливаем завершенные подходы
|
setHasSavedProgress(false) // Сбрасываем флаг сохранения
|
||||||
setIsResting(progress.isResting || false) // Восстанавливаем состояние отдыха
|
} else {
|
||||||
setRestTime(progress.restTime || 0) // Восстанавливаем время отдыха
|
// СТАТУС 0 = упражнение было на паузе или в процессе выполнения
|
||||||
setIsRestPaused(progress.isRestPaused || false) // Восстанавливаем паузу отдыха
|
console.log("Найден незавершенный прогресс упражнения для курса", courseId)
|
||||||
setHasSavedProgress(true) // Помечаем что есть сохраненный прогресс
|
setCurrentTime(progress.position) // Восстанавливаем время выполнения
|
||||||
setIsCompleted(false) // Упражнение не завершено
|
setCurrentSet(progress.set) // Восстанавливаем номер подхода
|
||||||
|
setCompletedSets(progress.completedSets || []) // Восстанавливаем завершенные подходы
|
||||||
|
setIsResting(progress.isResting || false) // Восстанавливаем состояние отдыха
|
||||||
|
setRestTime(progress.restTime || 0) // Восстанавливаем время отдыха
|
||||||
|
setIsRestPaused(progress.isRestPaused || false) // Восстанавливаем паузу отдыха
|
||||||
|
setHasSavedProgress(true) // Помечаем что есть сохраненный прогресс
|
||||||
|
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,138 +211,78 @@ 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",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
// Add authorization header if needed
|
||||||
|
// 'Authorization': `Bearer ${token}`
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
const response = await connect.get(`pacient/${courseId}/${exerciseId}/progress?course_id=${courseId}`)
|
if (!response.ok) {
|
||||||
|
throw new Error(`HTTP error! status: ${response.status}`)
|
||||||
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)
|
|
||||||
})
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Если есть незавершенный подход, восстанавливаем его состояние
|
|
||||||
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 как резервный вариант
|
const data = await response.json()
|
||||||
console.log("Пытаемся загрузить прогресс из localStorage как резервный вариант")
|
|
||||||
|
|
||||||
// Пытаемся получить сохраненный прогресс из памяти браузера для конкретного курса и упражнения
|
// Extract user_progress from server response
|
||||||
const savedProgress = localStorage.getItem(`exerciseProgress_${courseId}_${exerciseId}`)
|
const userProgress = data.user_progress || []
|
||||||
|
|
||||||
if (savedProgress) {
|
if (userProgress.length > 0) {
|
||||||
const progress = JSON.parse(savedProgress)
|
// 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("Найден резервный прогресс в localStorage для курса", courseId, ":", progress)
|
console.log("Загружен прогресс с сервера:", latestProgress)
|
||||||
|
|
||||||
if (progress.status === 1) {
|
// Convert server data to component state format
|
||||||
// СТАТУС 1 = упражнение было полностью завершено ранее
|
if (latestProgress.status === 1) {
|
||||||
|
// Exercise completed
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false // No progress found on server
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Ошибка при загрузке прогресса с сервера:", error)
|
||||||
|
return false // Failed to load from server
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== ФУНКЦИЯ КОНВЕРТАЦИИ ВРЕМЕНИ ИЗ MM:SS В СЕКУНДЫ ==========
|
const parseTimeToSeconds = (timeString) => {
|
||||||
// Преобразует время из формата "MM:SS" в секунды (например: "02:30" = 150 секунд)
|
if (!timeString || typeof timeString !== "string") return 0
|
||||||
const convertTimeToSeconds = (timeString: string): number => {
|
|
||||||
try {
|
|
||||||
// Разделяем строку по двоеточию
|
|
||||||
const parts = timeString.split(":")
|
|
||||||
|
|
||||||
if (parts.length === 2) {
|
const parts = timeString.split(":")
|
||||||
const minutes = Number.parseInt(parts[0]) || 0 // Получаем минуты
|
if (parts.length === 2) {
|
||||||
const seconds = Number.parseInt(parts[1]) || 0 // Получаем секунды
|
const minutes = Number.parseInt(parts[0]) || 0
|
||||||
const totalSeconds = minutes * 60 + seconds // Конвертируем в секунды
|
const seconds = Number.parseInt(parts[1]) || 0
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== ФУНКЦИЯ СОХРАНЕНИЯ ПРОГРЕССА ПОДХОДА НА СЕРВЕР ==========
|
// ========== ФУНКЦИЯ СОХРАНЕНИЯ ПРОГРЕССА ПОДХОДА НА СЕРВЕР ==========
|
||||||
|
Loading…
x
Reference in New Issue
Block a user