import React, { useState } from 'react'; import { Users, Plus, Search, Mail, Phone, Shield, Edit, Trash2, UserCheck, UserX } from 'lucide-react'; import { Button, Card, Badge, Input } from '../../../../components/ui'; import { PageHeader } from '../../../../components/layout'; import { useTeamMembers } from '../../../../api/hooks/tenant'; import { useAllUsers, useUpdateUser } from '../../../../api/hooks/user'; import { useAuthUser } from '../../../../stores/auth.store'; import { useToast } from '../../../../hooks/ui/useToast'; const TeamPage: React.FC = () => { const { addToast } = useToast(); const user = useAuthUser(); const tenantId = user?.tenant_id || ''; const { data: teamMembers = [], isLoading, error } = useTeamMembers(tenantId, true, { enabled: !!tenantId }); const { data: allUsers = [] } = useAllUsers(); const updateUserMutation = useUpdateUser(); const [searchTerm, setSearchTerm] = useState(''); const [selectedRole, setSelectedRole] = useState('all'); const [showForm, setShowForm] = useState(false); const roles = [ { value: 'all', label: 'Todos los Roles', count: teamMembers.length }, { value: 'owner', label: 'Propietario', count: teamMembers.filter(m => m.role === 'owner').length }, { value: 'admin', label: 'Administrador', count: teamMembers.filter(m => m.role === 'admin').length }, { value: 'manager', label: 'Gerente', count: teamMembers.filter(m => m.role === 'manager').length }, { value: 'employee', label: 'Empleado', count: teamMembers.filter(m => m.role === 'employee').length } ]; const teamStats = { total: teamMembers.length, active: teamMembers.filter(m => m.status === 'active').length, departments: { production: teamMembers.filter(m => m.department === 'Producción').length, sales: teamMembers.filter(m => m.department === 'Ventas').length, admin: teamMembers.filter(m => m.department === 'Administración').length } }; const getRoleBadgeColor = (role: string) => { switch (role) { case 'manager': return 'purple'; case 'baker': return 'green'; case 'cashier': return 'blue'; case 'assistant': return 'yellow'; default: return 'gray'; } }; const getStatusColor = (status: string) => { return status === 'active' ? 'green' : 'red'; }; const getRoleLabel = (role: string) => { switch (role) { case 'manager': return 'Gerente'; case 'baker': return 'Panadero'; case 'cashier': return 'Cajero'; case 'assistant': return 'Asistente'; default: return role; } }; const filteredMembers = teamMembers.filter(member => { const matchesRole = selectedRole === 'all' || member.role === selectedRole; const matchesSearch = member.user.first_name.toLowerCase().includes(searchTerm.toLowerCase()) || member.user.last_name.toLowerCase().includes(searchTerm.toLowerCase()) || member.user.email.toLowerCase().includes(searchTerm.toLowerCase()); return matchesRole && matchesSearch; }); if (isLoading) { return (
Cargando miembros del equipo...
Total Equipo
{teamStats.total}
Activos
{teamStats.active}
Producción
{teamStats.departments.production}
Ventas
{teamStats.departments.sales}
Se unió: {new Date(member.joined_at).toLocaleDateString('es-ES')}
Estado: {member.is_active ? 'Activo' : 'Inactivo'}
Permisos:
Información adicional:
ID: {member.id}
No hay miembros del equipo que coincidan con los filtros seleccionados.
Formulario para agregar un nuevo miembro del equipo.