import { useEffect, useState } from 'react' interface Release { repo: string version: string name: string publishedAt: string url: string } function timeAgo(iso: string): string { const diff = Date.now() - new Date(iso).getTime() const days = Math.floor(diff / 86400000) if (days === 0) return 'today' if (days === 1) return 'yesterday' if (days < 30) return `${days}d ago` const months = Math.floor(days / 30) if (months < 12) return `${months}mo ago` return `${Math.floor(months / 12)}y ago` } export function GithubReleasesWidget() { const [releases, setReleases] = useState([]) const [error, setError] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { fetch('/api/updates/github') .then(r => r.json()) .then(d => { if (d.error) setError(d.error) else setReleases(d.releases) }) .catch(() => setError('Failed to fetch releases')) .finally(() => setLoading(false)) }, []) return (
GitHub Releases
{!loading && !error && ( {releases.length} tracked )}
{loading &&
Fetching releases…
} {error &&
⚠ {error}
} {!loading && !error && (
{releases.map(r => (
{r.repo.split('/')[1]} {r.repo.split('/')[0]}
{r.version}
{timeAgo(r.publishedAt)}
))}
)}
) }