import React, { useMemo, useCallback } 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 { getHeatmapTheme } from "../utils/heatmapColors"; import WeeklyHeatmap from "./WeeklyHeatmap"; 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 }) => { // Memoize the weekly data processing to avoid recalculation on every render const weeklyData = useMemo(() => aggregateToWeeklyData(data), [data]); // Choose data based on view mode const processedData = viewMode === 'weekly' ? weeklyData : data; // Memoize the theme to prevent recreation const theme = useMemo(() => getHeatmapTheme(color), [color]); // Memoize the render block callback const renderBlock = useCallback((block: React.ReactElement, activity: any) => ( {block} ), []); return (
{showHeader && (
{avatarUrl && ( )}

{fullName}

)}
{viewMode === 'weekly' ? ( ) : ( )}
); }; export default React.memo(Heatmap);