import React, { useState, useEffect, useCallback } from 'react'; import { Button } from '@/components/ui/index'; import { RefreshCw } from 'lucide-react'; import { RemotesList } from '@/components/Proxmox'; import { AddRemoteForm } from '@/components/Proxmox'; import { EditRemoteForm } from '@/components/Proxmox'; import { RemoveRemoteDialog } from '@/components/Proxmox'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/index'; import { addProxmoxClusterCmd, listProxmoxClustersCmd, removeProxmoxClusterCmd } from '@/lib/tauriCommands'; interface RemoteInfo { id: string; name: string; url: string; username: string; type: 'pve' | 'pbs'; status: 'connected' | 'disconnected' | 'error'; } export function ProxmoxRemotesPage() { const [remotes, setRemotes] = useState([]); const [loading, setLoading] = useState(true); const [showAddDialog, setShowAddDialog] = useState(false); const [editingRemote, setEditingRemote] = useState(null); const [removingRemote, setRemovingRemote] = useState(null); const loadClusters = useCallback(async () => { try { const clusters = await listProxmoxClustersCmd(); const mapped: RemoteInfo[] = clusters.map(c => ({ id: c.id, name: c.name, url: `${c.url}:${c.port}`, username: c.username, type: c.clusterType === 've' ? 'pve' : 'pbs', status: 'connected', })); setRemotes(mapped); } catch (err) { console.error('Failed to load clusters:', err); } finally { setLoading(false); } }, []); useEffect(() => { loadClusters(); }, [loadClusters]); const handleAddRemote = async (config: any) => { try { const cluster = await addProxmoxClusterCmd( Date.now().toString(), config.name, config.type, config.url.replace(/^https?:\/\//, '').split(':')[0], parseInt(config.url.split(':').pop()) || (config.type === 'pve' ? 8006 : 8007), config.username, config.password || '' ); const newRemote: RemoteInfo = { id: cluster.id, name: cluster.name, url: `${cluster.url}:${cluster.port}`, username: cluster.username, type: cluster.clusterType === 've' ? 'pve' : 'pbs', status: 'connected', }; setRemotes([...remotes, newRemote]); setShowAddDialog(false); } catch (err) { console.error('Failed to add remote:', err); alert('Failed to add cluster. Check console for details.'); } }; const handleEditRemote = async (config: any) => { try { await addProxmoxClusterCmd( config.id, config.name, config.type === 'pve' ? 've' : 'pbs', config.url.split(':')[0], parseInt(config.url.split(':').pop()) || (config.type === 'pve' ? 8006 : 8007), config.username, '' ); setRemotes(remotes.map(r => r.id === config.id ? { ...r, ...config } as RemoteInfo : r)); setEditingRemote(null); } catch (err) { console.error('Failed to update remote:', err); alert('Failed to update cluster. Check console for details.'); } }; const handleRemoveRemote = async () => { if (removingRemote) { try { await removeProxmoxClusterCmd(removingRemote.id); setRemotes(remotes.filter(r => r.id !== removingRemote.id)); setRemovingRemote(null); } catch (err) { console.error('Failed to remove remote:', err); alert('Failed to remove cluster. Check console for details.'); } } }; return (

Remotes

Manage Proxmox VE and Backup Server connections

{ setEditingRemote(remote as RemoteInfo | null); }} onDelete={(remote) => { setRemovingRemote(remote as RemoteInfo | null); }} /> {showAddDialog && ( Add New Remote setShowAddDialog(false)} /> )} {editingRemote !== null && ( setEditingRemote(null)}> Edit Remote setEditingRemote(null)} /> )} {removingRemote !== null && ( setRemovingRemote(null)}> Remove Remote setRemovingRemote(null)} /> )}
); }