'use client' import { useState, useEffect } from 'react' import { motion } from 'framer-motion' import { GitBranch, CheckCircle, XCircle, Loader2, AlertCircle } from 'lucide-react' interface CIStatus { status: string conclusion?: string title?: string branch?: string url?: string updatedAt?: string error?: string } export function CIStatusIndicator() { const [ciStatus, setCIStatus] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { const fetchStatus = async () => { try { const res = await fetch('/api/ci-status') const data = await res.json() setCIStatus(data) } catch { setCIStatus({ status: 'error', error: 'Failed to fetch' }) } finally { setLoading(false) } } fetchStatus() // Poll every 60 seconds const interval = setInterval(fetchStatus, 60000) return () => clearInterval(interval) }, []) const getStatusIcon = () => { if (loading) return if (!ciStatus || ciStatus.status === 'error') return if (ciStatus.conclusion === 'success') return if (ciStatus.conclusion === 'failure') return if (ciStatus.status === 'in_progress' || ciStatus.status === 'queued') { return } return } const getStatusColor = () => { if (loading) return 'text-gray-400' if (!ciStatus || ciStatus.status === 'error') return 'text-gray-400' if (ciStatus.conclusion === 'success') return 'text-green-500' if (ciStatus.conclusion === 'failure') return 'text-red-500' if (ciStatus.status === 'in_progress' || ciStatus.status === 'queued') { return 'text-yellow-500' } return 'text-gray-400' } const getStatusText = () => { if (loading) return 'Checking...' if (!ciStatus || ciStatus.status === 'error') return 'Unknown' if (ciStatus.conclusion === 'success') return 'Passing' if (ciStatus.conclusion === 'failure') return 'Failed' if (ciStatus.status === 'in_progress') return 'Running' if (ciStatus.status === 'queued') return 'Queued' return ciStatus.status } const content = ( {process.env.NEXT_PUBLIC_COMMIT_SHA ? ( {process.env.NEXT_PUBLIC_COMMIT_SHA} ) : ( CI )}
{getStatusIcon()} {getStatusText()}
) if (ciStatus?.url) { return ( {content} ) } return content }