'use client'; import { useState } from 'react'; import type { Server, CreateServerData } from '../../types/server'; import { ServerForm } from './ServerForm'; import { Button } from './ui/button'; import { ConfirmationModal } from './ConfirmationModal'; import { PublicKeyModal } from './PublicKeyModal'; import { ServerStoragesModal } from './ServerStoragesModal'; import { Key, Database } from 'lucide-react'; interface ServerListProps { servers: Server[]; onUpdate: (id: number, data: CreateServerData) => void; onDelete: (id: number) => void; } export function ServerList({ servers, onUpdate, onDelete }: ServerListProps) { const [editingId, setEditingId] = useState(null); const [testingConnections, setTestingConnections] = useState>(new Set()); const [connectionResults, setConnectionResults] = useState>(new Map()); const [confirmationModal, setConfirmationModal] = useState<{ isOpen: boolean; variant: 'danger'; title: string; message: string; confirmText: string; onConfirm: () => void; } | null>(null); const [showPublicKeyModal, setShowPublicKeyModal] = useState(false); const [publicKeyData, setPublicKeyData] = useState<{ publicKey: string; serverName: string; serverIp: string; } | null>(null); const [showStoragesModal, setShowStoragesModal] = useState(false); const [selectedServerForStorages, setSelectedServerForStorages] = useState<{ id: number; name: string } | null>(null); const handleEdit = (server: Server) => { setEditingId(server.id); }; const handleUpdate = (data: CreateServerData) => { if (editingId) { onUpdate(editingId, data); setEditingId(null); } }; const handleCancel = () => { setEditingId(null); }; const handleViewPublicKey = async (server: Server) => { try { const response = await fetch(`/api/servers/${server.id}/public-key`); if (!response.ok) { throw new Error('Failed to retrieve public key'); } const data = await response.json() as { success: boolean; publicKey?: string; serverName?: string; serverIp?: string; error?: string }; if (data.success) { setPublicKeyData({ publicKey: data.publicKey ?? '', serverName: data.serverName ?? '', serverIp: data.serverIp ?? '' }); setShowPublicKeyModal(true); } else { throw new Error(data.error ?? 'Failed to retrieve public key'); } } catch (error) { console.error('Error retrieving public key:', error); // You could show a toast notification here } }; const handleDelete = (id: number) => { const server = servers.find(s => s.id === id); if (!server) return; setConfirmationModal({ isOpen: true, variant: 'danger', title: 'Delete Server', message: `This will permanently delete the server configuration "${server.name}" (${server.ip}) and all associated installed scripts. This action cannot be undone!`, confirmText: server.name, onConfirm: () => { onDelete(id); setConfirmationModal(null); } }); }; const handleTestConnection = async (server: Server) => { setTestingConnections(prev => new Set(prev).add(server.id)); setConnectionResults(prev => { const newMap = new Map(prev); newMap.delete(server.id); return newMap; }); try { const response = await fetch(`/api/servers/${server.id}/test-connection`, { method: 'POST', }); const result = await response.json(); setConnectionResults(prev => new Map(prev).set(server.id, { success: result.success, message: result.message })); } catch { setConnectionResults(prev => new Map(prev).set(server.id, { success: false, message: 'Failed to test connection - network error' })); } finally { setTestingConnections(prev => { const newSet = new Set(prev); newSet.delete(server.id); return newSet; }); } }; if (servers.length === 0) { return (

No servers configured

Get started by adding a new server configuration above.

); } return (
{servers.map((server) => (
{editingId === server.id ? (

Edit Server

) : (

{server.name}

{server.ip} {server.user}
Created: {server.created_at ? new Date(server.created_at).toLocaleDateString() : 'Unknown'} {server.updated_at && server.updated_at !== server.created_at && ( • Updated: {new Date(server.updated_at).toLocaleDateString()} )}
{/* Connection Test Result */} {connectionResults.has(server.id) && (
{connectionResults.get(server.id)?.success ? ( ) : ( )} {connectionResults.get(server.id)?.success ? 'Connection Successful' : 'Connection Failed'}

{connectionResults.get(server.id)?.message}

)}
{/* View Public Key button - only show for generated keys */} {server.key_generated === true && ( )}
)}
))} {/* Confirmation Modal */} {confirmationModal && ( setConfirmationModal(null)} onConfirm={confirmationModal.onConfirm} title={confirmationModal.title} message={confirmationModal.message} variant={confirmationModal.variant} confirmText={confirmationModal.confirmText} confirmButtonText="Delete Server" cancelButtonText="Cancel" /> )} {/* Public Key Modal */} {publicKeyData && ( { setShowPublicKeyModal(false); setPublicKeyData(null); }} publicKey={publicKeyData.publicKey} serverName={publicKeyData.serverName} serverIp={publicKeyData.serverIp} /> )} {/* Server Storages Modal */} {selectedServerForStorages && ( { setShowStoragesModal(false); setSelectedServerForStorages(null); }} serverId={selectedServerForStorages.id} serverName={selectedServerForStorages.name} /> )}
); }