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...

); } const formatLastLogin = (timestamp: string) => { const date = new Date(timestamp); const now = new Date(); const diffInDays = Math.floor((now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24)); if (diffInDays === 0) { return 'Hoy ' + date.toLocaleTimeString('es-ES', { hour: '2-digit', minute: '2-digit' }); } else if (diffInDays === 1) { return 'Ayer'; } else { return `hace ${diffInDays} días`; } }; return (
setShowForm(true)}> Nuevo Miembro } /> {/* Team Stats */}

Total Equipo

{teamStats.total}

Activos

{teamStats.active}

Producción

{teamStats.departments.production}

Ventas

{teamStats.departments.sales}

{/* Filters and Search */}
setSearchTerm(e.target.value)} className="pl-10" />
{roles.map((role) => ( ))}
{/* Team Members List */}
{filteredMembers.map((member) => (

{member.user.first_name} {member.user.last_name}

{member.status === 'active' ? 'Activo' : 'Inactivo'}
{member.user.email}
{member.user.phone || 'No disponible'}
{getRoleLabel(member.role)} {member.department}

Se unió: {new Date(member.joined_at).toLocaleDateString('es-ES')}

Estado: {member.is_active ? 'Activo' : 'Inactivo'}

{/* Permissions */}

Permisos:

{getRoleLabel(member.role)}
{/* Member Info */}

Información adicional:

ID: {member.id}

))}
{filteredMembers.length === 0 && (

No se encontraron miembros

No hay miembros del equipo que coincidan con los filtros seleccionados.

)} {/* Add Member Modal Placeholder */} {showForm && (

Nuevo Miembro del Equipo

Formulario para agregar un nuevo miembro del equipo.

)}
); }; export default TeamPage;