import React, { useEffect, useState } from "react"; import ActivityCalendar from "react-activity-calendar"; import { Tooltip, Avatar } from "@mui/material"; import Link from "next/link"; import { aggregateToWeeklyData } from "../utils/weeklyCalendar"; import WeeklyHeatmap from "./WeeklyHeatmap"; import { getHeatmapTheme, getHeatmapColorIntensity } from "../utils/heatmapColors"; type ViewMode = 'daily' | 'weekly'; type HeatmapProps = { data: Array<{ date: string; count: number; level: number }>; color: string; providerName: string; fullName: string; avatarUrl: string; authorId: string; showHeader?: boolean; viewMode: ViewMode; }; const Heatmap: React.FC = ({ data, color, providerName, fullName, avatarUrl, authorId, showHeader = true, viewMode }) => { // Process data based on view mode const processedData = viewMode === 'weekly' ? aggregateToWeeklyData(data) : data; // Track theme state for proper ActivityCalendar theming const [isDarkMode, setIsDarkMode] = useState(false); useEffect(() => { // Check initial theme const checkTheme = () => { setIsDarkMode(document.documentElement.classList.contains('dark')); }; checkTheme(); // Watch for theme changes const observer = new MutationObserver(checkTheme); observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }); return () => observer.disconnect(); }, []); // Use theme-aware colors const emptyColor = isDarkMode ? "#374151" : "#d1d5db"; // Create the correct color progression based on current theme const getThemeAwareColors = () => { const colors = [emptyColor]; // level 0 for (let level = 1; level <= 4; level++) { const intensity = getHeatmapColorIntensity(level, color, isDarkMode); if (intensity) { colors.push(intensity); } } return colors; }; const themeColors = getThemeAwareColors(); return (
{showHeader && (
{avatarUrl && ( )}

{fullName}

)}
{viewMode === 'weekly' ? ( ) : ( { const activityData = activity as any; // Type assertion since react-activity-calendar may not have our extended type const itemsText = activityData.items && activityData.items.length > 0 ? activityData.items.join(', ') : 'No releases'; const tooltipTitle = activity.count > 0 ? `${activity.count} new repos on ${activity.date}: ${itemsText}` : `No repos on ${activity.date}`; return ( {block} ); }} /> )}
); }; export default Heatmap;