fix: update SuperAdmin to use real API
All checks were successful
Build and Deploy / build-and-push (push) Successful in 1m22s

This commit is contained in:
Cauê Faleiros
2026-02-24 15:53:15 -03:00
parent 5e54d96119
commit 3198784087

View File

@@ -3,7 +3,7 @@ import {
Building2, Users, MessageSquare, Plus, Search, Building2, Users, MessageSquare, Plus, Search,
Edit, Trash2, ChevronDown, ChevronUp, ChevronsUpDown, X Edit, Trash2, ChevronDown, ChevronUp, ChevronsUpDown, X
} from 'lucide-react'; } from 'lucide-react';
import { TENANTS } from '../constants'; import { getTenants, createTenant } from '../services/dataService';
import { Tenant } from '../types'; import { Tenant } from '../types';
import { DateRangePicker } from '../components/DateRangePicker'; import { DateRangePicker } from '../components/DateRangePicker';
import { KPICard } from '../components/KPICard'; import { KPICard } from '../components/KPICard';
@@ -15,7 +15,8 @@ export const SuperAdmin: React.FC = () => {
}); });
const [selectedTenantId, setSelectedTenantId] = useState<string>('all'); const [selectedTenantId, setSelectedTenantId] = useState<string>('all');
const [searchQuery, setSearchQuery] = useState(''); const [searchQuery, setSearchQuery] = useState('');
const [tenants, setTenants] = useState<Tenant[]>(TENANTS); const [tenants, setTenants] = useState<Tenant[]>([]);
const [loading, setLoading] = useState(true);
const [isModalOpen, setIsModalOpen] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false);
const [editingTenant, setEditingTenant] = useState<Tenant | null>(null); const [editingTenant, setEditingTenant] = useState<Tenant | null>(null);
@@ -23,6 +24,18 @@ export const SuperAdmin: React.FC = () => {
const [sortKey, setSortKey] = useState<keyof Tenant>('created_at'); const [sortKey, setSortKey] = useState<keyof Tenant>('created_at');
const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc'); const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc');
// Load Tenants from API
const loadTenants = async () => {
setLoading(true);
const data = await getTenants();
setTenants(data);
setLoading(false);
};
React.useEffect(() => {
loadTenants();
}, []);
// --- Metrics --- // --- Metrics ---
const totalTenants = tenants.length; const totalTenants = tenants.length;
const totalUsersGlobal = tenants.reduce((acc, t) => acc + (t.user_count || 0), 0); const totalUsersGlobal = tenants.reduce((acc, t) => acc + (t.user_count || 0), 0);
@@ -82,12 +95,25 @@ export const SuperAdmin: React.FC = () => {
} }
}; };
const handleSaveTenant = (e: React.FormEvent) => { const handleSaveTenant = async (e: React.FormEvent) => {
e.preventDefault(); e.preventDefault();
// Logic to save (mock) const form = e.target as HTMLFormElement;
const name = (form.elements.namedItem('name') as HTMLInputElement).value;
const slug = (form.elements.namedItem('slug') as HTMLInputElement).value;
const admin_email = (form.elements.namedItem('admin_email') as HTMLInputElement).value;
const status = (form.elements.namedItem('status') as HTMLSelectElement).value;
const success = await createTenant({ name, slug, admin_email, status });
if (success) {
setIsModalOpen(false); setIsModalOpen(false);
setEditingTenant(null); setEditingTenant(null);
alert('Organização salva com sucesso (Mock)'); loadTenants(); // Reload list
alert('Organização salva com sucesso!');
} else {
alert('Erro ao salvar organização. Verifique o console.');
}
}; };
// --- Helper Components --- // --- Helper Components ---
@@ -293,6 +319,7 @@ export const SuperAdmin: React.FC = () => {
<label className="text-sm font-medium text-slate-700">Nome da Organização</label> <label className="text-sm font-medium text-slate-700">Nome da Organização</label>
<input <input
type="text" type="text"
name="name"
defaultValue={editingTenant?.name} defaultValue={editingTenant?.name}
className="w-full px-3 py-2 bg-slate-50 border border-slate-200 rounded-lg text-sm focus:ring-2 focus:ring-blue-100 outline-none" className="w-full px-3 py-2 bg-slate-50 border border-slate-200 rounded-lg text-sm focus:ring-2 focus:ring-blue-100 outline-none"
placeholder="ex. Acme Corp" placeholder="ex. Acme Corp"
@@ -305,6 +332,7 @@ export const SuperAdmin: React.FC = () => {
<label className="text-sm font-medium text-slate-700">Slug</label> <label className="text-sm font-medium text-slate-700">Slug</label>
<input <input
type="text" type="text"
name="slug"
defaultValue={editingTenant?.slug} defaultValue={editingTenant?.slug}
className="w-full px-3 py-2 bg-slate-50 border border-slate-200 rounded-lg text-sm focus:ring-2 focus:ring-blue-100 outline-none" className="w-full px-3 py-2 bg-slate-50 border border-slate-200 rounded-lg text-sm focus:ring-2 focus:ring-blue-100 outline-none"
placeholder="ex. acme-corp" placeholder="ex. acme-corp"
@@ -313,6 +341,7 @@ export const SuperAdmin: React.FC = () => {
<div className="space-y-2"> <div className="space-y-2">
<label className="text-sm font-medium text-slate-700">Status</label> <label className="text-sm font-medium text-slate-700">Status</label>
<select <select
name="status"
defaultValue={editingTenant?.status || 'active'} defaultValue={editingTenant?.status || 'active'}
className="w-full px-3 py-2 bg-slate-50 border border-slate-200 rounded-lg text-sm focus:ring-2 focus:ring-blue-100 outline-none" className="w-full px-3 py-2 bg-slate-50 border border-slate-200 rounded-lg text-sm focus:ring-2 focus:ring-blue-100 outline-none"
> >
@@ -327,6 +356,7 @@ export const SuperAdmin: React.FC = () => {
<label className="text-sm font-medium text-slate-700">E-mail do Admin</label> <label className="text-sm font-medium text-slate-700">E-mail do Admin</label>
<input <input
type="email" type="email"
name="admin_email"
defaultValue={editingTenant?.admin_email} defaultValue={editingTenant?.admin_email}
className="w-full px-3 py-2 bg-slate-50 border border-slate-200 rounded-lg text-sm focus:ring-2 focus:ring-blue-100 outline-none" className="w-full px-3 py-2 bg-slate-50 border border-slate-200 rounded-lg text-sm focus:ring-2 focus:ring-blue-100 outline-none"
placeholder="admin@empresa.com" placeholder="admin@empresa.com"