'use client' import { ChevronLeft, ChevronRight } from 'lucide-react' import { getUriWithOrg } from '@services/config/config' import { useRouter } from 'next/navigation' import React, { useEffect, useState, useRef, useMemo, memo } from 'react' import ActivityIndicators from '@components/Pages/Courses/ActivityIndicators' import ActivityChapterDropdown from './ActivityChapterDropdown' import { getCourseThumbnailMediaDirectory } from '@services/media/media' import { useOrg } from '@components/Contexts/OrgContext' interface FixedActivitySecondaryBarProps { course: any currentActivityId: string orgslug: string activity: any } // Memoized navigation buttons component const NavigationButtons = memo(({ prevActivity, nextActivity, currentIndex, allActivities, navigateToActivity }: { prevActivity: any, nextActivity: any, currentIndex: number, allActivities: any[], navigateToActivity: (activity: any) => void }) => (
{currentIndex + 1} of {allActivities.length}
)); NavigationButtons.displayName = 'NavigationButtons'; // Memoized course info component const CourseInfo = memo(({ course, org }: { course: any, org: any }) => (

Course

{course.name}

)); CourseInfo.displayName = 'CourseInfo'; export default function FixedActivitySecondaryBar(props: FixedActivitySecondaryBarProps): React.ReactNode { const router = useRouter(); const [isScrolled, setIsScrolled] = useState(false); const [shouldShow, setShouldShow] = useState(false); const mainActivityInfoRef = useRef(null); const org = useOrg() as any; // Memoize activity position calculation const { allActivities, currentIndex } = useMemo(() => { let allActivities: any[] = []; let currentIndex = -1; props.course.chapters.forEach((chapter: any) => { chapter.activities.forEach((activity: any) => { const cleanActivityUuid = activity.activity_uuid?.replace('activity_', ''); allActivities.push({ ...activity, cleanUuid: cleanActivityUuid, chapterName: chapter.name }); if (cleanActivityUuid === props.currentActivityId.replace('activity_', '')) { currentIndex = allActivities.length - 1; } }); }); return { allActivities, currentIndex }; }, [props.course, props.currentActivityId]); const prevActivity = currentIndex > 0 ? allActivities[currentIndex - 1] : null; const nextActivity = currentIndex < allActivities.length - 1 ? allActivities[currentIndex + 1] : null; const navigateToActivity = (activity: any) => { if (!activity) return; const cleanCourseUuid = props.course.course_uuid?.replace('course_', ''); router.push(getUriWithOrg(props.orgslug, '') + `/course/${cleanCourseUuid}/activity/${activity.cleanUuid}`); }; useEffect(() => { const handleScroll = () => { setIsScrolled(window.scrollY > 0); }; const observer = new IntersectionObserver( ([entry]) => { setShouldShow(!entry.isIntersecting); }, { threshold: [0, 0.1, 1], rootMargin: '-80px 0px 0px 0px' } ); const mainActivityInfo = document.querySelector('.activity-info-section'); if (mainActivityInfo) { mainActivityInfoRef.current = mainActivityInfo as HTMLDivElement; observer.observe(mainActivityInfo); } window.addEventListener('scroll', handleScroll); return () => { window.removeEventListener('scroll', handleScroll); if (mainActivityInfoRef.current) { observer.unobserve(mainActivityInfoRef.current); } }; }, []); if (!shouldShow) return null; return (
); }