Recomiendo que cuando se abra el aside de checkout y después que le das click a alguna tarjeta de nuevo, cerrar el aside de chekout porque sigue quedando abierto por debajo

Construir un Checkout Side Menu en React te permite mostrar los productos que un usuario agrega al carrito dentro de un panel lateral, sin abandonar la vista principal del e-commerce. Aquí aprendes cómo crearlo reutilizando la estructura de un componente existente, manejar su estado con Context API y resolver el cruce de eventos de clic que suele aparecer al combinar varios handlers.
Por qué reutilizar el componente Product Detail como base
Cuando ya tienes un Product Detail funcional, conviene copiar su estructura para acelerar el desarrollo del nuevo panel lateral. Ambos componentes comparten lógica: un aside que se abre y cierra, un ícono de cerrar y un título superior.
En la práctica, creas dentro de components una carpeta llamada CheckoutSideMenu con dos archivos: index.jsx y styles.css [01:38]. Copias el contenido de Product Detail, renombras el componente y ajustas la clase CSS para mantener consistencia visual. El título cambia a My Order porque ahora representa la orden de compra activa, no el detalle de un producto.
¿Qué es un Checkout Side Menu? Es un panel lateral que muestra los productos agregados al carrito en tiempo real, permitiendo al usuario revisar su orden sin salir de la página actual.
Qué partes del Product Detail debes conservar
Al reutilizar código, identifica qué piezas siguen siendo útiles y cuáles sobran:
useContext para leer el estado global.aside con apertura y cierre condicional.Eliminas la imagen del producto y los detalles individuales, porque el panel mostrará una lista de items, no un solo producto.
Cómo manejar el estado del Checkout Side Menu con Context
El panel necesita su propio estado de apertura, independiente del Product Detail. En el archivo context/index.jsx duplicas la lógica de isProductDetailOpen y la renombras a isCheckoutSideMenuOpen, junto con sus funciones openCheckoutSideMenu y closeCheckoutSideMenu [04:30].
Luego provees estos tres valores dentro del Provider para que cualquier componente de la aplicación pueda consumirlos. Dentro del componente CheckoutSideMenu lees context.isCheckoutSideMenuOpen para controlar la visibilidad y context.closeCheckoutSideMenu para el botón de cerrar.
¿Por qué usar Context API en lugar de props? Porque el carrito debe abrirse desde múltiples lugares (navbar, cards, botones de detalle) y pasar props por cada nivel sería repetitivo y frágil.
Dónde montar el componente en la aplicación
Un detalle clave: no importes el CheckoutSideMenu dentro de Home. En su lugar, móntalo en App.jsx para que viva en toda la aplicación. Esto te permite invocarlo desde cualquier ruta o componente sin volver a renderizarlo.
jsx import CheckoutSideMenu from './components/CheckoutSideMenu'
// dentro del return <CheckoutSideMenu />
Cómo resolver el cruce de eventos al hacer clic
Aquí viene lo interesante. Cuando el usuario da clic en el ícono + dentro de una card, se disparan dos eventos al mismo tiempo: el de la card completa (que abre el Product Detail) y el del ícono (que debería abrir el Checkout Side Menu) [07:45]. El resultado es que ambos paneles compiten y solo uno se muestra.
La solución es detener la propagación del evento en el ícono +. Modificas la función addProductToCart para recibir el evento como primer parámetro:
jsx const addProductToCart = (event, productData) => { event.stopPropagation() setCount(count + 1) context.openCheckoutSideMenu() context.closeProductDetail() }
El método stopPropagation evita que el clic burbujee hacia el contenedor padre. Ojo con la escritura: es stopPropagation, no stopProgration, un typo común que rompe la ejecución [09:12].
Qué hace exactamente stopPropagation
Cuando un elemento hijo recibe un clic, el evento normalmente sube por el árbol del DOM activando los listeners de sus padres. Llamar a stopPropagation corta ese viaje y deja que solo el elemento original procese la acción.
En el JSX del ícono pasas el evento explícitamente:
jsx <XMarkIcon onClick={(event) => addProductToCart(event, data)} />
De esta forma, al dar clic en + se abre el Checkout Side Menu y al dar clic en el cuerpo de la card se abre el Product Detail. Dos comportamientos coexistiendo sin conflicto.
Habilidades, conceptos y datos clave de la clase
Algunos elementos que vale la pena tener presentes para aplicar lo aprendido:
App.jsx: ubicar componentes compartidos en el nivel más alto de la app facilita su acceso desde cualquier ruta [10:30].Con el panel ya funcionando, el siguiente paso es crear una card pequeña por cada producto agregado, para que el usuario vea su orden en detalle. ¿Qué otros componentes reutilizarías de tu proyecto para ahorrar tiempo? Cuéntalo en los comentarios.
Construir un Checkout Side Menu en React te permite mostrar los productos que un usuario agrega al carrito dentro de un panel lateral, sin abandonar la vista principal del e-commerce. Aquí aprendes cómo crearlo reutilizando la estructura de un componente existente, manejar su estado con Context API y resolver el cruce de eventos de clic que suele aparecer al combinar varios handlers.
Cuando ya tienes un Product Detail funcional, conviene copiar su estructura para acelerar el desarrollo del nuevo panel lateral. Ambos componentes comparten lógica: un aside que se abre y cierra, un ícono de cerrar y un título superior.
En la práctica, creas dentro de components una carpeta llamada CheckoutSideMenu con dos archivos: index.jsx y styles.css [01:38]. Copias el contenido de Product Detail, renombras el componente y ajustas la clase CSS para mantener consistencia visual. El título cambia a My Order porque ahora representa la orden de compra activa, no el detalle de un producto.
¿Qué es un Checkout Side Menu? Es un panel lateral que muestra los productos agregados al carrito en tiempo real, permitiendo al usuario revisar su orden sin salir de la página actual.
Al reutilizar código, identifica qué piezas siguen siendo útiles y cuáles sobran:
useContext para leer el estado global.aside con apertura y cierre condicional.Eliminas la imagen del producto y los detalles individuales, porque el panel mostrará una lista de items, no un solo producto.
El panel necesita su propio estado de apertura, independiente del Product Detail. En el archivo context/index.jsx duplicas la lógica de isProductDetailOpen y la renombras a isCheckoutSideMenuOpen, junto con sus funciones openCheckoutSideMenu y closeCheckoutSideMenu [04:30].
Luego provees estos tres valores dentro del Provider para que cualquier componente de la aplicación pueda consumirlos. Dentro del componente CheckoutSideMenu lees context.isCheckoutSideMenuOpen para controlar la visibilidad y context.closeCheckoutSideMenu para el botón de cerrar.
¿Por qué usar Context API en lugar de props? Porque el carrito debe abrirse desde múltiples lugares (navbar, cards, botones de detalle) y pasar props por cada nivel sería repetitivo y frágil.
Un detalle clave: no importes el CheckoutSideMenu dentro de Home. En su lugar, móntalo en App.jsx para que viva en toda la aplicación. Esto te permite invocarlo desde cualquier ruta o componente sin volver a renderizarlo.
jsx import CheckoutSideMenu from './components/CheckoutSideMenu'
// dentro del return <CheckoutSideMenu />
Aquí viene lo interesante. Cuando el usuario da clic en el ícono + dentro de una card, se disparan dos eventos al mismo tiempo: el de la card completa (que abre el Product Detail) y el del ícono (que debería abrir el Checkout Side Menu) [07:45]. El resultado es que ambos paneles compiten y solo uno se muestra.
La solución es detener la propagación del evento en el ícono +. Modificas la función addProductToCart para recibir el evento como primer parámetro:
jsx const addProductToCart = (event, productData) => { event.stopPropagation() setCount(count + 1) context.openCheckoutSideMenu() context.closeProductDetail() }
El método stopPropagation evita que el clic burbujee hacia el contenedor padre. Ojo con la escritura: es stopPropagation, no stopProgration, un typo común que rompe la ejecución [09:12].
Cuando un elemento hijo recibe un clic, el evento normalmente sube por el árbol del DOM activando los listeners de sus padres. Llamar a stopPropagation corta ese viaje y deja que solo el elemento original procese la acción.
En el JSX del ícono pasas el evento explícitamente:
jsx <XMarkIcon onClick={(event) => addProductToCart(event, data)} />
De esta forma, al dar clic en + se abre el Checkout Side Menu y al dar clic en el cuerpo de la card se abre el Product Detail. Dos comportamientos coexistiendo sin conflicto.
Algunos elementos que vale la pena tener presentes para aplicar lo aprendido:
App.jsx: ubicar componentes compartidos en el nivel más alto de la app facilita su acceso desde cualquier ruta [10:30].Con el panel ya funcionando, el siguiente paso es crear una card pequeña por cada producto agregado, para que el usuario vea su orden en detalle. ¿Qué otros componentes reutilizarías de tu proyecto para ahorrar tiempo? Cuéntalo en los comentarios.
Recomiendo que cuando se abra el aside de checkout y después que le das click a alguna tarjeta de nuevo, cerrar el aside de chekout porque sigue quedando abierto por debajo

