Información Personal del Usuario
El componente PersonalInfo representa una sección de formulario dentro del perfil del usuario donde se puede visualizar y editar información personal básica. Este formulario se adapta a diferentes tipos de usuarios: individuales, empresas y miembros de equipos, mostrando campos relevantes según el contexto.
🔍 Ubicación
src/components/team/PersonalInfo.tsx
📦 Dependencias
- Lucide React: Íconos como
User,Mail,Phone,MapPin, yFileText. - React: Para la estructura funcional del componente y hooks (
useState,Dispatch). - UserProfile Type: Interfaz importada desde
src/types/UserProfile.
🧱 Estructura del Componente
-
Foto de Perfil
- Muestra una imagen de perfil cargada o la URL almacenada en el perfil del usuario.
- Si no hay ninguna, se muestra un ícono de usuario por defecto.
- Si
isEditingestrue, permite subir una nueva foto (<input type="file" />).
-
Campos Básicos del Usuario Campos editables de información personal, renderizados dinámicamente:
username(nombre de usuario)name(nombre completo)email(correo electrónico)phone(número de teléfono)address(dirección)
Todos estos inputs incluyen íconos representativos con diseño consistente.
-
Información Empresarial u Organizacional Si el usuario no es individual y sí pertenece a una empresa o equipo (
isEmpresaoisEquipo):companyName(nombre de la empresa)nit(número de identificación tributaria)role(rol dentro del equipo, solo visible si esisEquipo)
Algunos campos son deshabilitados y no modificables para usuarios de tipo equipo.
🧠 Comportamiento
-
Edición Condicional: Todos los campos se pueden editar solo si
isEditingestrue. -
Lógica de Foto: Se prioriza la vista previa del archivo subido sobre la foto guardada.
-
Renderizado por Rol:
- Usuarios individuales ven solo su información básica.
- Empresas pueden editar su información organizacional.
- Equipos pueden ver la información organizacional, pero no editarla.
🎨 Estilos y Diseño
-
Utiliza Tailwind CSS:
- Paleta de colores:
#667233(verde oliva),gray,white. - Sombra (
shadow), bordes (rounded,border), y espaciado (mb-6,py-2).
- Paleta de colores:
-
Íconos dentro de inputs posicionados con
absolute. -
Diseño responsive con
grid-cols-1en móviles ygrid-cols-2en pantallas medianas o mayores.
💡 Ejemplo de Uso
import PersonalInfo from "@/components/team/PersonalInfo";
import { useState } from "react";
import type { UserProfile } from "@/types/UserProfile";
function PerfilUsuario() {
const [userProfile, setUserProfile] = useState<UserProfile>({
username: "",
name: "",
email: "",
phone: "",
address: "",
fotoPerfil: "",
companyName: "",
nit: "",
role: "",
});
const [photo, setPhoto] = useState<File | null>(null);
return (
<PersonalInfo
userProfile={userProfile}
setUserProfile={setUserProfile}
isEditing={true}
isIndividual={true}
isEmpresa={false}
isEquipo={false}
photo={photo}
setPhoto={setPhoto}
/>
);
}
📌 Notas Adicionales
- El componente es modular y adaptativo a distintos tipos de usuario.
- El campo de
fotoPerfily la subida de imágenes son gestionados localmente, pero puedes adaptar su envío a una API. - Aporta un diseño limpio y accesible para interfaces administrativas o formularios de perfil.