npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

usetargethandler

v1.2.5

Published

use-target-hook te permite manejar formularios de manera sencilla y eficiente, sin necesidad de escribir código repetitivo.

Downloads

49

Readme

useTarget licence Badge en Desarollo npm downloads commit npm GitHub release

Actualizaciones & Funcionalidad

Ver los cambios realizados en el Hook CHANGELOG

  • Conoce las mejoras y cambios en la funcionalidad del Hook FUNCTIONALITY

Hook useTargetHandler 📝

Instalaciòn

   npm i usetargethandler

Importaciòn

   import { useTargetHandler } from "usetargethandler";

Actualizar version

   npm update usetargethandler

Caracteristicas

  • Iniciales personalizables: El hook permite pasar valores iniciales para el formulario, lo que te da flexibilidad para adaptarlo a tus necesidades específicas.
  • Gestión de estado en tiempo real: useTargetHandler proporciona una función handleTarget que actualiza el estado del formulario en tiempo real según los cambios realizados por el usuario.
  • Envío de formularios seguro: El hook incluye una función handleSubmit que te permite enviar el formulario de manera segura y realizar acciones personalizadas después de la submitting.
  • Reinicialización del formulario: Después de enviar el formulario, useTargetHandler reinicializa el estado del formulario a sus valores iniciales.
  • Compatibilidad: useTargetHandler es compatible con todas las versiones de React a partir de la 16.8.
  • Validación de campos: El hook permite implementar validaciones personalizadas para cada campo del formulario, asegurando que los datos ingresados por el usuario cumplan con los requisitos establecidos.
  • Persistencia del Estado y Almacenamiento Condicional: El hook guarda el estado del formulario en localStorage o sessionStorage, permitiendo a los usuarios retomar formularios incompletos.
  • Declaración de Variables de Entorno en la Nube: Declarar variables de entorno directamente en la nube, lo que permite una configuración más segura y flexible de tu aplicación. Esto simplifica la gestión de configuraciones en distintos entornos sin necesidad de modificar el código fuente.
  • Integración Mejorada con useHttpRequest: useTargetHandler Ahora se integra de forma más fluida con el hook useHttpRequest, permitiendo realizar llamadas a la API directamente desde el formulario y gestionar las respuestas de manera efectiva.
  • Protección CSRF en useTargetHandler: Al activar enableCSRF=true, el hook useTargetHandler incluye automáticamente un token CSRF en las solicitudes HTTP que modifican datos (POST, PUT, DELETE) a través de useHttpRequest, protegiendo así contra ataques maliciosos.
  • Limitación de Tasa (Rate Limiting): 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.
  • Sanitización de Entradas: 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).
  • Protección contra Inyecciones SQL: 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.

