oxios 1.5.2

Oxios Agent OS — Agent Operating System powered by oxi-sdk
import { Power, RefreshCw, Trash2 } from 'lucide-react'
import { useTranslation } from 'react-i18next'
import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
import type { McpServer } from '@/types/mcp'

interface ServerCardProps {
  server: McpServer
  onToggle: () => void
  onRefresh: () => void
  onDelete: () => void
  isToggling: boolean
  isRefreshing: boolean
  isDeleting: boolean
}

export function ServerCard({
  server,
  onToggle,
  onRefresh,
  onDelete,
  isToggling,
  isRefreshing,
  isDeleting,
}: ServerCardProps) {
  const { t } = useTranslation()

  const statusColor = !server.enabled
    ? 'bg-muted-foreground'
    : server.initialized
      ? 'bg-success'
      : 'bg-error'

  const statusText = !server.enabled
    ? t('common.disabled', 'Disabled')
    : server.initialized
      ? t('mcp.connected', 'Connected')
      : t('mcp.disconnected', 'Disconnected')

  return (
    <div className="flex items-center gap-4 rounded-lg border p-4">
      <div className="flex items-center gap-3 flex-1 min-w-0">
        <div className={`h-2.5 w-2.5 rounded-full shrink-0 ${statusColor}`} title={statusText} />
        <div className="flex-1 min-w-0">
          <div className="flex items-center gap-2">
            <span className="font-medium text-sm truncate">{server.name}</span>
            <Badge variant={server.enabled ? 'default' : 'secondary'} className="text-xs">
              {statusText}
            </Badge>
          </div>
          <p className="text-xs text-muted-foreground font-mono truncate mt-0.5">
            {server.command}
            {server.args.length > 0 ? ` ${server.args.join(' ')}` : ''}
          </p>
        </div>
      </div>

      <div className="flex items-center gap-1.5 shrink-0">
        <Button
          variant="ghost"
          size="icon"
          className="h-8 w-8"
          onClick={onRefresh}
          disabled={isRefreshing || !server.enabled}
          title={t('mcp.refresh', 'Refresh')}
        >
          <RefreshCw className={`h-4 w-4 ${isRefreshing ? 'animate-spin' : ''}`} />
        </Button>
        <Button
          variant="ghost"
          size="icon"
          className="h-8 w-8"
          onClick={onToggle}
          disabled={isToggling}
          title={server.enabled ? t('mcp.disable', 'Disable') : t('mcp.enable', 'Enable')}
        >
          <Power className="h-4 w-4" />
        </Button>
        <Button
          variant="ghost"
          size="icon"
          className="h-8 w-8 text-destructive hover:text-destructive"
          onClick={onDelete}
          disabled={isDeleting}
          title={t('mcp.remove', 'Remove')}
        >
          <Trash2 className="h-4 w-4" />
        </Button>
      </div>
    </div>
  )
}