корректный переход на поседнее упражнение и на упражнения текущего курса

This commit is contained in:
Tatyana 2025-09-08 20:49:17 +03:00
parent 15618e2265
commit 4429713601
2 changed files with 68 additions and 18 deletions

View File

@ -121,7 +121,7 @@ export const CourseExercises = () => {
return ( return (
<div className="my-36 min-h-screen max-w-4xl mx-auto"> <div className="my-36 min-h-screen max-w-4xl mx-auto">
<HeaderNav item={course?.title ?? "Название курса"} text={"курс"} /> <HeaderNav item={course?.title ?? "Текущий"} text={"курс"} />
<div className="px-6 mb-8"> <div className="px-6 mb-8">
<div className="flex flex-col sm:flex-row justify-between content-center mb-6"> <div className="flex flex-col sm:flex-row justify-between content-center mb-6">

View File

@ -21,6 +21,7 @@ import { getRouteCourseExercises } from "../shared/consts/router"
import type { Course, User, CoursesApiResponse } from "../types/course" import type { Course, User, CoursesApiResponse } from "../types/course"
interface CourseExercises { interface CourseExercises {
id_exercise: number id_exercise: number
day: number day: number
@ -50,12 +51,6 @@ interface ProgressStats {
overallProgress: number overallProgress: number
} }
// interface RouteParams {
// courseId: string
// exerciseId?: string // Made optional since we might have exerciseIndex instead
// exerciseIndex?: string // Added exerciseIndex parameter
// }
export default function Home() { export default function Home() {
const history = useHistory() const history = useHistory()
const [currentDate, setCurrentDate] = useState("") const [currentDate, setCurrentDate] = useState("")
@ -65,7 +60,6 @@ export default function Home() {
const [currentExercise, setCurrentExercise] = useState<CurrentExercise | null>(null) const [currentExercise, setCurrentExercise] = useState<CurrentExercise | null>(null)
const [loadingCurrentExercise, setLoadingCurrentExercise] = useState(false) const [loadingCurrentExercise, setLoadingCurrentExercise] = useState(false)
// const { courseId, exerciseId, exerciseIndex } = useParams<RouteParams>()
const [progressStats, setProgressStats] = useState<ProgressStats>({ const [progressStats, setProgressStats] = useState<ProgressStats>({
completedExercises: 0, completedExercises: 0,
@ -91,11 +85,12 @@ export default function Home() {
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
}) })
console.log("!получили по запросу", response.data)
//упражнения курса
const exercises = response.data.course_exercises || [] const exercises = response.data.course_exercises || []
totalExercises += exercises.length
console.log("упражнения для каждого курса", response.data) totalExercises += exercises.length
let courseCompletedExercises = 0 let courseCompletedExercises = 0
@ -143,11 +138,61 @@ export default function Home() {
setLoadingCurrentExercise(true) setLoadingCurrentExercise(true)
try { try {
// Берем первый доступный курс let targetCourse: Course | null = null
const firstCourse = courses[0]
// Загружаем упражнения курса // Проходим по всем курсам и ищем незавершенный
const response = await connect.get(`/pacient/${firstCourse.id}`, { for (const course of courses) {
// Загружаем упражнения для каждого курса
const response = await connect.get(`/pacient/${course.id}`, {
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
})
const exercises = response.data.course_exercises || []
if (exercises.length === 0) continue // Пропускаем курсы без упражнений
// Проверяем, есть ли незавершенные упражнения в этом курсе
let hasIncompleteExercises = false
for (const exercise of exercises) {
const storageKey = `exerciseProgress_${course.id}_${exercise.id_exercise}_day_${exercise.day}`
const savedProgress = localStorage.getItem(storageKey)
let isCompleted = false
if (savedProgress) {
const progress = JSON.parse(savedProgress)
isCompleted =
progress.status === 1 && progress.completedSets && progress.completedSets.length >= exercise.count
}
if (!isCompleted) {
hasIncompleteExercises = true
break // Нашли незавершенное упражнение, можно остановиться
}
}
// Если в курсе есть незавершенные упражнения, выбираем его
if (hasIncompleteExercises) {
targetCourse = course
break // Берем первый найденный незавершенный курс
}
}
// Если все курсы завершены, берем последний курс
if (!targetCourse && courses.length > 0) {
targetCourse = courses[courses.length - 1]
}
if (!targetCourse) {
setCurrentExercise(null)
return
}
// Загружаем упражнения выбранного курса
const response = await connect.get(`/pacient/${targetCourse.id}`, {
headers: { headers: {
Authorization: `Bearer ${token}`, Authorization: `Bearer ${token}`,
"Content-Type": "application/json", "Content-Type": "application/json",
@ -182,7 +227,7 @@ export default function Home() {
const exercise = dayExercises[i] const exercise = dayExercises[i]
// Проверяем прогресс упражнения в localStorage // Проверяем прогресс упражнения в localStorage
const storageKey = `exerciseProgress_${firstCourse.id}_${exercise.id_exercise}_day_${day}` const storageKey = `exerciseProgress_${targetCourse.id}_${exercise.id_exercise}_day_${day}`
const savedProgress = localStorage.getItem(storageKey) const savedProgress = localStorage.getItem(storageKey)
let isCompleted = false let isCompleted = false
@ -194,7 +239,7 @@ export default function Home() {
if (!isCompleted) { if (!isCompleted) {
foundExercise = { foundExercise = {
courseId: firstCourse.id.toString(), courseId: targetCourse.id.toString(),
exerciseId: exercise.id_exercise.toString(), exerciseId: exercise.id_exercise.toString(),
exerciseIndex: i, exerciseIndex: i,
day: Number(day), day: Number(day),
@ -213,7 +258,7 @@ export default function Home() {
if (!foundExercise && exercises.length > 0) { if (!foundExercise && exercises.length > 0) {
const lastExercise = exercises[exercises.length - 1] const lastExercise = exercises[exercises.length - 1]
foundExercise = { foundExercise = {
courseId: firstCourse.id.toString(), courseId: targetCourse.id.toString(),
exerciseId: lastExercise.id_exercise.toString(), exerciseId: lastExercise.id_exercise.toString(),
exerciseIndex: exercises.length - 1, exerciseIndex: exercises.length - 1,
day: lastExercise.day, day: lastExercise.day,
@ -321,9 +366,14 @@ export default function Home() {
} }
const handleExercisesClick = () => { const handleExercisesClick = () => {
if (courses.length > 0) { if (currentExercise) {
// Используем courseId из текущего упражнения (незавершенный курс)
history.push(getRouteCourseExercises(Number.parseInt(currentExercise.courseId)))
} else if (courses.length > 0) {
// Fallback к первому курсу если нет текущего упражнения
history.push(getRouteCourseExercises(courses[0].id)) history.push(getRouteCourseExercises(courses[0].id))
} else { } else {
// Fallback к странице курсов если нет курсов
history.push(getRouteCourses()) history.push(getRouteCourses())
} }
} }