import { useEffect, useState } from "react"; // Avatar image with a graceful fallback. // // Uses referrerPolicy="no-referrer" because Google's avatar CDNs // (yt3.ggpht.com / lh3.googleusercontent.com) rate-limit bursts of // referrer-bearing requests — when a feed page fires dozens of avatar loads at // once, a random subset gets throttled (HTTP 429) and the browser shows its // broken-image icon. Dropping the referrer makes those CDNs serve the images. // If a load still fails we render a neutral placeholder (optionally an initial) // instead of the broken-image icon. export default function Avatar({ src, alt = "", fallback, className = "", }: { src?: string | null; alt?: string; fallback?: string; // a name/title; its first letter is shown when there's no image className?: string; }) { const [failed, setFailed] = useState(false); useEffect(() => setFailed(false), [src]); if (src && !failed) { return ( {alt} setFailed(true)} className={className} /> ); } const initial = fallback?.trim()?.[0]?.toUpperCase() ?? ""; return (
{initial}
); }