¿Cómo se pueden visualizar todas las órdenes creadas en una aplicación de Shoppy?
La gestión y visualización de órdenes en una plataforma de compras es esencial para los usuarios finales y los desarrolladores. En esta lección, veremos cómo crear una función en Shoppy para visualizar las órdenes de manera efectiva, permitiendo a los usuarios revisar fechas, cantidades y precios.
¿Cómo crear y estructurar el componente Order en el proyecto?
Primero, necesitamos definir el componente que representará cada orden. Este componente se alojará en una carpeta que nombraremos OrdersCard y dentro de ella crearemos un archivo index.jsx. La estructura de este componente incluirá:
Visualización de la fecha de creación de la orden.
Cantidad total de productos en la orden.
Precio total de los productos.
Un ícono que indique navegación, permitiendo ver los detalles de cada orden.
Implementación del componente
Aquí proponemos una estructura de código para visualizar una orden:
// index.jsx del componente OrderCardfunctionOrdersCard({ totalPrice, totalProducts, date }){return(<div className="order-card border-black"><span>{`Fecha: ${date}`}</span><span>{`Total de Productos: ${totalProducts}`}</span><span>{`Precio Total: ${totalPrice}`}</span></div>);}exportdefaultOrdersCard;
¿Cómo integrar OrderCard en la página MyOrders?
Para mostrar todas las órdenes, utilizaremos el componente OrdersCard en la página MyOrders. La idea es que esta página tomará las órdenes desde un contexto global (en este caso, un contexto de carrito de compras) y las renderizará mediante un map.
Código para renderizar órdenes
Incluimos el contexto del carrito de compras y usamos un .map para mostrar cada orden:
// En la página MyOrdersimportReact,{ useContext }from'react';import{ShoppingCartContext}from'../context/ShoppingCartContext';importOrdersCardfrom'../components/OrderCard';functionMyOrders(){const{ orders }=useContext(ShoppingCartContext);return(<div>{orders.map((order, index)=>(<OrdersCard key={index} totalPrice={order.totalPrice} totalProducts={order.totalProducts} date={order.date}/>))}</div>);}exportdefaultMyOrders;
¿Cómo manejar la navegación en MyOrders?
Una parte fundamental para mejorar la experiencia del usuario es permitir la navegación hacia los detalles de cada orden al hacer clic sobre ella. Esto se logra encapsulando OrdersCard en un componente Link de React Router.
Incorporación de navegación en las órdenes
import{Link}from'react-router-dom';// Dentro de la función de renderizado<Link to={`/myorders/${order.id}`} key={index}><OrdersCard totalPrice={order.totalPrice} totalProducts={order.totalProducts} date={order.date}/></Link>
¿Cómo personalizar el estilo y corregir errores visuales?
A veces, el problema está en los detalles visuales. Asegúrate de que el contenedor tiene un width adecuado para justificar los elementos correctamente y usar justify-center para centrar el texto interiormente.
Para aquellos casos en los que hay que volver a una página anterior, utiliza un icono (como chevron-left) adyacente al título de la página. Esto se puede realizar importando íconos de bibliotecas como Heroicons.
Motivación y persistencia
Es emocionante mostrar cómo un proyecto web puede traer mejoras en la experiencia de usuario diaria. La persistencia de datos es el próximo paso, crucial para mantener estados incluso después de recargas de página. Esta persistencia se puede abordar en módulos posteriores.
Te animamos a seguir experimentando y aprendiendo sobre cómo hacer los sistemas más eficientes y usuarios más satisfechos. La programación de interfaces no solo es un reto, es una oportunidad para crear algo impactante. ¡Sigue adelante y nos vemos en la próxima clase!
Para tener la fecha en la cual se realizó la orden, hice algunos cambios en la función de handleCheckout de CheckoutSideMenu:
...consthandleCheckout=()=>{const date =newDate();const orderToAdd ={date: date.toLocaleDateString(),products: context.productsInCart,totalProducts: context.productsInCart.length,totalPrice:totalPrice(context.productsInCart)...}
Ahora la fecha se pasará como date por medio de Props, desde la Page de MyOrders a cada componente de tipo OrdersCard
Ahí resulta práctico crear un archivo en Utils para tener disponible siempre la función de obtener la fecha, así quedó la mía, luego se usa igual que la suma, solo que no recibe parámetros:
/**
* This function obtains current DateTime
* @returns{number} Date Time
*/exportconstdateTime=()=>{var today =newDate();var date = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate();var time = today.getHours()+":"+ today.getMinutes()+":"+ today.getSeconds();var dateTime = date+' '+time;return dateTime;}
Me gusta como va el curso pero usar el Index de un array como key no es para nada recomendado. React.js no lo recomienda en su sintaxis ya que podría interferir con el render de React y tener comportamientos inesperados.
Hasta donde he investigado podría determinarse como mala practica.
Si hay algo que se pueda añadir a raíz de esta sintaxis y se pueda usar el índex en ciertos casos, por favor, déjame saberlo.
Puedes usar perfectamente el index del array solo si sabes que ese array nunca cambiará, osea no se eliminará ni se ordenará ningún elemento del array, en el caso del curso es mucho mejor utilizar la id que te proporciona la api, si no la id que te proporciona una base de datos en un proyecto real.
Asi use una function en utils para el tema del Date*/** * @param {Date} date * @returns {String} Formatted date */*const formatDate = (date) => { date = new Date(date) const [day, month, year, hour, minutes] = [ date.getDate(), date.getMonth() + 1, date.getFullYear(), date.getHours(), date.getMinutes(), ]
return ${day}/${month}/${year} ${hour}:${minutes}}
/**
* @param{Date}date * @returns{String} Formatted date
*/constformatDate=(date)=>{ date =newDate(date)const[day, month, year, hour, minutes]=[ date.getDate(), date.getMonth()+1, date.getFullYear(), date.getHours(), date.getMinutes(),]return`${day}/${month}/${year}${hour}:${minutes}`}
No creo que no lo use porque no quiera, cada programador/a tiene su manera de ir navegando dentro de su app. Yo también soy de los que navega usando el link en vez de el navbar.
También tener en cuenta que puede estar acostumbrada a trabajar con aplicaciones que ya tienen persistencia de datos.
cual es el error que te muestra primero la console?
Para obtener la fecha de compra agregue un nuevo módulo en Utils que toma la fecha actual y le da él un formato de fecha y hora
/**
* This function obtains the current DateTime in the format 'DD-MM-YYYY HH:mm:ss'
* @returns{string} Current DateTime in 'YYYY-MM-DD HH:mm:ss' format
*/exportconstdateTime=()=>{const today =newDate();const year = today.getFullYear();const month =(today.getMonth()+1).toString().padStart(2,'0');const day = today.getDate().toString().padStart(2,'0');const hours = today.getHours().toString().padStart(2,'0');const minutes = today.getMinutes().toString().padStart(2,'0');const seconds = today.getSeconds().toString().padStart(2,'0');const dateTime =`${day}-${month}-${year}${hours}:${minutes}:${seconds}`;return dateTime;};
Tuve problemas en mi codigo (por hacer las cosas diferente) y termine usando las rutas para acceder a cada orden (les di un id a cada orden), lo hice de esta manera:
En mi path, inclui ":orderId" como Url Param en el path de my_order para poder acceder a los datos especificos de cada orden sin tener que pasar objetos o acceder al contexto.
Cada card de cada orden renderizada en la pagina my orders tenia el id de la orden asi que solo debia pasar ese id cuando queria redirigir a my_order/{id de la orden}