No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
14 Hrs
1 Min
37 Seg

Agregando productos al carrito

15/31
Recursos

Aportes 19

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Para solucionar el error que ocurre en el arreglo de imágenes pueden utilizar el operador Optional chaining (?.)

?.

Ejemplo de cómo quedaría el código accediendo a la imagen:

<img
	className="w-full h-full rounded-lg"
        src={context.productToShow.images?.[0]}
        alt={context.productToShow.title}
  />

Este operador se utiliza para acceder a propiedades de objetos anidados de forma segura, evitando errores si alguna de las propiedades no está definida o es nula.

Una gran recomendación, instalen las extensiones de React Developer Tools, React Context DevTool y Redux DevTools para ver toda la información de la aplicación SIN necesidad de hacer console.log.
No está mal hacer console.log, pero creo que puede servir también bastante utilizar estas herramientas y nos ahorramos aunque sea un poco de código 😃

no se si mas adelante se realize esto, pero se puede desestructurar data para no tener que poner data.data repetidamente sino solamente data

La razon de que no salga en consola el primer producto que estefany agrega al carrito es por la posicion donde esta ese console.log(), si lo ponemos en el context justo debajo del estado del carrito de compras si nos muestra ambos productos. Es como si el estado no se terminara de actualizar (setCartProducts), hasta que se cierra la funcion addProductsToCart

No sé que tan bien esté, pero yo solucioné el problema del objeto de product detail poniendo el condicional &&, así si no existe ese arreglo ni siquiera me carga el componente, por lo que si tengo images[0] no me dará error, ya que lo carga hasta que haya algo

Pueden colocar el siguienet codigo para que la imagen de Product Detail sea igual a la que muestran en la Card:

const [productToShow, setProductToShow] = useState({
    title: "",
    price: "",
    description: "",
    images: [],
  });

Les dejo un Pantallazo:

El Spread Operator corresponde a un operador el cuál distribuye los elementos de un arreglo u objeto, para asignarlos a alguna variable/constante/función.

