import React, { useState, useEffect } from 'react'; import { UserPlus, Mail, Shield, MoreVertical, Trash2, Edit, Send, User, Crown, Briefcase, CheckCircle, Clock, AlertCircle } from 'lucide-react'; import { useSelector } from 'react-redux'; import { RootState } from '../../store'; import { useTenant } from '../../api/hooks/useTenant'; import toast from 'react-hot-toast'; interface UserMember { id: string; user_id: string; role: 'owner' | 'admin' | 'manager' | 'worker'; status: 'active' | 'pending' | 'inactive'; user: { id: string; email: string; full_name: string; last_active?: string; }; joined_at: string; } const UsersManagementPage: React.FC = () => { const { currentTenant } = useSelector((state: RootState) => state.tenant); const { user: currentUser } = useSelector((state: RootState) => state.auth); const { members, getTenantMembers, inviteUser, removeMember, updateMemberRole, isLoading, error } = useTenant(); const [showInviteModal, setShowInviteModal] = useState(false); const [inviteForm, setInviteForm] = useState({ email: '', role: 'worker' as const, message: '' }); const [selectedMember, setSelectedMember] = useState(null); const [showRoleModal, setShowRoleModal] = useState(false); useEffect(() => { if (currentTenant) { getTenantMembers(currentTenant.id); } }, [currentTenant, getTenantMembers]); const handleInviteUser = async () => { if (!currentTenant || !inviteForm.email) return; try { await inviteUser(currentTenant.id, { email: inviteForm.email, role: inviteForm.role, message: inviteForm.message }); toast.success('Invitación enviada exitosamente'); setShowInviteModal(false); setInviteForm({ email: '', role: 'worker', message: '' }); } catch (error) { toast.error('Error al enviar la invitación'); } }; const handleRemoveMember = async (member: UserMember) => { if (!currentTenant) return; if (window.confirm(`¿Estás seguro de que quieres eliminar a ${member.user.full_name}?`)) { try { await removeMember(currentTenant.id, member.user_id); toast.success('Usuario eliminado exitosamente'); } catch (error) { toast.error('Error al eliminar usuario'); } } }; const handleUpdateRole = async (newRole: string) => { if (!currentTenant || !selectedMember) return; try { await updateMemberRole(currentTenant.id, selectedMember.user_id, newRole); toast.success('Rol actualizado exitosamente'); setShowRoleModal(false); setSelectedMember(null); } catch (error) { toast.error('Error al actualizar el rol'); } }; const getRoleInfo = (role: string) => { const roleMap = { owner: { label: 'Propietario', icon: Crown, color: 'text-yellow-600 bg-yellow-100' }, admin: { label: 'Administrador', icon: Shield, color: 'text-red-600 bg-red-100' }, manager: { label: 'Gerente', icon: Briefcase, color: 'text-blue-600 bg-blue-100' }, worker: { label: 'Empleado', icon: User, color: 'text-green-600 bg-green-100' } }; return roleMap[role as keyof typeof roleMap] || roleMap.worker; }; const getStatusInfo = (status: string) => { const statusMap = { active: { label: 'Activo', icon: CheckCircle, color: 'text-green-600' }, pending: { label: 'Pendiente', icon: Clock, color: 'text-yellow-600' }, inactive: { label: 'Inactivo', icon: AlertCircle, color: 'text-gray-600' } }; return statusMap[status as keyof typeof statusMap] || statusMap.inactive; }; const canManageUser = (member: UserMember): boolean => { // Owners can manage everyone except other owners // Admins can manage managers and workers // Managers and workers can't manage anyone if (currentUser?.role === 'owner') { return member.role !== 'owner' || member.user_id === currentUser.id; } if (currentUser?.role === 'admin') { return ['manager', 'worker'].includes(member.role); } return false; }; if (isLoading) { return (

Cargando usuarios...

); } return (
{/* Header */}

Gestión de Usuarios

Administra los miembros de tu equipo en {currentTenant?.name}

{/* Users List */}

Miembros del Equipo ({members.length})

{members.map((member) => { const roleInfo = getRoleInfo(member.role); const statusInfo = getStatusInfo(member.status); const RoleIcon = roleInfo.icon; const StatusIcon = statusInfo.icon; return (
{/* Avatar */}
{/* User Info */}

{member.user.full_name}

{member.user_id === currentUser?.id && ( )}

{member.user.email}

{statusInfo.label}
{member.user.last_active && ( Último acceso: {new Date(member.user.last_active).toLocaleDateString()} )}
{/* Role Badge */}
{roleInfo.label}
{/* Actions */} {canManageUser(member) && (
{/* Dropdown would go here */}
)}
); })}
{/* Invite User Modal */} {showInviteModal && (

Invitar Nuevo Usuario

setInviteForm(prev => ({ ...prev, email: e.target.value }))} placeholder="usuario@ejemplo.com" className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-primary-500" />