import { useState } from 'react' interface RepoAvatarProps { ownerName: string name: string avatarUrl?: string size?: number className?: string } // Consistent color per repo name (not random on each render) function hashColor(name: string): string { const palette = [ 'var(--c-brand)', 'var(--c-success)', '#FF5630', 'var(--c-warning)', '#6554C0', '#00B8D9', '#36B37E', 'var(--c-text)', ] let hash = 0 for (let i = 0; i < name.length; i++) hash = (hash * 31 + name.charCodeAt(i)) | 0 return palette[Math.abs(hash) % palette.length] } export function RepoAvatar({ ownerName, name, avatarUrl, size = 32, className = '' }: RepoAvatarProps) { const [imgError, setImgError] = useState(false) // Use provided avatarUrl; fall back to the API endpoint (which 404s if not set → onError fires) const src = avatarUrl || `/api/v1/repos/${ownerName}/${name}/avatar` const letter = (name[0] ?? '?').toUpperCase() const bg = hashColor(name) const fontSize = Math.round(size * 0.42) const style = { width: size, height: size, minWidth: size, minHeight: size, fontSize } if (!imgError) { return ( {name} setImgError(true)} /> ) } return (
{letter}
) }