La API de [Platzi Fake Store API](https://fakeapi.platzi.com/) esta rota a la fecha 8/mayo/2024. Mi aplicacion dejo de cargar toda la informacion y revisando el contenido de la API, claramente alguien estuvo jugando con ella
const Card = (data) => {
	const context = useContext(ShoppingCartContext)

	const showProduct = (productDetail) => {
		context.openProductDetail()
		context.setProductShow(productDetail)
	}

	const addProductToCart = (productData) => {
		context.setCount(context.count + 1)
		context.setCartProducts([...context.cartProducts, productData])
	}

	return (
		<div 
			className="bg-white cursor-pointer w-56 h-60 rounded-lg" 
			onClick={() => showProduct(data.data)}>
			<figure className="relative mb-2 w-full h-4/5">
				<span className="absolute bottom-0 left-0 bg-white/60 rounded-lg text-black text-xs m-2 px-3 py-0.5">{data.data.category.name}</span>
				<img className="w-full h-full object-cover rounded-lg" src={data.data.images[0]} alt={data.data.title} />
				<div className="absolute top-0 right-0 flex justify-center items-center bg-white w-6 h-6 rounded-full m-2 p-1" onClick={() => addProductToCart(data.data)}>
				<PlusIcon className='h-6 w-6 text-black' />
				</div>
			</figure>
			<p className="flex justify-between">
				<span className="text-sm font-light">{data.data.title}</span>
				<span className="text-lg font-medium">${data.data.price}</span>
				</p>
		</div>
	)
}

Opcionalmente se puede enviar una funcion a los setters de los estados, en lugar de el valor directo:

const onIncrementClick = (e) => {
	e.stopPropagation();
	setCartItems((items) => [...items, data]);
	incrementCount();
};

Dicha funcion recibe como argumento el valor actual del estado

mi código escrito en TS: ![](https://static.platzi.com/media/user_upload/carbon%20%286%29-c7d4af65-3ab5-49ba-8e0b-e943f7efae1d.jpg)![](https://static.platzi.com/media/user_upload/carbon%20%287%29-07b0b06c-9d7a-43f7-8362-82dafebeddab.jpg)
Me pueden ayudar con este error he seguido tal cual el paso a paso de la profe, y em dice que no es una función. me ayudan por fa ![](https://static.platzi.com/media/user_upload/image-84dde250-d2f0-4148-b508-9d6f41345fc8.jpg)
Para los que no entienden el por qué no se puede ver en la consola el nuevo valor del **estado**, les dejo la explicación y el link a la documentación que habla de esto: **Link:** <https://es.react.dev/reference/react/useState#ive-updated-the-state-but-logging-gives-me-the-old-value> **Explicación:** lo que sucede es que cuando se actualiza un **estado**, se corre un proceso que no modifica el estado *(cartItems en mi caso)* en el controlador de evento que ya se está ejecutando *(addItemToCar en mi caso)*. Si necesitas usar el siguiente estado, puedes guardarlo en una variable *(cart en mi caso)* antes de pasarlo a la función de actualización: ```js const addItemToCar = (product: Product) => { const cart = [...cartItems, product]; console.log('cart: ', cart); setCartItems([...cartItems, product]); console.log('cartItems: ', cartItems); } ```
Para que si agregas el mismo producto mas de una vez no se repita el objeto, sino que se empiece a sumar yo hice esto: ```js const addProductsToCart = (productData) => { setCount(count + 1); const existingProductIndex = shoppingCartProducts.findIndex( (product) => product.id === productData.id ); console.log(existingProductIndex); if (existingProductIndex !== -1) { const updatedShoppingCartProducts = [...shoppingCartProducts]; updatedShoppingCartProducts[existingProductIndex].qty += 1; setShoppingCartProducts(updatedShoppingCartProducts); } else { const productWithQty = { ...productData, qty: 1 }; const shoppingCartProductsCopy = [ ...shoppingCartProducts, productWithQty, ]; setShoppingCartProducts(shoppingCartProductsCopy); } console.log(shoppingCartProducts); }; ```![](https://static.platzi.com/media/user_upload/image-006f3d75-93c3-4f28-b4a3-66bc80726a2c.jpg)![](https://static.platzi.com/media/user_upload/image-f8f13845-2565-45f5-b337-17f56fc171d7.jpg)
![](https://static.platzi.com/media/user_upload/image-88ccad26-47c0-4d9a-9451-aae9ca0eb1b7.jpg) Para visualizar de una mejor manera lo que pasa cuando le damos clic a agregar, podemos instalar la extensión de React en nuestro navegador, en este caso estoy utilizando Firefox y así se ve cuando el estado se actualiza.
Una forma más fácil para mi punto de vista de hacerlo, importando también los estados en nuestro archivo Card con useContext. ```js <PlusCircleIcon className="absolute text-sm top-1 right-1 flex justify-center items-center bg-white/90 rounded-full w-6 h-6" onClick={() => { setCount(count + 1) setAddCartProducts([...addCartProducts, data.data]) console.log(addCartProducts) }} /> ```
me sale error en la descripcion, aparece es esl estado de isOpen
se vale hacer esto en ShoppingCartProvider: `./src/Context/index.jsx` ```js export const ShoppingCartProvider = ({ children }) => { // Shopping Cart - Count const [ count, setCount ] = useState(0) // Shopping Cart - Products const [ cartProducts, setCartProducts ] = useState([]) const addProductToCart = (productData) => { const _cartProducts = [...cartProducts, productData] setCartProducts(_cartProducts) setCount(_cartProducts.length) } // ... ````./src/Components/Card/index.jsx````js import { useContext } from 'react' import { ShoppingCartContext } from '../../Context' import { PlusCircleIcon } from '@heroicons/react/24/outline' const Card = (data) => { const { addProductToCart, openProductDetail, setProductDetailData } = useContext(ShoppingCartContext) //... return ( // ... <button onClick={ () => addProductToCart(data.data) } className='absolute top-0 right-0 m-2 cursor-pointer' > <PlusCircleIcon className='w-6 h-6' /> </button> // ... } export default Card ```Mi idea es no tener que exportar/importar setCount y poder hacer toda la manipulación del estado en un solo lugar... qué opinan?

asi va mi codigo

import { useContext } from 'react';
import { ShoppingCartContext } from '../../Context';
import { PlusIcon } from '@heroicons/react/24/solid';

const Card = ({ category: { name }, ...props }) => {
  const {
    count,
    setCount,
    openProductDetail,
    setproducToShow,
    setcarProducts,
    carProducts,
  } = useContext(ShoppingCartContext);

  const showProduct = (productDetail) => {
    openProductDetail();
    setproducToShow(productDetail);
  };

  const addProductsToCart = () => {
    setCount(count + 1);
    setcarProducts([...carProducts, { ...props }]);

    console.log('entra', { ...props });
  };

  return (
    <div
      className='bg-white cursor-pointer w-56 h-60 rounded-lg'
      onClick={() => showProduct({ ...props })}
    >
      <figure className='relative mb-2 w-full h-4/5'>
        <span className='absolute bottom-0 left-0 bg-white/60 rounded-lg text-black text-xs m-2 px-3 py-0.5'>
          {name}
        </span>
        <img
          className='w-full h-full object-cover rounded-lg'
          src={props.images}
          alt={props.title}
        />
        <button
          onClick={addProductsToCart}
          className='absolute top-0 right-0 flex justify-center items-center bg-white w-6 h-6 rounded-full m-2 p-1'
        >
          <PlusIcon></PlusIcon>
        </button>
      </figure>
      <p className='flex justify-between'>
        <span className='text-sm font-light'>{props.title}</span>
        <span className='text-lg font-medium'>${props.price}</span>
      </p>
    </div>
  );
};

export default Card;