import { useEffect, useState } from "react"; import { createSSHKey, deleteSSHKey, listSSHKeys, type SSHKey } from "../api/ssh_keys"; import { Icon } from "../components/icon"; export const SSHKeysPage = () => { const [keys, setKeys] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [newKeyName, setNewKeyName] = useState(""); const [generating, setGenerating] = useState(false); useEffect(() => { loadKeys(); }, []); async function loadKeys() { try { setLoading(true); const data = await listSSHKeys(); setKeys(data); setError(null); } catch { setError("Failed to load SSH keys"); } finally { setLoading(false); } } async function handleGenerate(e: React.FormEvent) { e.preventDefault(); if (!newKeyName.trim()) return; try { setGenerating(true); await createSSHKey({ name: newKeyName.trim() }); setNewKeyName(""); await loadKeys(); } catch { setError("Failed to generate SSH key"); } finally { setGenerating(false); } } async function handleDelete(keyId: string) { if (!confirm("Are you sure you want to delete this SSH key?")) return; try { await deleteSSHKey(keyId); await loadKeys(); } catch { setError("Failed to delete SSH key"); } } function copyToClipboard(text: string) { navigator.clipboard.writeText(text); } if (loading) return
Loading...
; return (

SSH Keys

{error &&
{error}
}
setNewKeyName(e.target.value)} placeholder="e.g., GitHub Work" required />
{keys.length === 0 ? (

No SSH keys yet. Generate one above.

) : ( keys.map((key) => (

{key.name}

Created: {new Date(key.created_at).toLocaleDateString()}
{key.public_key.substring(0, 50)}...
)) )}
); };