import { useState, useEffect } from 'react'; import ActivityCalendar from 'react-activity-calendar'; import { Tooltip } from '@mui/material'; import Link from 'next/link'; import { fetchAllModelData, generateCalendarData, aggregateCalendarData, CalendarData, Activity } from '@/utils/modelData'; import { PROVIDERS_MAP } from '@/utils/providers'; interface OpenSourceHeatmapProps { calendarData: CalendarData & { total: Activity[] }; } export const getStaticProps = async () => { try { const modelData = await fetchAllModelData(); const calendarData = generateCalendarData(modelData); return { props: { calendarData: { total: aggregateCalendarData(calendarData), ...calendarData } }, revalidate: process.env.VERCEL_ENV === 'production' ? 43200 : 3600, // 12 hours in production, 1 hour in development }; } catch (error) { console.error('Error fetching model data:', error); return { props: { calendarData: { total: [] } }, revalidate: 3600, // 1 hour on error }; } }; const OpenSourceHeatmap: React.FC = ({ calendarData }) => { const [isLoading, setIsLoading] = useState(true); useEffect(() => { if (calendarData && calendarData.total && calendarData.total.length > 0) { setIsLoading(false); } }, [calendarData]); return (

Chinese AI Open Source Heatmap 🤗

Visualize the activity of Chinese AI models and datasets

View Trends
{isLoading ? (

Loading...

) : (
{/* Total Activity Heatmap */}

Total Activity

( {block} )} />

Activity by Organization

{/* Individual Provider Heatmaps */} {Object.entries(PROVIDERS_MAP) .sort(([keyA], [keyB]) => (calendarData[keyB] || []).reduce((sum, day) => sum + day.count, 0) - (calendarData[keyA] || []).reduce((sum, day) => sum + day.count, 0) ) .map(([providerName, { color }]) => (

{providerName}

( {block} )} />
))}
)}
); }; export default OpenSourceHeatmap;