import React, { useState, useEffect, useMemo } from "react"; import { ProviderInfo, ModelData, CalendarData } from "../types/heatmap"; import OrganizationButton from "../components/OrganizationButton"; import HeatmapGrid from "../components/HeatmapGrid"; import Navbar from "../components/Navbar"; import TagSelector from "../components/TagSelector"; import { getProviders } from "../utils/ranking"; import { ORGANIZATIONS, SCIENTIFIC_TAGS } from "../constants/organizations"; interface PageProps { calendarData: CalendarData; providers: ProviderInfo[]; } function Page({ calendarData, providers, }: PageProps) { const [isLoading, setIsLoading] = useState(true); const [selectedTags, setSelectedTags] = useState([]); const [showAllOrgs, setShowAllOrgs] = useState(false); useEffect(() => { if (calendarData && Object.keys(calendarData).length > 0) { setIsLoading(false); } }, [calendarData]); // Filter providers based on selected tags const filteredProviders = useMemo(() => { if (selectedTags.length === 0) { return providers; } return providers.filter(provider => { if (!provider.tags) return false; return selectedTags.some(tag => provider.tags!.includes(tag)); }); }, [providers, selectedTags]); const handleTagToggle = (tagId: string) => { setSelectedTags(prev => { if (prev.includes(tagId)) { return prev.filter(t => t !== tagId); } else { return [...prev, tagId]; } }); }; return (

Hugging Science Heatmap Hugging Face icon

Open models, datasets, and apps from orgs contributing to AI4Science in the last year.

{/* Tag Selector */}
{/* Organization Buttons with Horizontal Scroll */}
{/* Scrollable container with visible scrollbar */}
{(showAllOrgs ? filteredProviders : filteredProviders.slice(0, 10)).map((provider, index) => ( ))}
{/* Visual scroll indicators */}
{/* Show More/Less Button */} {filteredProviders.length > 10 && (
)}
); } export async function getStaticProps() { try { const { calendarData, providers } = await getProviders(ORGANIZATIONS); return { props: { calendarData, providers, }, revalidate: 3600, // regenerate every hour }; } catch (error) { console.error("Error fetching data:", error); return { props: { calendarData: {}, providers: ORGANIZATIONS, }, revalidate: 60, // retry after 1 minute if there was an error }; } } export default Page;