Ventajas de Usar el Hook useTargetHandler

  • Simplificación de la Gestión de Formularios en React: useTargetHandler proporciona una solución integral para manejar el estado de los campos de un formulario, lo que reduce la complejidad de la gestión de formularios en aplicaciones React.

  • Valores Iniciales Personalizables: Permite pasar valores iniciales para el formulario, lo que te da flexibilidad para adaptarlo a tus necesidades específicas.

  • Gestión de Estado en Tiempo Real: Proporciona una forma fácil de actualizar el estado del formulario en tiempo real según los cambios realizados por el usuario. Esto mejora la experiencia del usuario al interactuar con el formulario.

  • Envío de Formularios Seguro: Incluye una función handleSubmit que permite enviar el formulario de manera segura, validando los campos antes de realizar cualquier acción, lo que ayuda a prevenir errores y asegurar la integridad de los datos.

  • Reinicialización del Formulario: Después de enviar el formulario, useTargetHandler reinicializa el estado del formulario a sus valores iniciales, lo que facilita la reutilización del formulario sin necesidad de configuraciones adicionales.

  • Validación de Campos: Implementa validaciones personalizadas para cada campo del formulario, asegurando que los datos ingresados por el usuario cumplan con los requisitos establecidos. Esto incluye mensajes de error personalizados para una mejor comunicación con el usuario.

  • Limitación de Tasa (Rate Limiting): Previene el envío excesivo de solicitudes en un corto período de tiempo, mejorando la estabilidad del servidor y la experiencia del usuario. Puedes establecer un intervalo de tiempo mínimo entre envíos de formularios.

  • Sanitización de Entradas: Protege contra ataques de inyección de código al eliminar etiquetas HTML y scripts potencialmente dañinos de los valores de entrada, asegurando que solo se almacenen datos limpios y seguros.

  • Protección contra Inyecciones SQL: Aunque el hook no interactúa directamente con bases de datos, la sanitización de entradas ayuda a prevenir inyecciones SQL al asegurar que los datos enviados a las API estén debidamente filtrados.

  • Persistencia del Estado y Almacenamiento Condicional: Guarda el estado del formulario en localStorage o sessionStorage, permitiendo a los usuarios retomar formularios incompletos.

  • Integración Mejorada con useHttpRequest``: Ahora se integra de forma más fluida con el hook useHttpRequest, permitiendo realizar llamadas a la API directamente desde el formulario y gestionar las respuestas de manera efectiva.

  • Protección CSRF: Al activar enableCSRF=true, el hook incluye automáticamente un token CSRF en las solicitudes HTTP que modifican datos (POST, PUT, DELETE), protegiendo así contra ataques maliciosos.

  • Manejo de Variables de Entorno para la URL de la API: El hook utiliza la función getEnvVar para obtener la URL de la API a partir de variables de entorno. Esto permite una configuración más flexible y segura de la aplicación, especialmente en plataformas en la nube como Vercel e Infisical entre otros, donde puedes declarar variables de entorno directamente en la nube.

Uso 💎

  • target: Contendrá los valores actuales del formulario, inicializados con { nombre: "", apellido: "" }.

    • Almacena los valores del formulario.
  • handleTarget: handleTarget se utilizará para manejar los cambios en los campos del formulario. Por ejemplo, puedes asignarla a un evento onChange en los inputs del formulario.

    • Función para manejar cambios en los campos del formulario.
  • handleSubmit: handleSubmit se llamará cuando se envíe el formulario.

    • Función para manejar el envío del formulario y la validación.
  • errors: Contendrá los errores de validación del formulario, que se pueden mostrar en la interfaz de usuario si hay errores.

    • Almacena los errores de validación.
  • Destacado

    • Los valores target y setTarget lo puedes modificar con el valor que mas se le sea de su agrado cuando se le llama, no es obligatoriamente target y setTarget. ( usar handleTarget ).
    • el valor de value={target.nombre} debe ser igual a name="nombre" y del estado {nombre: "", apellido: ""} y asi le pueda funcionar el formularios.
    • Cuando configuras un campo en tu formulario y estableces required: true, estás indicando que este campo es obligatorio. Esto no solo activa la validación para asegurarte de que el usuario complete el campo, sino que también permite el uso de otras reglas de validación relacionadas, como:
      • pattern, patternMessage, requiredMessage, minLength, minLength, maxLength, matches, matchMessage, min, max, checked, checkedMessage, selected, selectedMessage.
    • useTargetHandler ya tiene incorporado dotenv y axios por parte de useHttpRequest.

NUEVO 🆕 - FUNCTIONALITY - CHANGELOG

import React from 'react';
import {useTargetHandler} from 'useTargetHandler';

