'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 }) => (
));
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 (
);
}