La versión 1.2.5 del hook useTargetHandler introduce funcionalidades clave que optimizan el manejo de errores y mejoran la experiencia del usuario durante el envío de formularios.
Esta actualización permite un seguimiento más efectivo de los errores y eventos en tu aplicación. Ahora, useTargetHandler incluye nuevos parámetros que facilitan la integración con Sentry, permitiendo registrar:
SentryWarning: Captura advertencias relacionadas con la validación de formularios y otros eventos que requieren atención.SentryError: Registra errores críticos que ocurren durante el envío de formularios, ayudando a identificar y solucionar problemas rápidamente.SentryInfo: Proporciona información relevante sobre el proceso de envío, lo que permite un análisis más profundo del comportamiento del usuario.SentryEvent: Registra eventos importantes, como envíos exitosos de formularios, para un mejor seguimiento de la actividad del usuario.
La nueva funcionalidad de estado isLoading mejora la experiencia del usuario al proporcionar retroalimentación visual durante el envío del formulario. Ahora puedes:
- Deshabilitar el botón de envío mientras se procesa la solicitud, evitando envíos múltiples y mejorando la estabilidad del servidor.
- Mostrar un indicador de carga que informa al usuario que su solicitud está siendo procesada, lo que reduce la incertidumbre y mejora la usabilidad.
ANTES ❌
const [ target,handleTarget,handleSubmit,errors,
{ apiCall, userFound, apiResponse }, // useHttpRequest
apiUrl] = useTargetHandler(
{ storageType:"session", storageKey:"formData" },
{ enableCSRF: false, rateLimit: 2000 }
)
<button type="submit">
Enviar
</button>AHORA ✅
const [ target,handleTarget,handleSubmit,errors,
{ apiCall, userFound, apiResponse, isLoading, SentryWarning, SentryInfo, SentryError, SentryEvent }, // useHttpRequest
apiUrl] = useTargetHandler(
{ storageType:"session", storageKey:"formData" },
{ enableCSRF: false, rateLimit: 2000 }
)
<button type="submit" disabled={isLoading}>
{isLoading ? "Cargando..." : "Enviar"}
</button>La versión 1.2.4 del hook useTargetHandler introduce funcionalidades avanzadas que transforman la forma en que gestionas formularios en tus aplicaciones React, con un enfoque especial en la seguridad.
La nueva versión implementa una funcionalidad de limitación de tasa que previene el envío excesivo de solicitudes en un corto período de tiempo. Ahora puedes establecer un intervalo de tiempo mínimo entre envíos de formularios, mejorando la experiencia del usuario y la estabilidad del servidor. Simplemente ajusta el parámetro rateLimit al usar el hook.
Se ha mejorado la función de sanitización de entradas para proteger contra ataques de inyección de código. La función sanitizeInput elimina etiquetas HTML y scripts potencialmente dañinos de los valores de entrada, asegurando que solo se almacenen datos limpios y seguros. Esto es crucial para prevenir ataques de Cross-Site Scripting (XSS).
Aunque el hook en sí no interactúa directamente con bases de datos, la sanitización de entradas ayuda a prevenir inyecciones SQL al asegurar que los datos que se envían a las API están debidamente filtrados. Esto es especialmente importante cuando se trabaja con APIs que pueden realizar operaciones de base de datos.
ANTES ❌
const { target, handleTarget, handleSubmit, errors, { apiCall, apiResponse, userFound, error }, apiUrl } = useTargetHandler(
{
nombre: { required: true, requiredMessage: "El nombre es obligatorio" },
apellido: { required: true, pattern: /^[a-zA-Z]+$/, patternMessage: "El apellido solo debe contener letras" }
},
"local",
"formData",
true,
2000
)
);AHORA ✅
const { target, handleTarget, handleSubmit, errors, { apiCall, apiResponse, userFound, error }, apiUrl } = useTargetHandler(
{
nombre: { required: true, requiredMessage: "El nombre es obligatorio" },
apellido: { required: true, pattern: /^[a-zA-Z]+$/, patternMessage: "El apellido solo debe contener letras" }
},
{ storageType: "session", storageKey: "forms" },
{ enableCSRF: true, rateLimit: 2000 }
)
);La versión 1.2.1 del hook useTargetHandler introduce funcionalidades avanzadas que transforman la forma en que gestionas formularios en tus aplicaciones React.
Ahora puedes declarar variables de entorno directamente en la nube, lo que permite una configuración más flexible y segura. Esto se logra mediante la función getEnvVar, que facilita la obtención de la URL base de la API sin necesidad de modificar el código fuente.
Se ha mejorado la integración con el hook useHttpRequest, permitiendo realizar llamadas a la API directamente desde el formulario. Esto simplifica el proceso de manejo de datos y mejora la interacción con el backend.
La función ha sido optimizada para ofrecer una gestión más robusta de las validaciones, incluyendo:
- Validaciones de longitud mínima y máxima.
- Validaciones de patrones de expresión regular.
- Verificaciones de coincidencias entre campos.
- Mensajes de error personalizados para cada regla.
const { target, handleTarget, handleSubmit, errors, { apiCall, apiResponse, userFound, error }, apiUrl } = useTargetHandler()
{
nombre: { required: true, requiredMessage: "El nombre es obligatorio" },
apellido: { required: true, pattern: /^[a-zA-Z]+$/, patternMessage: "El apellido solo debe contener letras" }
},
"local",
"formData"
);const { target, handleTarget, handleSubmit, errors, { apiCall, apiResponse, userFound, error, params }, apiUrl } = useTargetHandler()
apiCall("create", 1, target, "post", "application/json", { page: 1, limit: 10 });
-
'apiCall(endpoint, id, data, method, http, params)'Nuevas Validaciones y Mejoras 🚀 Se han añadido nuevas funcionalidades al hook useTargetHandler, permitiendo una gestión más robusta de los formularios. Las nuevas propiedades incluyen:
minLength: Verifica que la longitud del valor ingresado sea al menos la mínima especificada.maxLength: Verifica que la longitud del valor ingresado no exceda la máxima especificada.matches: Permite validar que el valor de un campo coincida con el valor de otro campo (por ejemplo, para confirmar contraseñas).matchMessage: Proporciona un mensaje de error personalizado si los valores no coinciden, mejorando la claridad para el usuario.min y max: Verifican que el valor ingresado esté dentro de un rango específico, asegurando que los datos sean válidos (por ejemplo, para la edad).checked y checkedMessage: Aseguran que los checkboxes estén marcados y proporcionan mensajes claros si no lo están.Validación para Botones de Radio: Se ha implementado la propiedad selected, que verifica que al menos un botón de radio en un grupo esté seleccionado, junto con un mensaje de error personalizado.
ANTES ❌
const [target, handleTarget, handleSubmit, errors] = useTargetHandler(
{
nombre: "",
apellido: "",
},
{
nombre: {
required: true,
requiredMessage: "El nombre es obligatorio",
pattern: /^[a-zA-Z]+$/,
patternMessage: "El nombre no puede contener números.",
},
apellido: {
required: true,
requiredMessage: "El apellido es obligatorio",
pattern: /^[a-zA-Z]+$/,
patternMessage: "El apellido no puede contener números.",
},
},
"local",
"formData"
);AHORA ✅
const [target, handleTarget, handleSubmit, errors] = useTargetHandler(
{
nombre: "",
apellido: "",
password: "",
confirmPassword: "",
email: "",
age: "",
terms: false, // Nuevo
gender: "", // Nuevo
},
{
nombre: {
required: true,
requiredMessage: "el nombre es obligatio !!!",
patternMessage: "no puede tener o llevar numeros",
pattern: /^[a-zA-Z]+$/,
minLength: 1, // Nuevo
maxLength: 30, // Nuevo
},
apellido: {
required: true,
pattern: /^[a-zA-Z]+$/,
requiredMessage: "el apellido es obligatio !!!",
patternMessage: "no puede tener o llevar numeros",
},
email: {
required: true,
pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
patternMessage: "El correo no es válido",
requiredMessage: "el email es obligatiorio!!",
},
password: {
required: true,
minLength: 6, // Nuevo
requiredMessage: "La contraseña es obligatoria",
},
confirmPassword: {
required: true,
matches: "password", // Nuevo
matchMessage: "Las contraseñas no coinciden", // Nuevo
requiredMessage: "Debe confirmar su contraseña",
},
age: {
required: true,
min: 18, // Nuevo
max: 99, // Nuevo
requiredMessage: "La edad es obligatoria",
},
terms: {
checked: true, // Nuevo
checkedMessage: "Debes aceptar los términos y condiciones", // Nuevo
},
ciudad: {
selected: true, // Nuevo
selectedMessage: "Debes seleccionar ciudad", // Nuevo
},
},
"local",
"formData"
);VALIDACION DE CHECKBOX Y RADIO ✅
<input
type="checkbox"
name="terms"
checked={target.terms}
onChange={handleTarget}
/>
<label>Acepto los términos y condiciones</label>
{errors.terms && <span>{errors.terms.message}</span>}
<input
type="radio"
name="gender"
value="male"
checked={target.gender === "male"}
onChange={handleTarget}
/>
<label>Masculino</label>
<input
type="radio"
name="gender"
value="female"
checked={target.gender === "female"}
onChange={handleTarget}
/>
<label>Femenino</label>
{errors.gender && <span>{errors.gender.message}</span>}
<select name="ciudad" value={target.ciudad} onChange={handleTarget}>
<option value="">Selecciona una ciudad</option>
<option value="madrid">Madrid</option>
<option value="barcelona">Barcelona</option>
<option value="valencia">Valencia</option>
</select>
{errors.ciudad && <span>{errors.ciudad.message}</span>}Validaciones Personalizadas 🔒 Se ha implementado el uso de propiedades como required, pattern, patternMessage y requiredMessage, permitiendo a los desarrolladores establecer restricciones específicas en los campos del formulario. Esto mejora la experiencia del usuario al proporcionar mensajes claros sobre los requisitos de entrada.
ANTES ❌
const [target, setTarget, handleSubmit] = useTargetHandler({
nombre: "",
apellido: "",
}, "local", "formData");{errors.nombre && <span>{errors.nombre}</span>}AHORA ✅
const [target, handleTarget, handleSubmit, errors] = useTargetHandler(
{
nombre: "",
apellido: "",
},
{
nombre: {
required: true,
requiredMessage: "El nombre es obligatorio",
pattern: /^[a-zA-Z]+$/,
patternMessage: "El nombre no puede contener números.",
},
apellido: {
required: true,
requiredMessage: "El apellido es obligatorio",
pattern: /^[a-zA-Z]+$/,
patternMessage: "El apellido no puede contener números.",
},
},
"local",
"formData"
);{errors.nombre && <span>{errors.nombre.message}</span>}Persistencia del Estado en el formulario 💾 Se implementó la funcionalidad para guardar el estado del formulario en localStorage o sessionStorage, permitiendo a los usuarios retomar formularios incompletos.
ANTES ❌
const [target, setTarget, handleSubmit] = useTargetHandler({
nombre: "",
apellido: "",
});<form onSubmit={handleSubmit(onSubmit)}>
<input
type="text"
value={target.nombre}
placeholder="nombre"
onChange={setTarget}
name="nombre"
/>
<input
type="text"
value={target.apellido}
placeholder="apellido"
onChange={setTarget}
name="apellido"
/>
<button>Enviar</button>
</form>AHORA ✅
const [target, handleTarget, handleSubmit, errors] = useTargetHandler(
{
nombre: "",
apellido: "",
},
"local", // Se especifica el tipo de almacenamiento (localStorage o sessionStorage)
"formData" // Nombre para el almacenamiento (Si no le asignas un nombre tendra nombre por Defecto)
);<form onSubmit={handleSubmit(onSubmit)}>
<input
type="text"
value={target.nombre || ""}
placeholder="nombre"
onChange={handleTarget}
name="nombre"
/>
{errors.nombre && <span>{errors.nombre}</span>}
<input
type="text"
value={target.apellido || ""}
placeholder="apellido"
onChange={handleTarget}
name="apellido"
/>
{errors.apellido && <span>{errors.apellido}</span>}
<button>Enviar</button>
</form>=============================================
Se agregó un nuevo parámetro errors para mejorar la validación de formularios.
const [target, setTarget, handleSubmit] = useTargetHandler({
nombre: "",
apellido: "",
});<form onSubmit={handleSubmit(onSubmit)}>
<input
type="text"
value={target.nombre}
placeholder="nombre"
onChange={setTarget}
name="nombre"
/>
<input
type="text"
value={target.apellido}
placeholder="apellido"
onChange={setTarget}
name="apellido"
/>
<button>Enviar</button>
</form>const [target, setTarget, handleSubmit, errors] = useTargetHandler({
nombre: "",
apellido: "",
});<form onSubmit={handleSubmit(onSubmit)}>
<input
type="text"
value={target.nombre || ""}
placeholder="nombre"
onChange={setTarget}
name="nombre"
/>
{/* Se agregó la validación de errores para el campo nombre */}
{errors.nombre && <span>{errors.nombre}</span>}
<input
type="text"
value={target.apellido || ""}
placeholder="apellido"
onChange={setTarget}
name="apellido"
/>
{/* Se agregó la validación de errores para el campo apellido */}
{errors.apellido && <span>{errors.apellido}</span>}
<button>Enviar</button>
</form>