No sé si a alguien más le pase como a mí, la Card de 'My order' no se mostraba por un problema de estilos, pero sí era renderizada en el navegador. Solamente le agregué un top-20 a las clases de tailwind:
<aside
className={`${context.IsCheckoutSideMenuOpen ? 'flex' : 'hidden'} checkout-side-menu flex-col fixed top-20 right-0 border border-black rounded-lg bg-white`}
>
CheckoutSideMenu en Home?!gif
Una posible causa. Según lo que estuve viendo, parece ser un problema con el enrutamiento y la forma en que se renderiza el componente. Es posible que el componente CheckoutSideMenu esté oculto por <AppRouters />

Un compañero en los comentarios de estudio de Platzi sugiere agregarle top-20 y así debería funcionar.

Otra posible solución sugerida por otro compañero es colocar el componente CheckoutSideMenu en el componente Home, pero le argumentan lo siguiente:
El problema es que si luego quieres abrir el componente desde otra página, no se va a poder si está solo en
Home.

Mi posible solución es agregar el componente en el componente Layout, ya que se puede compartir con otras páginas y no sería necesario agregarle top-20.

!gif
Cuando apretamos el signo + , le añadí esta notificacion/alerta:

Me pareció mas conveniente crear un componente que se llame SideMenu de es forma se puede reutilizar la lógica y estructura ya creada en una primera ocasión, quedo así:
import { CloseIcon } from '../Icons'
export const SideMenu = ({ children, openMenu, handleCloseMenu, title }) => {
return (
<aside className={`${openMenu ? 'flex' : 'hidden'} w-[360px] h-[calc(100vh-80px)] t-[80px] flex flex-col bottom-1 right-1 fixed border border-black rounded-lg bg-white`}>
<section>
<div className='flex justify-between p-4 text-lg items-center'>
<h2 className='font-medium'>{title}</h3>
<button onClick={handleCloseMenu}><CloseIcon /></button>
</div>
<article className='p-2'>
{children}
</article>
</section>
</aside>
)
}
```Una vez hecho eso se puede usar en los otros componentes, sin ningún problema:
```js
export const Detail = () => {
const { isOpenDetail, handleCloseProductDetail, productToShow } = useCartCount()
const { price, title, images, description } = productToShow
return (
<SideMenu
openMenu={isOpenDetail}
handleCloseMenu={handleCloseProductDetail}
title='Detail'
>
<ArticleImage data={{ images, title }} />
<ArticleDetail data={{ price, title, description }} />
</SideMenu>
)
}
```Espero les pueda ayudar
Tal vez ya muchos lo sepan y sea un poco tarde decirlo pero si en vez de crear carpeta escriben ‘NombreCarpeta/index.jsx’ se crean la carpeta y contendrá el nombre del archivo que pusieron en este caso index
Por favor, solucionen este problema con la API y creen una nueva API de solo lectura para este curso. El problema actual es que todas las imágenes están rotas. Me vi obligado a detenerme y simular una API local a partir de un documento JSON para poder continuar con el curso. No deseaba utilizar otras como fakestoreapi, ya que la estructura de su API es mejor, especialmente por categoría.
cual es el shorcut de teclas para buscar y cambiar todas las palabras?
la api de platzi de productos esta vacia como soluciono eso para continuar con el curso
Les comparto mi avance 