oxios 1.19.0

Oxios Agent OS — Agent Operating System powered by oxi-sdk
import { Server } from 'lucide-react'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { EditMcpServerDialog } from '@/components/mcp/edit-server-dialog'
import { ServerCard } from '@/components/mcp/server-card'
import { EmptyState } from '@/components/shared/empty-state'
import { ErrorState } from '@/components/shared/error-state'
import { LoadingCards } from '@/components/shared/loading'
import {
  useMcpDeleteServer,
  useMcpRefreshServer,
  useMcpServers,
  useMcpToggleServer,
} from '@/hooks/use-mcp'
import type { McpServer } from '@/types/mcp'

export function ServerList() {
  const { t } = useTranslation()
  const { data: servers, isLoading, isError, refetch } = useMcpServers()
  const deleteServer = useMcpDeleteServer()
  const toggleServer = useMcpToggleServer()
  const refreshServer = useMcpRefreshServer()
  const [editing, setEditing] = useState<McpServer | null>(null)

  if (isLoading) return <LoadingCards count={3} />
  if (isError) return <ErrorState onRetry={() => refetch()} />

  if (!servers || servers.length === 0) {
    return (
      <>
        <EmptyState
          icon={<Server className="h-8 w-8" />}
          title={t('mcp.noServers', 'No MCP servers configured')}
          description={t('mcp.noServersDescription', 'Add an MCP server to get started.')}
          className="py-6"
        />
        <EditMcpServerDialog server={editing} onOpenChange={(o) => !o && setEditing(null)} />
      </>
    )
  }

  return (
    <>
      <div className="space-y-3">
        {servers.map((server) => (
          <ServerCard
            key={server.name}
            server={server}
            onToggle={() => toggleServer.mutate(server.name)}
            onRefresh={() => refreshServer.mutate(server.name)}
            onDelete={() => deleteServer.mutate(server.name)}
            onEdit={() => setEditing(server)}
            isToggling={toggleServer.isPending}
            isRefreshing={refreshServer.isPending}
            isDeleting={deleteServer.isPending}
          />
        ))}
      </div>
      <EditMcpServerDialog server={editing} onOpenChange={(o) => !o && setEditing(null)} />
    </>
  )
}