import React, { useState, useEffect } from 'react'; import { Key, Loader2, Plus, Trash2, Copy, CheckCircle2, Building2 } from 'lucide-react'; import { getApiKeys, createApiKey, deleteApiKey, getTenants } from '../services/dataService'; import { Tenant } from '../types'; export const ApiKeys: React.FC = () => { const [tenants, setTenants] = useState([]); const [selectedTenantId, setSelectedTenantId] = useState(''); const [apiKeys, setApiKeys] = useState([]); const [loading, setLoading] = useState(true); const [newKeyName, setNewKeyName] = useState(''); const [isGeneratingKey, setIsGeneratingKey] = useState(false); const [generatedKey, setGeneratedKey] = useState(null); useEffect(() => { const fetchInitialData = async () => { try { const fetchedTenants = await getTenants(); setTenants(fetchedTenants); if (fetchedTenants.length > 0) { const defaultTenant = fetchedTenants.find(t => t.id !== 'system') || fetchedTenants[0]; setSelectedTenantId(defaultTenant.id); } } catch (err) { console.error("Failed to load tenants", err); } finally { setLoading(false); } }; fetchInitialData(); }, []); useEffect(() => { if (selectedTenantId) { loadApiKeys(selectedTenantId); setGeneratedKey(null); } }, [selectedTenantId]); const loadApiKeys = async (tenantId: string) => { setLoading(true); try { const keys = await getApiKeys(tenantId); setApiKeys(keys); } catch (e) { console.error("Failed to load API keys", e); } finally { setLoading(false); } }; const handleGenerateApiKey = async () => { if (!newKeyName.trim() || !selectedTenantId) return; setIsGeneratingKey(true); try { const res = await createApiKey({ name: newKeyName, tenantId: selectedTenantId }); setGeneratedKey(res.secret_key); setNewKeyName(''); loadApiKeys(selectedTenantId); } catch (err: any) { alert(err.message || 'Erro ao gerar chave.'); } finally { setIsGeneratingKey(false); } }; const handleRevokeApiKey = async (id: string) => { if (!selectedTenantId) return; if (confirm('Tem certeza? Todas as integrações usando esta chave pararão de funcionar imediatamente.')) { const success = await deleteApiKey(id); if (success) { loadApiKeys(selectedTenantId); } } }; const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text); alert('Chave copiada para a área de transferência!'); }; return (

Integrações via API

Gerencie chaves de API para permitir que sistemas externos como o n8n se conectem a organizações específicas.

{generatedKey && (

Chave Gerada com Sucesso!

Copie esta chave agora. Por motivos de segurança, ela não será exibida novamente.

{generatedKey}
)}
setNewKeyName(e.target.value)} className="flex-1 p-3 border border-zinc-200 dark:border-dark-border rounded-xl bg-zinc-50 dark:bg-dark-input text-zinc-900 dark:text-zinc-100 placeholder-zinc-400 dark:placeholder-zinc-600 focus:outline-none focus:ring-2 focus:ring-brand-yellow/20 focus:border-brand-yellow sm:text-sm transition-all" />
{loading ? (
) : apiKeys.length > 0 ? (
{apiKeys.map(key => ( ))}
Nome da Integração Chave (Mascarada) Último Uso Ações
{key.name} {key.masked_key} {key.last_used_at ? new Date(key.last_used_at).toLocaleString('pt-BR') : 'Nunca'}
) : (

Nenhuma chave de API gerada

Crie uma nova chave para conectar sistemas externos a esta organização.

)}
); };