const Formulario = () => {
  const [target, handleTarget, handleSubmit, errors] = useTargetHandler(
    {
      nombre: "",
      apellido: "",
      password: "",
      confirmPassword: "",
      email: "",
      age: "",
      terms: false,
      gender: "",
      ciudad: "",
    },
    {
      nombre: {
        required: true,
        requiredMessage: "el nombre es obligatio !!!",
        patternMessage: "no puede tener o llevar numeros",
        pattern: /^[a-zA-Z]+$/,
        minLength: 1,
        maxLength: 30,
      },
      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,
        requiredMessage: "La contraseña es obligatoria",
      },
      confirmPassword: {
        required: true,
        matches: "password",
        matchMessage: "Las contraseñas no coinciden",
        requiredMessage: "Debe confirmar su contraseña",
      },
      age: {
        required: true,
        min: 18,
        max: 99,
        requiredMessage: "La edad es obligatoria",
      },
      terms: {
        checked: true,
        checkedMessage: "Debes aceptar los términos y condiciones",
      },
      ciudad: {
         selected: true,
         selectedMessage: "Debes seleccionar ciudad",
      },
    },
      { storageType: "session", storageKey: "forms" },
      { enableCSRF: true, rateLimit: 2000 }
  );

  const onSubmit = () => {
    console.log(target);
  };

  return (
    <>
      <form onSubmit={handleSubmit(onSubmit)}>
        <input
          type="text"
          name="nombre"
          value={target.nombre}
          placeholder="nombre"
          onChange={handleTarget}
        />
        {errors.nombre && <span>{errors.nombre.message}</span>}

        <input
          type="text"
          name="apellido"
          value={target.apellido}
          placeholder="apellido"
          onChange={handleTarget}
        />
        {errors.apellido && <span>{errors.apellido.message}</span>}

        <input
          type="email"
          name="email"
          value={target.email}
          placeholder="email"
          onChange={handleTarget}
        />
        {errors.email && <span>{errors.email.message}</span>}

        <input
          type="password"
          name="password"
          value={target.password}
          placeholder="password"
          onChange={handleTarget}
        />
        {errors.password && <span>{errors.password.message}</span>}

        <input
          type="password"
          name="confirmPassword"
          value={target.confirmPassword}
          placeholder="ConfirmPassword"
          onChange={handleTarget}
        />
        {errors.confirmPassword && (
          <span>{errors.confirmPassword.message}</span>
        )}

        <input
          type="number"
          name="age"
          value={target.age}
          placeholder="edad"
          onChange={handleTarget}
        />
        {errors.age && <span>{errors.age.message}</span>}

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

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

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

        <button>Enviar</button>
      </form>
    </>
  );
};

Implementando useTargetHandler con useHttpRequest 🔥 - NUEVO 🆕

import { useTargetHandler } from "usetargethandler";

export const Formulario = () => {
  const [target, handleTarget handleSubmit, errors, { apiCall, apiResponse, userFound, error }, apiUrl] = useTargetHandler({
    nombre: "",
    apellido: "",
  });

  const onSubmit = async (data) => {
    try {
      // Realiza la llamada a la API
      await apiCall("users", 1, data, "post", "application/json", { page: 1, limit: 10 }); // de ejemplo
      if (userFound) {
        console.log("Usuario creado:", apiResponse);
      } else {
        console.error("Error al crear usuario:", error);
      }
    } catch (err) {
      console.error("Error en la llamada a la API:", err);
    }
  };

  return (
    <>
      <form onSubmit={handleSubmit(onSubmit)}>
        <label></label>
        <input
          type="text"
          value={target.nombre}
          pattern="[a-zA-Z]+"
          placeholder="nombre"
          onChange={handleTarget}
          name="nombre"
          required
        />
      {errors.nombre && <span>{errors.nombre.message}</span>}

        <label></label>
        <input
          type="text"
          value={target.apellido}
          pattern="[a-zA-Z]+"
          placeholder="apellido"
          onChange={handleTarget}
          name="apellido"
          required
        />
      {errors.apellido && <span>{errors.apellido.message}</span>}

        <button>Enviar</button>
      </form>

      {apiResponse ? (
        <p style={{ color: "green" }}>{apiResponse}</p>
      ) : userFound ? (
        <p style={{ color: "red" }}>{userFound}</p>
      ) : (
        <p></p>
      )}
    </>
  );
};

🚨 Nuevas versiones y Actualizaciones Proximamente 🚨

Màs sobre la Funcionalidad del HOOK 👉🏻 FUNCTIONALITY 👈🏻

No te pierdas las ultimas versiones 👉🏻 CHANGELOG 👈🏻