feat: perf improvements and bug fixes

This commit is contained in:
swve 2025-06-12 16:09:41 +02:00
parent 93d0e2a104
commit 59bae82ee7
10 changed files with 200 additions and 112 deletions

View file

@ -9,6 +9,7 @@ interface ActivityChapterDropdownProps {
course: any
currentActivityId: string
orgslug: string
trailData?: any
}
export default function ActivityChapterDropdown(props: ActivityChapterDropdownProps): React.ReactNode {
@ -16,6 +17,9 @@ export default function ActivityChapterDropdown(props: ActivityChapterDropdownPr
const dropdownRef = React.useRef<HTMLDivElement>(null);
const isMobile = useMediaQuery('(max-width: 768px)');
// Clean up course UUID by removing 'course_' prefix if it exists
const cleanCourseUuid = props.course.course_uuid?.replace('course_', '');
// Close dropdown when clicking outside
React.useEffect(() => {
function handleClickOutside(event: MouseEvent) {
@ -100,9 +104,20 @@ export default function ActivityChapterDropdown(props: ActivityChapterDropdownPr
<div className="py-0.5">
{chapter.activities.map((activity: any) => {
const cleanActivityUuid = activity.activity_uuid?.replace('activity_', '');
const cleanCourseUuid = props.course.course_uuid?.replace('course_', '');
const isCurrent = cleanActivityUuid === props.currentActivityId.replace('activity_', '');
// Find the correct run and check if activity is complete
const run = props.trailData?.runs?.find(
(run: any) => {
const cleanRunCourseUuid = run.course?.course_uuid?.replace('course_', '');
return cleanRunCourseUuid === cleanCourseUuid;
}
);
const isComplete = run?.steps?.find(
(step: any) => step.activity_id === activity.id && step.complete === true
);
return (
<Link
key={activity.id}
@ -117,11 +132,7 @@ export default function ActivityChapterDropdown(props: ActivityChapterDropdownPr
>
<div className="flex space-x-2 items-center">
<div className="flex items-center">
{props.course.trail?.runs?.find(
(run: any) => run.course_id === props.course.id
)?.steps?.find(
(step: any) => (step.activity_id === activity.id || step.activity_id === activity.activity_uuid) && step.complete === true
) ? (
{isComplete ? (
<div className="relative cursor-pointer">
<Check size={14} className="stroke-[2.5] text-teal-600" />
</div>

View file

@ -12,6 +12,7 @@ interface Props {
course_uuid: string
current_activity?: string
enableNavigation?: boolean
trailData?: any
}
// Helper functions
@ -109,8 +110,6 @@ function ActivityIndicators(props: Props) {
const black_activity_style = 'bg-zinc-300 hover:bg-zinc-400'
const current_activity_style = 'bg-gray-600 animate-pulse hover:bg-gray-700'
const trail = props.course.trail
// Flatten all activities for navigation and rendering
const allActivities = useMemo(() => {
return course.chapters.flatMap((chapter: any) =>
@ -131,14 +130,23 @@ function ActivityIndicators(props: Props) {
// Memoize activity status checks
const isActivityDone = useMemo(() => (activity: any) => {
let run = props.course.trail?.runs.find(
(run: any) => run.course_id == props.course.id
)
// Clean up course UUID by removing 'course_' prefix if it exists
const cleanCourseUuid = course.course_uuid?.replace('course_', '');
let run = props.trailData?.runs?.find(
(run: any) => {
const cleanRunCourseUuid = run.course?.course_uuid?.replace('course_', '');
return cleanRunCourseUuid === cleanCourseUuid;
}
);
if (run) {
return run.steps.find((step: any) => step.activity_id == activity.id)
return run.steps.find(
(step: any) => step.activity_id === activity.id && step.complete === true
);
}
return false
}, [props.course]);
return false;
}, [props.trailData, course.course_uuid]);
const isActivityCurrent = useMemo(() => (activity: any) => {
let activity_uuid = activity.activity_uuid.replace('activity_', '')