No tienes acceso a esta clase

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

Checkout de productos en el carrito

22/31
Recursos

¿Cómo visualizar la orden de compra en My Orders?

Para hacer visible la orden de compra que se realizó en el checkout, es esencial implementar ciertos ajustes en nuestro código y estructura de la aplicación. Vamos a guiarte a través de los pasos clave para lograrlo, asegurando que la pantalla de My Orders refleje la transacción más reciente.

¿Cómo adaptar el botón para redirigir a My Orders?

En primer lugar, necesitas convertir el botón de checkout en un enlace que redirija a la vista de My Orders. Esto se logra utilizando el componente Link de react-router-dom. Aquí te mostramos cómo hacerlo:

import { Link } from 'react-router-dom';

// ... Dentro de tu componente
<Link to="/myorders/last">
  <button onClick={handleCheckout}>Do Checkout</button>
</Link>

¿Cómo asegurarnos de que la ruta de My Orders está correctamente configurada?

Es crucial para la funcionalidad que la ruta /myorders/last apunte al componente correcto y esté debidamente configurada en el archivo App.js. Esto se logra agregando la siguiente línea en tu archivo de rutas:

<Route path="/myorders/last" component={MyOrder} />

¿Cómo renderizar los productos comprados en My Orders?

Una vez que hemos configurado nuestra aplicación para navegar exitosamente a My Orders, el siguiente paso es mostrar la información de la última orden realizada. Para esto, utilizamos un estado global, order, que contiene los detalles de las transacciones:

  1. Acceder al contexto: Asegúrate de importar y utilizar el contexto adecuado para extraer los datos de la última orden.

    import { useContext } from 'react';
    import { ShoppingCardContext } from './ShoppingCardContext';
    
    const MyOrder = () => {
      const { order } = useContext(ShoppingCardContext);
    
  2. Visualizar los productos: Usa un proceso similar al método slice para obtener solo los productos de la última orden:

    if (order.length > 0) {
      const lastProducts = order.slice(-1)[0]?.products.map(product => (
        <OrderCard key={product.id} product={product} />
      ));
    }
    
  3. Evitar botones innecesarios: Es valioso eliminar elementos de la UI que no son necesarios en el contexto de MyOrder, como el botón de eliminar, que es útil únicamente en el carrito de compras.

    let renderXmarkIcon = null;
    if (handleDelete) {
      renderXmarkIcon = <Icon name="xmark" />;
    }
    

¿Cómo estilizar My Orders para una presentación más atractiva?

Para una experiencia de usuario fluida y visualmente agradable, es importante ajustar el diseño. Aquí te damos algunas sugerencias para mejorar la apariencia:

  • Eliminar scroll innecesario: Ajusta la apariencia eliminando márgenes o paddings innecesarios.

    .order-container {
      display: flex;
      flex-direction: column;
      width: 80%;
    }
    

Al implementar estos cambios, conseguirás una interfaz organizada y limpia, tanto en términos de navegación como en la presentación de información. ¡Continuemos fortaleciendo nuestras habilidades en React y explorando más posibilidades en el desarrollo web!

Aportes 27

Preguntas 3

Ordenar por:

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

Otra opción para quitar la x de mi ultima orden es

            <div className="flex items-center gap-2">
                <p className="text-lg font.medium">{price} </p>

                {
                    handleDelete &&                 
                    <XMarkIcon
                    onClick={()=>handleDelete(id)}
                    className="h-4 w-4 text-black cursor-pointer "/>
                }

            </div>

Creo que tambien deberiamos cerrar la ventana de checkout cuando pasamos al link de myOrder, solo agregamos context.closeCheckoutSideMenu() en la funcion handleChekout.

    const handleCheckout = () => {
        const orderToAdd = {
            date: '01.02.23',
            products: context.cardProducts,
            totalProducts: context.cardProducts.length,
            totalPrice: totalPrice(context.cardProducts)
        }

        context.setOrder([...context.order, orderToAdd])
        context.setCardProducts([])
        context.setCount(0);
        context.closeCheckoutSideMenu()
    }

☹ odio cuando tengo el código bien y me salen errores, tardo minutos o hasta horas en dizque encontrar el error, y lo único que debo de hacer es reiniciar la página o el npm run dev.

En vez de utilizar slice podriamos utilizat .at(-1)
asi nos trae el ultimo elemento

Me estaba arrojando error en MyoRDER CON LA EXPRESIÓN:

context.order?.slice(-1)[0].products.map(product => ( ...)

Tuve que moodificar la expresión por:

{
        context.order && context.order.length > 0 ? 		 
  	context.order.slice(-1)[0].products.map(product => (
                    <OrderCard 
                    key={product.id}
                    id={product.id}
                    title ={product.title}
                    imageUrl = {product.images}
                    price= {product.price}
                    
                    />
                    
              ))
              : <p>No hay productos en la orden.</p>
            }

Acá explico que significa cada pieza de código:

  1. context.order && context.order.length > 0: Esta parte es una comprobación condicional que verifica si “context.order” existe y si tiene al menos un elemento en su interior. Si ambas condiciones se cumplen, el código después del signo “?” será evaluado.

  2. context.order.slice(-1)[0].products.map(…) : Si “context.order” existe y tiene al menos un elemento, se procede a realizar una operación en la propiedad “products” del último elemento de la matriz “context.order”. La función “slice(-1)” se utiliza para obtener el último elemento del array, y luego se accede a su propiedad “products” para realizar un mapeo de los elementos de esa propiedad.

  3. map(product => …): Aquí, el código realiza un mapeo de cada elemento del array “products” del último elemento de “context.order”. Por cada elemento en “products”, se renderiza un componente “OrderCard” con las propiedades “id”, “title”, “imageUrl” y “price” obtenidas de cada elemento de “products”.

  4. : <p>No hay productos en la orden.</p>: Si “context.order” no existe o no tiene elementos (length igual a 0), se renderiza el párrafo “<p>No hay productos en la orden.</p>” en lugar de la lista de “OrderCard”. Esto sirve para indicar al usuario que no hay productos en la orden o que la orden está vacía.

Puede ser así también para que se vea un poquito más limpio.

A la maestra no se le resaltan los errores de JS en VS Code, simplemente instalen la extensión de Error Lens y tendrán resaltado de errores antes de que los tengan que ver en el navegador 😄

Si les aparece un error por intentar encontrar una propiedad de “undefined”, recuerden que hacerle un map a un objeto undefined va a resultar en una excepción que no permite visualizar los demás componentes gráficos. Usen el ‘’?"’ para verificar si la variable u objeto existe primero.

Ej:

context.shoppingCartOrder?.slice(-1)[0]?.products.map( product =>
                        <OrderCard
                            key={product.id}
                            id={product.id}
                            title={product.title}
                            imgUrl={product.images}
                            price={product.price}
                        />

Así me quedó My order

Para los que tengan el problema de que no les muestra los productos en MyOrder, verifiquen que tengan bien definido el estado order. Que por default sea un array, mas no un objeto… Me llevó casi tres días darme cuenta, así que verifiquen su código cuantas veces sean necesarias.

//order está definido en la carpeta Context del proyecto

<const [order, setOrder] = useState([])> 
Por que cuando usa el contexto de "order" le aparece la información al hacer click en Checkout y cambiar de pagina pero cuando yo hago lo mismo la información se pierde pues se recarga al cambiar de pagina y "order" queda vacío. Pero en la clase no sucede esto. No comprendo

Si tienen este error:
Para solucionar el error debemos de envolver los componentes de React-Router-DOM (Link, NavLink…) o componentes que usan estos, dentro de BrowserRouter.

Esto nos permitira usar todos los componentes provenientes de React-Router-DOM de manera general en la aplicacion, en los componentes hijos de BrouserRouter en el componente App.

En el momento en que ustedes recarguen y no tengan ordenes que mostrar les generara un error, me parecio curioso que ```js context.order?.slice...... ```No funcionara, por ende hice una segunda validación para mostar un mensaje en pantalla en caso de aún no hayamos añadido ordenes. ```js <Layout> MyOrder
{ context.order.length >= 0 ? (

No se han añadido ordenes aún

) : ( context.order?.slice(-1)[0].products.map(product => ( <OrderCard key={product.id} id={product.id} title={product.title} imageURL={product.images} price={product.price} /> )) ) }
</Layout> ```

Para los que tengan problemas haciendo mostrar las órdenes en “MyOrder” con el método “slice”, otra alternativa es hacer:

order[order.length -1].products.map(productInfo => ...

La condición mostrada en el componente de myOrder que va en un if debe de ir dentro de un useEffect, dejando el if así es un evento no controlado, otra opción es dentro del HTML una condición con &&.

Otra opción pa renderizar la x icon es verificar si tenemos productos en nuestro estado productToCart, si no hay nada no muestra la x, recuerda que una vez nuestros productos se envian a my order, nuestro carrito se queda vacio entonces no deberia renderizar la x en nuestro componente:

const renderXmarkIcon = productToCart.length > 0 ? true : false

{
          renderXmarkIcon && <div 
          onClick={(e) => productRemoveFromCart(e, id)}
        >
        <XmarkIcon />
        </div>
        }

El "error" que aparece en la consola al recargar se debe a que estamos ubicados en el endpoint "my-orders/last". Como no estamos utilizando persistencia de datos, al recargar la pag los productos agregados en "order" se pierden. Por ese motivo nos sale ese error ya que no puede hacer el "products.map()" por que es undefined.
Mi solution para que el sideMenu se oculte despues de hacer checkout. ![](https://static.platzi.com/media/user_upload/image-2e60271c-516f-4333-b152-9b7c11d9a9eb.jpg)
Tengo un problema cuando realizo el checkout. Cuando meto al botón como hijo del Link y realizo el Checkout, esta borrando todo el cartProduct pero instantaneamente vuelve y pone el ultimo producto de array en cartProducts, por lo que ese producto no se borra del check out side menu. Si saco el botón del Link y hago el mismo proceso esto no sucede (pero no me lleva hacia la otra página) y tampoco si hago el Checkout, utilizando Link, desde "./my-orders/last". La solución que se me ocurrió fue utilizar un setTimeout para que la acción de borrar tenga un delay pero con un tiempo muy corto para que no sea perceptible por el usuario. ¿Alguien sabe por qué al momento de cambiar hacia la otra página a través del Link esto puede estar sucediendo? ya que no se si utilizar setTimeout sea la mejor solución. Aqui esta mi repositorio en GitHub para que puedan revisar el código: <https://github.com/NicoPaint/Shopi> De antemano, muchas gracias por su ayuda.
Encontre un error cuando recargas la pagina directamente en /my-orders/last y no hay ninguna orden. El error sucede porque cuando `context.order` está vacío, `context.order.slice(-1)` devuelve un array vacío, y al intentar acceder al índice `[0]`, obtengo `undefined`. Luego, al intentar acceder a `.products` en ese `undefined`, aparece el error. Lo resolví verificando primero si `context.order.length > 0`. Así me aseguro de que el array no esté vacío antes de intentar acceder a sus propiedades. También podría haber usado el encadenamiento opcional (`?.`) para evitar el problema. Algo como esto: ```js {context.order?.length > 0 ? context.order.slice(-1)[0]?.products?.map(product => ( <OrderCard key={product.id} {...product} /> )) :
No hay ninguna orden
} ```
🙂 ![](https://static.platzi.com/media/user_upload/image-1aaea135-92b3-402e-b400-0daab234ea5d.jpg)
podemos usar este div que ya teniamos para poder mostrar tambien el totalPrice the nuestra ultima orden: ```js

Total: ${context.order?.slice(-1)[0].totalPrice}

```
Esto solucionó el problema: ```js { context.order?.slice(-1)[0]?.products?.map(product => { return ( <OrderCard key={product.id} id={product.id} title={product.title} image={product.images} price={product.price} /> ) }) } ```                      
```js // ORDERCARD.TSX import { XMarkIcon } from "@heroicons/react/24/solid" import { Items } from "../../Global/globalConst" export const OrderCard = ({ id, title, price, image, handleDelete }: Items): JSX.Element => { let renderXmarkIcon: JSX.Element = <XMarkIcon className='h-6 w-6 cursor-pointer' onClick={() => handleDelete({ id })} /> return (

{title}

${price}

{handleDelete && renderXmarkIcon}
) } ```*//MYORDERS.TSX*import { useShoppingContext } from '../../Context/Context';import { Layout } from '../../Components/Layout/Layout';import { OrderCard } from '../../Components/OrderCard/OrderCard';import { Props } from '../../Global/globalConst';import './MyOrder.css'; export *const* MyOrder = ({ }: Props): any => {     *const* { order } = useShoppingContext();     *return* (        \<Layout>            \

MyOrders\

            \
                {order.slice(-1)\[0]?.product.map(item =>                    \<OrderCard                        key={item.id}                        {...item}                    />                )}            \
        \</Layout>    )} ```js //MYORDERS.TSX import { useShoppingContext } from '../../Context/Context'; import { Layout } from '../../Components/Layout/Layout'; import { OrderCard } from '../../Components/OrderCard/OrderCard'; import { Props } from '../../Global/globalConst'; import './MyOrder.css'; export const MyOrder = ({ }: Props): any => { const { order } = useShoppingContext(); return ( <Layout>

MyOrders

{order.slice(-1)[0]?.product.map(item => <OrderCard key={item.id} {...item} /> )}
</Layout> ) } ```
Para los que tienen el error de que slice no es una funcion y ya verificaron la mejora que hizo la profe, aseguremos que al setear el valor del estado order sea como un array y no como un objeto: ![](https://static.platzi.com/media/user_upload/image-d1242f59-2271-41db-85ad-aef8c68194dc.jpg)

Asi Vamos…

Otra forma de hacerlo es con el hook useNavigate!