Modal para Agregar Miembro
El componente AddMemberModal muestra un modal con formulario para agregar un nuevo miembro al equipo. Permite capturar el nombre, correo, contraseña y rol del nuevo usuario, con validaciones integradas y una interfaz amigable.
🔍 Ubicación
src/components/team/AddMemberModal.tsx
📦 Dependencias
-
React:
useState -
Iconos (Lucide):
X,User,Mail,Lock,Eye,EyeOff,Shield
-
Tipos:
TeamMember,UserRoledesde../../types/team
-
Hooks personalizados:
useToastpara mostrar notificaciones
⚙️ Propiedades
| Propiedad | Tipo | Requerido | Descripción |
|---|---|---|---|
isOpen | boolean | ✔️ Sí | Determina si el modal se muestra o no. |
onClose | () => void | ✔️ Sí | Función que se ejecuta al cerrar el modal. |
onAdd | (member: Omit<TeamMember, "id"> & { password: string }) => void | ✔️ Sí | Función que se ejecuta al confirmar el registro de un nuevo miembro. |
🧠 Lógica Interna
📥 Estado
| Estado | Tipo | Descripción |
|---|---|---|
formData | { name, email, password, role } | Datos del nuevo miembro a agregar |
errors | Record<string, string> | Mapeo de errores por campo |
isSubmitting | boolean | Controla el estado de envío para evitar múltiples envíos |
showPassword | boolean | Muestra u oculta la contraseña |
📤 Funciones
validateForm
Valida todos los campos del formulario y establece errores en caso de:
-
Nombre vacío o con menos de 2 caracteres
-
Email inválido
-
Contraseña con:
- Menos de 8 caracteres
- Sin mayúsculas, minúsculas, número o símbolo
handleInputChange
Actualiza un campo específico del formData y limpia su error correspondiente si existía.
handleSubmit
Valida el formulario, muestra feedback, y llama a onAdd con los datos. Simula una espera con setTimeout y reinicia el formulario si todo sale bien.
toast
Usado para mostrar mensajes de éxito o error al usuario.
🧱 Estructura del Componente
-
Modal:
- Fondo oscuro semitransparente
- Centrado y responsivo con
max-w-md - Cierre con botón (
X) en la esquina superior derecha
-
Formulario:
-
Nombre completo: con ícono
User, validación y placeholder -
Correo electrónico: con ícono
Maily validación de formato -
Contraseña: con ícono
Lock, alternancia visual (Eye/EyeOff) y validación robusta -
Rol: con ícono
Shieldy selector con tres opciones (LECTOR,COMENTARISTA,EDITOR) -
Botones:
Cancelar: llama aonCloseAgregar Miembro: llama ahandleSubmit, muestra estado de envío
-
🎨 Estilos y Diseño
- Totalmente estilizado con Tailwind CSS
- Componentes con
focus,hover,disabled, ytransition-colors - Colores personalizados para ProductTrack (
producttrack-olive) - Modal accesible y responsivo
- Inputs con íconos posicionados dentro (
absolute left-3) - Mensajes de error claramente visibles bajo cada campo
💡 Ejemplo de Uso
import { AddMemberModal } from "./AddMemberModal";
<AddMemberModal
isOpen={mostrarModal}
onClose={() => setMostrarModal(false)}
onAdd={(nuevoMiembro) => {
console.log("Nuevo miembro:", nuevoMiembro);
// Aquí iría la lógica para enviar a backend
}}
/>
📝 Notas Adicionales
- Contraseña segura: El componente exige contraseñas con criterios de seguridad estrictos (longitud, mayúsculas, símbolos…).
- Validación completa: Todas las entradas críticas son validadas antes de enviar.
- Toasts amigables: Mensajes de éxito o error acompañan al usuario en su flujo.
- Formulario reiniciable: Al agregar un miembro exitosamente, se limpian los campos.
- UX mejorado: Permite mostrar u ocultar la contraseña fácilmente.