'use client' import { useEffect, useState } from 'react' import { Rocket, RefreshCw, ExternalLink, CheckCircle, Clock, AlertCircle, Cloud, Zap, Train } from 'lucide-react' interface Deployment { id: string; platform: 'vercel' | 'cloudflare' | 'railway' project: string; url: string; state: string branch: string; commit: string; createdAt: string; triggeredBy: string } const PLATFORM_COLORS: Record = { vercel: '#fff', cloudflare: '#F5A623', railway: '#9C27B0', } const PLATFORM_ICONS: Record = { vercel: Cloud, cloudflare: Zap, railway: Train } const STATE_COLORS: Record = { ready: '#22c55e', active: '#22c55e', succeeded: '#22c55e', building: '#F5A623', queued: '#2979FF', error: '#ef4444', failed: '#ef4444', cancelled: '#888', } const STATE_ICONS: Record = { ready: CheckCircle, active: CheckCircle, succeeded: CheckCircle, building: Clock, queued: Clock, error: AlertCircle, failed: AlertCircle, } function timeAgo(iso: string) { const diff = Date.now() - new Date(iso).getTime() const m = Math.floor(diff / 60000), h = Math.floor(m / 60), d = Math.floor(h / 24) if (d > 0) return `${d}d ago` if (h > 0) return `${h}h ago` if (m > 0) return `${m}m ago` return 'just now' } export default function DeploymentsPage() { const [data, setData] = useState<{ deployments: Deployment[]; counts: any } | null>(null) const [loading, setLoading] = useState(true) const [filter, setFilter] = useState('all') const [refreshing, setRefreshing] = useState(false) const load = async () => { setRefreshing(true) try { const r = await fetch('/api/deployments') setData(await r.json()) } finally { setRefreshing(false); setLoading(false) } } useEffect(() => { load() }, []) const deployments = (data?.deployments || []).filter(d => filter === 'all' || d.platform === filter) return (

Deployments

Vercel · Railway · Cloudflare

{/* Platform counts */}
{['all', 'vercel', 'cloudflare', 'railway'].map(p => { const count = p === 'all' ? data?.counts?.total : data?.counts?.[p] const PlatIcon = p !== 'all' ? PLATFORM_ICONS[p] : Rocket return ( ) })}
{loading ? (
Loading deployments…
) : (
{deployments.map(dep => { const PlatIcon = PLATFORM_ICONS[dep.platform] || Cloud const StateIcon = STATE_ICONS[dep.state] || CheckCircle const stateColor = STATE_COLORS[dep.state] || '#888' const platColor = PLATFORM_COLORS[dep.platform] || '#aaa' return (
{dep.project} {dep.branch}
{dep.commit}
{dep.state}
{timeAgo(dep.createdAt)}
) })} {deployments.length === 0 && (
No deployments found for this filter
)}
)}
) }