import React, { useEffect, useState } from 'react'; import { useAPIKeys } from '@/features/settings/hooks/useAPIKeys'; import { Modal } from '@/components/ui/Modal'; import { Button } from '@/components/ui/Button'; import { Copy, Trash2 } from 'lucide-react'; import { InlineStatus, StatusType } from "@/components/ui/InlineStatus"; export const APIKeysSection: React.FC = () => { const { apiKeys, loadingApiKeys, generatedApiKey, showCreateApiKeyDialog, setShowCreateApiKeyDialog, loadApiKeys, createApiKey, revokeApiKey, clearGeneratedKey, } = useAPIKeys(); const [newApiKeyName, setNewApiKeyName] = useState(''); const [confirmRevoke, setConfirmRevoke] = useState(null); const [creating, setCreating] = useState(false); const [copied, setCopied] = useState(false); const [createStatus, setCreateStatus] = useState("idle"); const [createMessage, setCreateMessage] = useState(""); const [revokeStatus, setRevokeStatus] = useState("idle"); const [revokeMessage, setRevokeMessage] = useState(""); useEffect(() => { loadApiKeys(); }, []); const handleCreateApiKey = async () => { if (!newApiKeyName.trim()) { setCreateStatus("error"); setCreateMessage("Name required"); return; } setCreating(true); setCreateStatus("loading"); const result = await createApiKey(newApiKeyName); if (result.success) { setCreateStatus("success"); setCreateMessage("Created"); setNewApiKeyName(''); setShowCreateApiKeyDialog(false); } else { setCreateStatus("error"); setCreateMessage(result.error || "Failed"); } setCreating(false); }; const handleRevokeApiKey = async () => { if (!confirmRevoke) return; setRevokeStatus("loading"); const result = await revokeApiKey(confirmRevoke); if (result.success) { setRevokeStatus("success"); setRevokeMessage("Revoked"); setConfirmRevoke(null); } else { setRevokeStatus("error"); setRevokeMessage(result.error || "Failed"); } }; const handleCopyKey = () => { if (generatedApiKey) { navigator.clipboard.writeText(generatedApiKey); setCopied(true); setTimeout(() => setCopied(false), 2000); } }; const handleDismissKey = () => { clearGeneratedKey(); setCopied(false); }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', }); }; return (

API Keys

Manage API keys for programmatic access to your account

{/* Generated Key Display */} {generatedApiKey && (

Your new API key

Save this key now, you won't be able to see it again

)} {/* Create Button */}
{/* API Keys Table */}
{loadingApiKeys ? ( ) : apiKeys.length === 0 ? ( ) : ( apiKeys.map((key) => ( )) )}
Device Name Key Preview Created Last Used Actions
Loading API keys...
No API keys yet
{key.name} {key.keyPreview} {formatDate(key.createdAt)} {key.lastUsedAt ? formatDate(key.lastUsedAt) : 'Never'}
{/* Create API Key Dialog */} {showCreateApiKeyDialog && ( { setShowCreateApiKeyDialog(false); setNewApiKeyName(''); setCreateStatus("idle"); }} title="Generate New API Key" >
setNewApiKeyName(e.target.value)} placeholder="e.g., My Laptop, Production Server" className="w-full bg-[#0a0a0a] border border-[#1c1c1c] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500" autoFocus />
setCreateStatus("idle")} />
)} {/* Revoke Confirmation Modal */} {confirmRevoke && ( { setConfirmRevoke(null); setRevokeStatus("idle"); }} title="Revoke API Key" >

Are you sure you want to revoke this API key? This cannot be undone.

setRevokeStatus("idle")} />
)}
); };