// Dashboard/Courses/CoursesList.jsx function CoursesList({ onSelect }) { const [courses, setCourses] = React.useState([]); const [q, setQ] = React.useState(""); const [loading, setLoading] = React.useState(true); const [selectedTag, setSelectedTag] = React.useState(""); const [showAll, setShowAll] = React.useState(false); const [enrolledMap, setEnrolledMap] = React.useState(() => { try { const raw = localStorage.getItem("mta_enrolled_courses"); return raw ? JSON.parse(raw) : {}; } catch { return {}; } }); React.useEffect(() => { let mounted = true; fetch("Dashboard/Courses/courses.json") .then(r => r.json()) .then(data => { if (mounted) setCourses(data); }) .catch(err => { console.error("courses.json load error", err); if (mounted) setCourses([]); }) .finally(() => { if (mounted) setLoading(false); }); return () => { mounted = false; }; }, []); React.useEffect(() => { try { localStorage.setItem("mta_enrolled_courses", JSON.stringify(enrolledMap)); } catch {} }, [enrolledMap]); const allTags = React.useMemo(() => { const s = new Set(); courses.forEach(c => (c.tags || []).forEach(t => s.add(t))); return Array.from(s).sort(); }, [courses]); const filtered = React.useMemo(() => { // Если пользователь нажал "Показать все" — возвращаем все курсы if (showAll) return courses; const qq = q.trim().toLowerCase(); return courses.filter(c => { if (selectedTag && !(c.tags || []).includes(selectedTag)) return false; if (!qq) return true; return ( c.title.toLowerCase().includes(qq) || (c.summary || "").toLowerCase().includes(qq) || (c.tags || []).some(t => t.toLowerCase().includes(qq)) ); }); }, [q, courses, selectedTag, showAll]); function toggleEnroll(id) { setEnrolledMap(prev => { const next = { ...prev }; if (next[id]) delete next[id]; else next[id] = { enrolledAt: Date.now(), progress: 0 }; return next; }); } function handleShowAll() { // Сбрасываем фильтры и включаем showAll на короткое время setQ(""); setSelectedTag(""); setShowAll(true); // Отключаем подсветку через 1.5 секунды (опционально) setTimeout(() => setShowAll(false), 1500); // Прокрутка к списку (опционально) const el = document.querySelector(".courses-list-block"); if (el) el.scrollIntoView({ behavior: "smooth", block: "start" }); } return (