"use client"; import { Github, Globe, Star } from "lucide-react"; import Image from "next/image"; import { useEffect, useState } from "react"; import { HoverCard, HoverCardContent, HoverCardTrigger, } from "@/components/ui/hover-card"; import { filterCurrentSponsors, filterSpecialSponsors, formatSponsorUrl, getSponsorUrl, sortSpecialSponsors, } from "@/lib/sponsor-utils"; import type { Sponsor } from "@/lib/types"; export function SpecialSponsorBanner() { const [specialSponsors, setSpecialSponsors] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { fetch("https://sponsors.amanv.dev/sponsors.json") .then((res) => { if (!res.ok) throw new Error("Failed to fetch sponsors"); return res.json(); }) .then((data) => { const sponsorsData = Array.isArray(data) ? data : []; const currentSponsors = filterCurrentSponsors(sponsorsData); const specials = sortSpecialSponsors( filterSpecialSponsors(currentSponsors), ); setSpecialSponsors(specials); setLoading(false); }) .catch(() => { setLoading(false); }); }, []); if (loading) { return (
{["s1", "s2", "s3", "s4"].map((key) => (
))}
); } if (!specialSponsors.length) { return null; } return (
{specialSponsors.map((entry) => { const displayName = entry.sponsor.name || entry.sponsor.login; const imgSrc = entry.sponsor.customLogoUrl || entry.sponsor.avatarUrl; const since = new Date(entry.createdAt).toLocaleDateString( undefined, { year: "numeric", month: "short", }, ); const sponsorUrl = getSponsorUrl(entry); return ( {displayName}
SPECIAL SINCE {since.toUpperCase()}
{displayName}

{displayName}

{entry.tierName ? (

{entry.tierName}

) : null}
{entry.sponsor.login} {entry.sponsor.websiteUrl || entry.sponsor.linkUrl ? ( {formatSponsorUrl(sponsorUrl)} ) : null}
); })}
); }