import React, { useState, useCallback } from 'react'; import { Tooltip } from 'primereact/tooltip'; import { formatDateTime } from "@/utils/time"; const ActivityContributionChart = ({ session }) => { const [contributionData, setContributionData] = useState({}); const [totalActivities, setTotalActivities] = useState(0); // Prepare activity data const prepareActivityData = useCallback(() => { if (!session?.user?.userCourses) return {}; const activityData = {}; const allActivities = []; // ... existing course activities processing ... session.user.userCourses.forEach(courseProgress => { if (courseProgress.started) { const startDate = new Date(courseProgress.startedAt); startDate.setFullYear(new Date().getFullYear()); const date = startDate.toISOString().split('T')[0]; activityData[date] = (activityData[date] || 0) + 1; allActivities.push({ type: 'course_started', name: courseProgress.course?.name, date: date }); } // ... rest of the course processing ... }); // ... existing lesson activities processing ... session.user.userLessons?.forEach(lessonProgress => { // ... lesson processing ... }); setContributionData(activityData); setTotalActivities(Object.values(activityData).reduce((a, b) => a + b, 0)); return activityData; }, [session]); // Initialize data React.useEffect(() => { prepareActivityData(); }, [prepareActivityData]); const getColor = useCallback((count) => { if (count === 0) return 'bg-gray-100'; if (count === 1) return 'bg-purple-300'; if (count === 2) return 'bg-purple-400'; if (count === 3) return 'bg-purple-600'; return 'bg-purple-700'; }, []); const generateCalendar = useCallback(() => { const today = new Date(); const oneYearAgo = new Date(today.getFullYear() - 1, today.getMonth(), today.getDate()); const calendar = []; // Create 7 rows for days of the week for (let i = 0; i < 7; i++) { calendar[i] = []; } // Fill in the dates for (let d = new Date(oneYearAgo); d <= today; d.setDate(d.getDate() + 1)) { const dateString = d.toISOString().split('T')[0]; const activityCount = contributionData[dateString] || 0; calendar[d.getDay()].push({ date: new Date(d), count: activityCount }); } return calendar; }, [contributionData]); const getMonthLabels = useCallback(() => { const today = new Date(); const oneYearAgo = new Date(today.getFullYear() - 1, today.getMonth(), today.getDate()); const months = []; let currentMonth = -1; const calendar = generateCalendar(); for (let d = new Date(oneYearAgo); d <= today; d.setDate(d.getDate() + 1)) { const month = d.getMonth(); if (month !== currentMonth) { months.push({ name: d.toLocaleString('default', { month: 'short' }), index: calendar[0].findIndex( (_, weekIndex) => calendar[0][weekIndex]?.date.getMonth() === month ) }); currentMonth = month; } } return months; }, [generateCalendar]); const calendar = generateCalendar(); const weekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; return (