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 intensity levels for daily view (same as weekly) const intensityColors = [ emptyColor, // level 0 getHeatmapColorIntensity(1, color), // level 1 (40% intensity) getHeatmapColorIntensity(2, color), // level 2 (60% intensity) getHeatmapColorIntensity(3, color), // level 3 (80% intensity) getHeatmapColorIntensity(4, color) // level 4 (100% intensity) ].filter((color): color is string => color !== null); // Remove any null values and type guard return (
{showHeader && (
{avatarUrl && ( )}

{fullName}

)}
{viewMode === 'weekly' ? ( ) : ( ( {block} )} /> )}
); }; export default Heatmap;