File size: 2,175 Bytes
9b2dc95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { RepoStatus } from '../types';

interface StatusCardProps {
  status: RepoStatus | null;
  namespace: string;
  repo: string;
  loading?: boolean;
}

export function StatusCard({ status, namespace, repo, loading }: StatusCardProps) {
  const getStateColor = (state: string) => {
    switch (state) {
      case 'CONNECTED': return 'bg-green-500';
      case 'DISCONNECTED': return 'bg-gray-500';
      case 'ERROR': return 'bg-red-500';
      default: return 'bg-gray-500';
    }
  };

  const getHealthColor = (stage: string) => {
    switch (stage) {
      case 'Running': return 'text-green-400';
      case 'Sleeping': return 'text-yellow-400';
      case 'Building': return 'text-blue-400';
      default: return 'text-gray-400';
    }
  };

  const getHealthBg = (stage: string) => {
    switch (stage) {
      case 'Running': return 'bg-green-500/20';
      case 'Sleeping': return 'bg-yellow-500/20';
      case 'Building': return 'bg-blue-500/20';
      default: return 'bg-gray-500/20';
    }
  };

  if (loading) {
    return (
      <div className="bg-gray-800 rounded-lg p-4 animate-pulse">
        <div className="h-4 bg-gray-700 rounded w-1/3 mb-2"></div>
        <div className="h-6 bg-gray-700 rounded w-1/2"></div>
      </div>
    );
  }

  return (
    <div className="bg-gray-800 rounded-lg p-4 border border-gray-700">
      <div className="flex items-center justify-between mb-2">
        <span className="text-gray-400 text-sm font-medium">{namespace}/{repo}</span>
        <div className={`w-2 h-2 rounded-full ${getStateColor(status?.state || 'DISCONNECTED')}`}></div>
      </div>
      <div className="flex items-center gap-2">
        <span className={`text-2xl font-bold ${getHealthColor(status?.stage || 'Unknown')}`}>
          {status?.stage || 'Unknown'}
        </span>
        <span className={`px-2 py-0.5 rounded text-xs ${getHealthBg(status?.stage || 'Unknown')}`}>
          {status?.state || 'DISCONNECTED'}
        </span>
      </div>
      <div className="text-gray-500 text-xs mt-2">
        Last updated: {status?.last_updated ? new Date(status.last_updated).toLocaleTimeString() : 'Never'}
      </div>
    </div>
  );
}