Acceso

Componente Button añadir a Cart en LocalStorage con Next.js y React

toscadev

@ ToscaDevsJS


El componente ButtonAddToCart tiene la finalidad de agregar productos al carrito de compras. Este componente se enfoca en manejar la lógica de adición de productos al carrito y la visualización de un botón para este propósito. Veamos sus características principales:

App
favorite/page.tsx
"use client";
import { Product } from "@/app/page";
import Link from "next/link";
import { ChangeEvent, useEffect, useState } from "react";

export const ButtonAddToCart = ({ post }: { post: Product }) => {
  const [isCart, setToCart] = useState(false);
  const [quantity, setQuantity] = useState(1);

  useEffect(() => {
    setToCart(existInCart(post.id));
  }, [post.id]);

  const addToCart = (productId: number, quantityToAdd: number) => {
    // Obtener el carrito actual o usar un array vacío si no hay nada en localStorage
    let cart = JSON.parse(localStorage.getItem("Cart") || "[]");

    // Buscar si el producto ya está en el carrito
    const existingProduct = cart.find((item: Product) => item.id === productId);

    if (existingProduct) {
      // Si el producto ya está en el carrito, incrementa la cantidad pero no más allá del límite de stock
      const potentialNewQuantity = existingProduct.quantity + quantityToAdd;

      if (potentialNewQuantity > post.stock) {
        alert("No puedes añadir más de este producto. Stock insuficiente.");
        existingProduct.quantity = post.stock; // establecido en stock máximo disponible
      } else {
        existingProduct.quantity = potentialNewQuantity;
      }
    } else {
      // Si el producto no está en el carrito y la cantidad a añadir no excede el stock
      if (quantityToAdd <= post.stock) {
        // cart.push({
        //   id: productId,
        //   quantity: quantityToAdd,
        // });

        post.quantity = quantityToAdd; // Añadir la propiedad 'quantity' al objeto 'post'
        cart.push(post); // Añadir el objeto 'post' al carrito

        setToCart(true);
      } else {
        alert("No puedes añadir más de este producto. Stock insuficiente.");
      }
    }

    // Guardar el carrito actualizado en localStorage
    localStorage.setItem("Cart", JSON.stringify(cart));
  };

  const existInCart = (id: number): boolean => {
    const cart = JSON.parse(localStorage.getItem("Cart") || "[]");
    const existingProduct = cart.find((item: any) => item.id === id);
    return existingProduct;
  };

  const handleIncrement = () => {
    if (quantity < 10) {
      setQuantity(quantity + 1);
    }
  };

  const handleDecrement = () => {
    if (quantity > 1) {
      setQuantity(quantity - 1);
    }
  };

  const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
    const value = parseInt(event.target.value, 10);
    if (value >= 1 && value <= 10) {
      setQuantity(value);
    }
  };

  return (
    <>
      <br />
      <br />
      <div className="text-center p-4">
        <button onClick={handleDecrement}>-</button>
        <input
          type="number"
          className="bg-black w-10 text-center"
          value={quantity}
          onChange={handleChange}
          min={1}
          max={10}
        />
        <button onClick={handleIncrement}>+</button>
      </div>

      <div className="text-center">
        stock: {post.stock} <br />
        <button
          className="p-4 bg-slate-500 rounded-2xl text-center"
          onClick={() => addToCart(post.id, quantity)}
        >
          Añadir a la cesta
        </button>
        <br />
        <br />
        {isCart && (
          <Link className="p-2 font-mono" href={"/cart"}>
            ir al carrito {"->"} 🛒
          </Link>
        )}
      </div>
    </>
  );
};

Regresar al Blog.

© Copyright 2024 ToscaDevJS.