import React, { useState, useEffect } from 'react'; import { motion } from 'framer-motion'; import { Search, Edit2, ShieldAlert, ShieldCheck, ChevronUp, ChevronDown, RotateCcw, Box, Eye } from 'lucide-react'; import { fetchCompanies, setCompanyBanned } from '../api/sysadmin'; import { EditCompanyModal } from '../components/ui/EditCompanyModal'; import { CompanyServicesModal } from '../components/ui/CompanyServicesModal'; import { OrganizationInsightsModal } from '../components/ui/OrganizationInsightsModal'; export const CompaniesPage = () => { const [companies, setCompanies] = useState([]); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [loading, setLoading] = useState(false); // Filters const [filters, setFilters] = useState({ name: '', banned: 'all', // all | true | false sortBy: 'name', sortOrder: 'asc' }); // Modals state const [editingCompany, setEditingCompany] = useState(null); const [servicesCompany, setServicesCompany] = useState(null); const [insightsCompany, setInsightsCompany] = useState(null); const loadCompanies = async () => { setLoading(true); try { const payload: any = { page, limit: 10, sortBy: filters.sortBy, sortOrder: filters.sortOrder }; if (filters.name) payload.name = filters.name; if (filters.banned !== 'all') payload.banned = filters.banned === 'true'; const res = await fetchCompanies(payload); setCompanies(res.data); setTotalPages(res.pages); } catch (e) { console.error(e); alert('Error cargando organizaciones'); } setLoading(false); }; useEffect(() => { loadCompanies(); }, [page, filters.sortBy, filters.sortOrder, filters.banned]); const handleSearch = (e: React.FormEvent) => { e.preventDefault(); setPage(1); loadCompanies(); }; const handleResetFilters = () => { setFilters({ name: '', banned: 'all', sortBy: 'name', sortOrder: 'asc' }); setPage(1); }; useEffect(() => { if (filters.name === '' && filters.banned === 'all' && filters.sortBy === 'name' && filters.sortOrder === 'asc') { loadCompanies(); } }, [filters]); const toggleSort = (field: string) => { setFilters(prev => { if (prev.sortBy === field) { return { ...prev, sortOrder: prev.sortOrder === 'asc' ? 'desc' : 'asc' }; } return { ...prev, sortBy: field, sortOrder: 'asc' }; }); }; const renderSortIcon = (field: string) => { if (filters.sortBy !== field) return null; return filters.sortOrder === 'asc' ? : ; }; const handleToggleBanned = async (company: any) => { if (window.confirm(`¿Deseas ${company.banned ? 'quitar el ban' : 'banear'} a la organización ${company.name}?`)) { try { await setCompanyBanned(company.id || company._id, !company.banned); loadCompanies(); } catch (e: any) { alert('Error al actualizar estado de la organización'); } } }; return (

Gestión de Organizaciones

{/* Filters Bar */}
setFilters({...filters, name: e.target.value})} />
{/* Table */}
{loading ? ( ) : companies.length === 0 ? ( ) : ( companies.map(c => ( )) )}
toggleSort('name')} style={{ padding: '1rem', color: 'var(--text-muted)', fontWeight: '600', cursor: 'pointer', userSelect: 'none' }}>
Organización {renderSortIcon('name')}
toggleSort('categoryId')} style={{ padding: '1rem', color: 'var(--text-muted)', fontWeight: '600', cursor: 'pointer', userSelect: 'none' }}>
Categoría {renderSortIcon('categoryId')}
Estado Acciones
Cargando...
No se encontraron organizaciones
{c.name}
{c.description || '-'}
{c.categoryId}
{/* Pagination */}
Página {page} de {totalPages || 1}
{/* Modals */} {editingCompany && setEditingCompany(null)} onSaved={loadCompanies} />} {servicesCompany && setServicesCompany(null)} />} {insightsCompany && setInsightsCompany(null)} />}
); };