Shopify hidrógeno: cómo crear un Storefront de comercio electrónico sin cabeza con React | Christopher Dodd | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Shopify hidrógeno: cómo crear un Storefront de comercio electrónico sin cabeza con React

teacher avatar Christopher Dodd, Shopify Web Developer & Educator

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción

      1:14

    • 2.

      Conceptos clave

      1:49

    • 3.

      Reacción

      21:54

    • 4.

      API de Storefront

      16:46

    • 5.

      El marco de Shopify de hidrógeno

      6:32

    • 6.

      Cómo comenzar con el hidrógeno

      17:03

    • 7.

      Creación de un componente de diseño

      9:40

    • 8.

      Construyendo una página de catálogo

      27:34

    • 9.

      Construyendo una página de colección

      11:02

    • 10.

      Construyendo una página de productos

      39:10

    • 11.

      Carrito Funcionalidad pt. 1

      22:13

    • 12.

      Carrito Funcionalidad pt. 2

      18:57

    • 13.

      Despliegue nuestro Storefront personalizado

      15:53

    • 14.

      Bono: adición de una sección de blog

      27:10

    • 15.

      Conclusión y proyecto de clase

      0:42

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

752

Estudiantes

2

Proyectos

Acerca de esta clase

A mediados de 2022, Shopify lanzó un nuevo canal de ventas en la plataforma de Shopify, que permite a los comerciantes organizar un proyecto de React en su tienda de Shopify. Este nuevo canal de venta de hidrógeno, junto con el marco de hidrógeno de ganchos, componentes y servicios de React creados específicamente para Shopify ofrece una manera totalmente nueva de personalizar la experiencia de las tiendas en línea para los clientes.

En esta clase, vamos a pasar por el marco de Shopify para aprender sobre los conceptos clave que lo rodean, crear nuestro propio escaparate de tiendas sencillo con el sistema y mostrarte cómo instalar tu nueva aplicación en tu tienda de Shopify.

Conoce a tu profesor(a)

Teacher Profile Image

Christopher Dodd

Shopify Web Developer & Educator

Top Teacher

Christopher Dodd is a freelance Shopify developer and educator with over six years of experience building custom themes for e-commerce brands.

He is a Skillshare Top Teacher with more than 93,000 students across 22 classes, and one of the most-watched creators of Shopify frontend development content on YouTube.

His client work includes brands such as HiSmile and Ringers Western.

Ver perfil completo

Habilidades relacionadas

Desarrollo sin código Shopify Desarrollo
Level: Advanced

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Introducción: Hola, alumnos y bienvenidos a esta clase de Shopify Hydrogen. Marco basado en React de Shopify para crear escaparates personalizados. Soy Christopher Dodd. Soy desarrollador web freelance y top teacher aquí en skillshare.com. Habiéndome especializado en el desarrollo web front-end en la plataforma Shopify durante los últimos tres a cuatro años, he pasado mucho tiempo personalizando escaparates con uno de estos, un tema de Shopify. Pero a mediados de 2022, Shopify lanzó un nuevo canal de ventas en la plataforma Shopify, permitiendo a los comerciantes albergar un proyecto React en su tienda Shopify. Este nuevo canal de ventas de Hydrogen emparejado con el marco de Hydrogen de React Hooks, componentes y utilidades construidos específicamente para Shopify escaparates ofrece una nueva forma de personalizar el online experiencia de tienda para los clientes y una nueva forma de desarrollo para desarrolladores. En la clase de hoy, vamos a pasar por el marco de Shopify Hydrogen, aprender sobre los conceptos clave del entorno, construir nuestro propio escaparate simple usando el sistema. Te mostraré cómo puedes instalar tu nueva app en la tienda Shopify. Para aquellos de ustedes que estén listos para aprender este paradigma de próxima generación para construir escaparates en Shopify, haga clic en el siguiente video y los veré del otro lado. 2. Conceptos clave: Antes de comenzar a construir nuestro propio escaparate de Hydrogen, es importante que comprendamos un montón de conceptos clave que entran en juego al construir un escaparate personalizado usando Hidrógeno. En primer lugar, cuando digo Hidrógeno, podría estar refiriéndome a dos cosas. La mayor parte del tiempo voy a estar hablando del marco Hydrogen React. Pero cuando en realidad comenzamos a implementar nuestra aplicación Hydrogen en nuestra tienda, el nombre del canal de ventas en Shopify también se llama Hydrogen. Técnicamente el nombre de la solución de alojamiento que Shopify proporciona para los escaparates de hidrógeno se llama Oxígeno, pero aparece en el panel de control de Shopify como Hidrógeno por cualquier razón. Así que tenlo en mente. En cuanto al propio marco de Shopify Hydrogen, está diseñado para situarse encima de una tecnología existente llamada React. Algunos de ustedes ya pueden estar familiarizados y/o hábiles en React, pero independientemente, vamos a repasar brevemente React en el siguiente video. Definitivamente no va a ser una inmersión profunda en React en este curso, pero es importante entender los conceptos básicos de React para poder usar Hidrógeno. El otro aspecto que también es importante entender es cómo vamos a recuperar datos del back-end de Shopify. Esto se hace a través de lo que se llama la API de Storefront, una API que Shopify proporciona para la recuperación de datos relacionados con experiencias orientadas al cliente. La API es lo que se llama una API GraphQL, lo que significa que en lugar de golpear diferentes puntos finales para obtener diferentes bits de datos, hay un único punto final de API al que nuestro proyecto se conectará y solicitaremos los datos específicos que requerimos a través de lo que se llama una consulta, que se parece un poco a esto. Estos conceptos por sí solos podrían ser un curso completamente distinto. Así que en los próximos dos videos echaremos un vistazo a cada uno individualmente y luego hablaré un poco sobre el conjunto de ganchos, componentes y utilidades de Hydrogen que juegan en esta configuración. 3. Reacción: En esta lección muy importante, vamos a repasar algunos de los conceptos básicos de reaccionar. Si ya tienes experiencia con reacciona, puedes sentirte libre de saltarte este video. Pero para el resto de ustedes, permítanme decirles que no deberían tener que hacer un curso completo sobre reaccionar para poder trabajar con hidrógeno. Antes de recoger el desarrollo de hidrógeno, había estudiado un poco de reacción a lo largo de algunos años, pero no es algo en lo que sea particularmente experto en este momento y todavía pude recoger desarrollo de hidrógeno con bastante facilidad. No, no necesitas ser desarrollador reaccione sin experiencia para construir escaparates de hidrógeno. Pero si tienes poca idea a la hora de reaccionar, definitivamente escucha lo que estoy a punto de decirte. Reacciona. ¿Qué es? React es una biblioteca JavaScript para construir interfaces de usuario, pero a menudo se la conoce como framework porque es una alternativa legítima a los frameworks JavaScript como Angular o view, dos marcos muy populares que quizás no hayas oído hablar antes. Quizás se esté preguntando cuál es la diferencia entre una biblioteca y un framework. Básicamente, yo diría que los frameworks son mucho más obstinados. Te obligan a construir aplicaciones de ciertas maneras. Mientras que una biblioteca, solo puedes importar los módulos que te gusten y simplemente usarlos como necesites. Tomemos reaccionar, por ejemplo. Aquí hay un ejemplo de lo simple que puede ser reaccionar. Tengo un patio de juegos reacciona abierto aquí en playcode.io/react. Esto es solo un IDE en línea para probar algunos códigos de React. Todo lo que hice fue ir a esta dirección y ahora tengo una app básica de React. Tengo mi archivo index.html aquí, que esencialmente solo trae el archivo index.jsx a través de las etiquetas de script. Entonces eso se conecta a este div raíz aquí. Si miramos nuestro index.jsx, puedes ver aquí que estamos usando create route on react DOM para conectarlo a ese elemento route y renderizar nuestra app, que está aquí mismo. Algunas cosas sobre las que quiero llamar su atención aquí. Puedes ver aquí qué paquetes estamos usando. Puedes ver aquí estamos usando react y react DOM. Eso es importante tener en cuenta aquí porque react es una biblioteca que se puede usar en una variedad de aplicaciones diferentes. No necesariamente tiene que ser una cosa de desarrollo web front-end. No tiene que ser una aplicación web o un sitio web. También podría ser una aplicación de teléfono nativa. En el caso de React Native. Es por eso que react es un paquete independiente, pero luego puedes usar algo llamado react DOM. Eso es lo que usas para crear aplicaciones web y sitios web. Aplica toda la funcionalidad central de reaccionar con el entorno de nuestro desarrollo web front-end. Lo primero que notarás es que al inicio de prácticamente todos estos archivos JSX son las declaraciones de importación. Como dije, react es muy modular y entonces todo lo que tenemos que hacer para poder usarlo es asegurarnos de que lo estamos importando. En ambos archivos, verás que importas react from react. Eso puede sonar obvio aquí, pero donde esto está buscando es dentro de sus módulos de nodo, vea aquí. Realmente no se puede ver en este navegador de archivos aquí. Pero cuando instalas react en tu computadora y creas un archivo package.json, verás que también creará una carpeta de módulos de nodo, que instalará todos tus módulos de nodo. Veremos eso un poco más tarde si no estás familiarizado con creación de JavaScript o proyectos basados en nodos. Primero lo primero vamos a importar reaccionar. Entonces un patrón común que verás es que vamos a crear un componente funcional aquí mismo. Verás que comienza como una función y luego devolvemos estas cosas con aspecto HTML. Ahora bien, ¿qué es esto de HTML? Esto en realidad se llama JSX. Parece HTML, pero en realidad no es HTML. Lo que está sucediendo es que esto se está compilando en HTML y renderizando en la pantalla aquí. Puedes ver aquí tenemos un H1 Hello React y empezar a editar para ver pasar algo de magia. Esto se ve exactamente como HTML, y está produciendo HTML por aquí. Pero esto no es HTML. Tomemos una pausa rápida en JSX porque es importante y cubrimos algunas cosas con JSX. Lo que voy a hacer y hay suficiente para la app. Pero solo para demostrar JSX, solo voy a crear otro archivo JSX aquí. Podemos llamarlo script.jsx. Quiero mostrarte algunas cosas. Específicamente, quiero mostrarte algunas cosas donde JSX difiere de la sintaxis de HTML. Se ve muy similar como dije, pero no es lo mismo. Aquí hay algunas diferencias. Una de las diferencias es que no hay guiones en JavaScript. Si decimos por ejemplo, sólo voy a pegar en algún código SVG aquí. Puedes ver aquí que no es muy común, pero en algunos elementos HTML podrías tener un guión entre dos palabras para un nombre de atributo. Ahora bien, esto no va a funcionar en JSX. Cuando veas algo como esto, todo lo que necesitas hacer es convertirlo a CamelCase. Voy a simplemente quitar el guión y capitalizar ancho. Ahora bien, si ejecutamos esto, no sé si podemos ejecutar nuestro JSX independiente, déjame copiarlo en nuestra aplicación aquí. Si pongo eso aquí, puedes ver que funciona. Pero si tuviéramos que usar un guión, vamos a obtener una propiedad DOM no válida. ¿Quiso decir esto? Eso es porque no podemos tener guiones en los nombres de atributos en JSX. Esa es una diferencia. La otra diferencia que verás aquí mismo, en lugar de usar class, tenemos que usar className nuevamente en este formato CamelCase. La razón por la cual, es class es una palabra clave reservada en JavaScript. Aquí no podemos usar la clase. Esa es otra diferencia. La tercera diferencia es que si volvemos aquí, puedes ver que aquí tenemos algunos números. Podemos poner expresiones JavaScript en estos atributos en JSX. Si tuviera que quitarle esto, ya son 100. En realidad, queremos ver este renderizado en nuestra pantalla. Probablemente no sea buena idea poner eso como un archivo separado. Vamos a poner esto de nuevo aquí para que podamos verlo renderizado en nuestra pantalla. Sangría un poco aquí. De hecho, podemos poner algunas expresiones JavaScript aquí. Lo que podemos hacer es en vez de 100, otra realmente sencilla para ti la pondremos entre paréntesis aquí. ¿Qué es 100? Es 50 veces por 2. Aquí puedes ver que obtienes el mismo resultado. Podemos poner una expresión de JavaScript aquí. Obviamente, podemos poner en una variable para esto. Si tuviera que ir const x es igual a 50 veces 2, y entonces podemos simplemente meter x aquí. Entonces si yo fuera a veces por 4, puedes ver nuestro círculo. ¿Se está haciendo más grande? La altura debería ser cada vez más grande, pero necesitamos tal vez crear un ancho más grande también. No estoy seguro de lo que está pasando ahí. Pero puedes ver si revisamos ese código, si lo inspecciono, verás que el resultado que viene a través. Aquí está un poco apretado. Aquí vamos. Verás que el resultado que viene a través es de hecho 500 para la altura, que es 5 veces 10. Vamos a ver esto muy a menudo en esta clase. Cuando estamos usando React, vamos a poner a través de expresiones JavaScript y variables en atributos, en props. Esa es una diferencia en comparación con HTML cuando lo estamos comparando con JSX. Otra cosa que quería demostrar en este video era cómo este código JSX termina siendo compilado en funciones de React que luego generan el HTML. No es particularmente importante, pero me gusta que ustedes entiendan lo que sucede detrás de escena. Desafortunadamente, no puedo mostrarte en este ambiente. Tal vez más tarde en la clase cuando ponemos este proyecto o nuestro propio proyecto en un anfitrión local. Pero si pasamos a JSX en profundidad, en la documentación de React, puedes ver si aprendemos más al respecto, lo que realmente está sucediendo es que este código de aquí mismo se compilará en React.createElement, y luego verás todo este código. Lo que podemos hacer si quisiéramos es en lugar de usar JSX, podríamos escribir código así. De esa manera no necesitamos compilar JSX. Pero obviamente, esto es mucho más agradable que escribir un montón de métodos de React como este, y especialmente cuando haces anidación. Si lo anidamos todo un montón de elementos dentro de los elementos, esto se volvería súper desordenado y casi imposible trabajar con él. Es muy útil usar JSX. Pero solo quería hacer nota de que esto no es en realidad lo que hace que llegue a tu navegador. Esto es lo que hace que llegue a tu navegador, y eso es lo que crea estos elementos en tu entorno React. También puedes leer sobre la introducción de JSX aquí. Puedes conocer todo sobre JSX en la documentación oficial de React. Nuevamente, te animo a que hagas esto como vimos, JSX también es una expresión. Esto nos va a mostrar cómo podemos insertar valores dentro de nuestro JSX, especificando atributos, podemos usar variables y otros datos en lugar de simplemente ponerlos como una cadena más bien como lo haríamos en HTML. Al alejar de JSX ahora para hablar más sobre React en general, eliminaré esa variable porque ya no la estamos usando. Hablamos de los insumos antes. Vamos a estar importando React como necesitemos en ambos archivos JSX. Pero luego para crear el DOM virtual, aquí vamos a usar React DOM. En nuestros proyectos particulares que utilizan hidrógeno, no necesitamos usar React DOM. Yo creo que eso es atendido por el hidrógeno para nosotros. Pero como puedes ver aquí, siempre vamos a estar importando cosas de React o de otra biblioteca de React, que para esta clase va a ser React. Entonces, nos van a ver importar cosas del hidrógeno. Entonces lo que obtuviste son tus exportaciones. Como puedes ver aquí, estoy importando React y luego estoy exportando este componente funcional. Ahora bien, ¿por qué lo estoy exportando? Bueno, en realidad lo estoy usando en este archivo index.jsx. Puedes ver aquí que estoy importando ese componente de app desde ese archivo de app. Si lo estoy usando en este archivo, entonces no necesito exportarlo. Pero si quiero usarlo en un archivo diferente entonces voy a necesitar exportarlo. Ahora bien si acabo de exportar sin poner default después de él. Puedo exportar múltiples diferentes aquí. Necesito especificar cuál estoy importando, y poner estos corchetes a cada lado. Estos corchetes aquí están haciendo lo que se llama desestructuración. Si estoy exportando varios componentes dentro de un archivo, que aunque solo exporte uno aquí, no estoy diciendo default. Por lo tanto, tengo que entrar aquí y sacar eso entre estos tirantes. Para mostrarte la diferencia, si solo voy por aquí y porque solo tenemos una exportación, solo puedo poner default aquí. Entonces dentro de aquí, puedo quitar estos, y funciona de la misma manera. Pero si quisiera decir, por ejemplo, crear otro componente aquí, entonces no puedo simplemente hacer default. Digamos que creo una app2, y luego así, gritos, ficha equivocada. Voy por aquí y luego puedo hacer app2. Puedo importar múltiples desde un archivo. Pero si solo estás exportando uno, entonces siéntete libre de eliminar estos, vamos a deshacernos de este ahora, y luego pongamos por defecto aquí. Eso es importante tener en cuenta. Verás los valores predeterminados y no los usados por defecto. Verás que los corchetes y los corchetes no están siendo utilizados. Por eso a veces estás desestructurando y a veces no estás desestructurando. Esas son las importaciones y exportaciones. Obviamente, vimos dentro de este regreso aquí está JSX. Si tuviera que crear otra función como la vi antes, eliminemos ese valor predeterminado aquí. Vamos a llamar a esto un botón personalizado. Puedo acceder a los apoyos de este botón personalizado a través del argumento aquí. Lo que voy a hacer es dentro de este retorno, voy a poner en un botón, misma sintaxis que HTML porque es un elemento HTML. Entonces sólo voy a decir, haga clic en mí, digamos. Entonces aquí arriba, en lugar de este SVG, pongamos en nuestro botón personalizado en Camel Case. Como puedes ver aquí, tenemos nuestro pequeño click me aquí. Ahora, a lo mejor queremos hacer dinámico este campo. Lo que podemos hacer es que puedo poner el texto aquí. Entonces cuando tengo que hacer es jalar a los hijos de los apoyos. Eso va a tirar lo que sea que esté entre estas dos etiquetas. Puedo ir de utilería, niños. Ahí vas. Puedes ver aquí, dar click aquí, o dar click ahora, cualquier cosa que ponga aquí son los hijos de este componente, y así puedo acceder a él a través de sus apoyos. Ahora no vas a ver esto normalmente, lo que verás es la desestructuración utilizada de nuevo. En lugar de props.children, lo que puedo hacer es desestructurar y sacar a los niños inmediato de los apoyos dentro de esta sección de aquí mismo. En lugar de props.children, voy a sacar a los niños de apoyos y luego lo puedo poner ahí. Entonces puedes hacer click aquí. Entonces podrías pasar algunos otros datos. Yo sólo voy a poner aquí un atributo, vamos a llamarlo mensaje, y digo, soy tu mensaje. Ahora tenemos este accesorio al que podemos acceder desde aquí, y todo lo que tenemos que hacer es sacarlo también. Estamos sacando a los niños, vamos a sacar mensaje, y luego solo voy a hacer un simple OnClick. Entonces pongamos un ClickHandler para encontrar mi ClickHandler aquí, ClickHandler. Entonces voy a hacer una simple alerta con el mensaje que pasa por ahí. Ahora si hago clic aquí, verás que recibimos una alerta aquí arriba soy tu mensaje, y eso se pasa por nuestro componente aquí. Los dos accesorios, tenemos nuestros hijos que podemos pasar, y luego podemos pasar cualquier utilería que definamos también. Solo necesitamos sacar eso de nuestro objeto props aquí arriba, y luego podemos usarlo como queramos en nuestro propio componente personalizado. Pasamos bastante por ahí, pero ojalá, ustedes entendieron la esencia. Nuevamente, no necesitamos pasar por toda una clase en React para entender lo suficiente como para comenzar a trabajar con Hydrogen. Pero si estás luchando, claro, puedes investigar cualquiera de estas cosas que no tenga sentido yendo a la documentación de React, o simplemente buscándolo en Google. Honestamente, React es un marco muy popular. Hay tanta información por ahí. Si tienes algún problema, solo empieza a buscar en Google, solo empieza a mirar la documentación específicamente con React, y claro, si haces eso y falla, siempre puedes dejar un comentario abajo con cualquier cosa con la que estés luchando. Antes de pasar a las otras partes que hay que entender antes de empezar a trabajar específicamente con Hidrógeno es, sólo quiero desglosar las tres cosas principales que vamos para importar y usar desde React. Como puedes ver aquí, hemos hecho componentes, pero también podemos importar componentes de ciertas bibliotecas. Eso es lo que vamos a ver cuando empecemos a importar componentes que ya son creados por Shopify para nosotros en Shopify Hydrogen. Eso lo verás muy pronto. Pero entonces, por supuesto, podemos crear nuestros propios componentes como acabamos de hacer aquí. Otra cosa que vamos a importar de React y de Shopify Hydrogen es algo que se llama gancho. Si quieres ir a la documentación, hay una introducción a los ganchos, en algún lugar de aquí. Ganchos, aquí vamos. Aquí hay una sección completa, y puedes leer sobre ganchos. En pocas palabras, los ganchos le permiten usar state y otras características de React sin escribir una clase. Eso puede ser difícil de entender para ustedes, para aquellos de ustedes que no han usado React desde hace tiempo. Pero como puedes ver aquí, podemos importar un gancho común llamado UseSate de React. Veamos en realidad este ejemplo. Si entro aquí, puedes combinar la desestructuración con el objeto total mismo. Aquí vamos. Sólo voy a agarrar UseState, y ahora estoy importando ese Hook de React. Lo que podemos hacer es volver a desestructurar, podemos agarrar la variable de estado y luego la función que la establece, y luego agarrarla de useState pasando en un valor predeterminado de cero. Vamos a agarrar primero esta parte. Ahora dentro de nuestro componente, podemos agarrar un count y un método setCount. Eso es todo lo que necesitamos para crear este botón. Yo reemplazo mi botón por este de aquí. Ahora como estamos haciendo clic en esto, el conteo va subiendo, pero no se puede ver, así que lo que voy a hacer es poner aquí el conteo. Sólo voy a ponerlo recto en el botón, no ponerlo en otro elemento, y si hago clic en esto, el recuento sube. Solo quiero introducir el concepto de anzuelo muy temprano en esta clase, porque vamos a usar ciertos ganchos dentro de Shopify Hydrogen. El más común de los cuales es el UseShopQuery, que es lo que vamos a utilizar para traer datos de nuestra API de Shopify Storefront y utilizarlos en nuestro proyecto. Hemos visto componentes aquí, y hemos visto ganchos. La única otra cosa son las utilidades, que son básicamente cualquier otra función que usaremos para facilitarnos la vida a la hora de construir escaparates. Voy a dar un ejemplo, encontré esta utilidad en algún lugar en línea. Es solo una función para formatear moneda. Ya tenemos esta utilidad en Shopify Hydrogen, así que no deberíamos necesitar usar algo como esto. Pero como puedes ver aquí, podemos agarrar esta utilidad. Vamos a pegarlo directamente en nuestro código aquí. Voy a deshacerme de este código componente. Esto está escrito en TypeScript, así que solo necesito eliminar la definición de tipo ahí. Ahora puedes ver que funciona. Digamos que si tuviéramos que hacer un precio. De nuevo, puedo lanzar una expresión aquí, y digamos simplemente FormatCurrency y tirar 110.10. Ahora puedes ver aquí porque estamos usando la moneda USD y el estilo de moneda, puedes ver ahora que la moneda se formatea muy bien. Si tuviéramos que agregar algunos puntos decimales extra aquí, todavía se redondea a los centavos más cercanos aquí, y luego ponemos el signo $ al frente. Si tuviéramos que hacer de esto algo así como las Grandes Libras Esterlinas, por ejemplo, se puede ver que ahora es el símbolo de la libra en su lugar. Esto es lo que hará una utilidad. Es sólo una función que nos hace la vida más fácil. Como puedes ver aquí lo hemos importado o simplemente lo agarramos. Podríamos, por supuesto, crear un nuevo archivo, y luego exportarlo, y luego usarlo en cualquier parte de nuestro proyecto, que sería el escenario más probable. Pero solo quería demostrar lo que es una utilidad, porque también podríamos usar algunas funciones de utilidad en nuestro escaparate de Shopify Hydrogen. Eso es realmente, chicos. Puedes, por supuesto, profundizar en React, pero para este curso, eso es todo lo que realmente necesitamos para comenzar. Todos estos conceptos que acabamos de discutir nos van a ayudar a generar la interfaz de usuario para nuestra nueva app de escaparate personalizada. Pero el otro lado de esto va a ser cómo conectamos realmente esta interfaz de usuario a la API de escaparate. Esto es exactamente lo que vamos a cubrir en el siguiente video. 4. API de Storefront: En esta lección, vamos a hablar sobre la API de escaparate, que es lo que usaríamos para recuperar los datos necesarios para rellenar nuestro escaparate con todo el producto, página y entrada de blog información que queremos mostrar al usuario. Para proporcionar un poco de contexto aquí, la API de Shopify es una de las pocas API proporcionadas por Shopify. Los dos más comunes, diría yo, son la API de escaparate y la API de administración. La API de administración es lo que usarías para completar las funciones de administración. Mientras que la API de escaparate es la API para recuperar información orientada al cliente. He hablado de la API de escaparate en algunos de mis otros videos, es posible que me hayas visto conectarme a la API y menos de 11 de mi clase de programación de temas Shopify y por un minuto, 1820 en mi video de YouTube usando JavaScript en el desarrollo de temas. Sin embargo, como mencioné en esos videos, la API de escaparate no fue construida para temas de Shopify, sino que está pensada para cualquier otro escenario en el que necesitarías acceder a los datos del escaparate. Como dice Shopify en su documentación, se puede usar en cualquier lugar donde estén tus clientes, como una aplicación de sitio web o un videojuego y ahora esto incluye las aplicaciones de hidrógeno de Shopify. ¿Cómo funciona en Shopify hidrógeno? Bueno, la buena noticia es que el hidrógeno tiene un gancho incorporado que te ayuda a conectarte y consultar datos fácilmente. Se llama use sharp query hook y más adelante en esta clase configuraremos nuestros datos de acceso en el archivo de configuración de hidrógeno y luego usaremos el gancho para extraer los datos que necesitemos. Por ahora, lo que quiero cubrir brevemente es la sintaxis de GraphQL, que es el lenguaje que usamos para consultar la API de escaparate. Esto de aquí mismo se llama gráfico. Es un IDE gráfico en el navegador GraphQL. Eso puede sonar súper técnico, pero básicamente todo esto es, es una forma de crear y probar consultas antes de ejecutarlas en una app. Te voy a mostrar cómo configurar esto para tu proyecto en particular más adelante, pero por ahora puedes ver que estoy ejecutando un servidor local. Este es en realidad un proyecto de hidrógeno y por suerte para nosotros, una de las características es este graphiql. Básicamente es GraphQL con una i entre la gráfica y la QL. Graphiql, supongo que así es como se podría decir. Tenemos esta herramienta incorporada y todo lo que tenemos que hacer es, si este es nuestro dominio raíz host local 3,000, solo necesitamos poner graph iQL después de él, y luego obtenemos acceso a esta pequeña herramienta que nos permite consultas GraphQL a cualquier proyecto de hidrógeno de la API de escaparate que esté conectado. Este en realidad está conectado a la tienda de previsualización de hidrógeno. Esta es la tienda estándar que se cargará en configuración de la API de su tienda al crear su primer escaparate de hidrógeno, puede actualizar estos ajustes, verá que en un video posterior, pero en esta clase solo vamos a usar la tienda de previsualización de hidrógeno y eso ya tiene una gran cantidad de datos así que ni siquiera tenemos que crear datos de muestra para esta clase, solo podemos usar lo que es nos proporcionó desde Shopify. Ya tenemos una consulta aquí, si hago clic en “Ejecutar” aquí, puedes ver que recuperamos una estructura de datos que imita lo que escribimos aquí. Me gusta usar sangría, así que sólo voy a poner esto por aquí. Lo que recuperamos es algún JSON que imita la estructura de nuestra consulta. Eso es lo genial de GraphQL, imita lo que recuperamos en términos de JSON. Para explicar esto un poco, aquí solo tenemos una consulta básica, estamos tomando la raíz de la consulta de sharp, y luego estamos abriendo una selección aquí y luego estamos definiendo qué campos queremos devolver. Todo lo que estamos haciendo es devolver el nombre del agudo, que es hidrógeno. Pero también podría agregar en este campo la descripción, y luego si ejecuto eso, verás que cuando vuelva nuestra consulta, ya tenemos nuestra descripción llegando también, ¿de acuerdo? Podemos agregar en cualquier campo que exista en el objeto sharp aquí, si tuviera que quitar la selección por completo y tratar de ejecutar eso, no va a funcionar, dice que campo debe tener selecciones. Hay ciertos campos en tu API que van a requerir selecciones y shop es uno de ellos, así que no va a funcionar como solicitar todo el objeto, vamos a tener que solicitarlo los campos específicos dentro de ese objeto. ¿Cómo averiguamos a qué campos podemos acceder en el objeto? Vamos a la documentación. Si simplemente busco la API de escaparate en Google, debería poder encontrarla. Aquí está la página de la documentación, la API de escaparate GraphQL de Shopify y honestamente su navegación es un poco difícil navegar pero quiero entrar en Comentar objetos, entrar aquí y si nos desplazamos hacia abajo, esto no es lo que estoy buscando, tienda online es la categoría que estoy buscando, voy a objetos, podemos ver aquí el objeto tienda, así podemos ver que la tienda representa una recopilación de configuraciones generales e información sobre la tienda y aquí están los campos, así accedemos al nombre de la tienda, la descripción, también podemos obtener campos Meta en ella. Podemos obtener el dominio primario, así que si quería agregar ese primario, lo bueno de usar esta interfaz es que tiene autocompletado. Puedo lanzar el dominio primario ahí y requiere selecciones. Si quisiéramos usar eso, solo necesitamos verificar este que es el tipo de datos. Como puede ver, aquí también hay un rango de selecciones así que tendré que abrir una selección en esa y luego URL es uno de los campos en eso. Puedo ejecutar eso y luego ahora podemos obtener la URL del dominio principal. Ahora, una de las cosas más complicadas de GraphQL, esto es bastante simple hasta este momento. Pero si empezamos a trabajar con conexiones relacionales, vamos a empezar a ver algo llamado bordes y nodos. Lo que quiero decir con eso es que si entramos aquí y escribimos algo que sea plural, no podemos hacerlo en un objeto de tienda, pero volvamos a nuestra ruta de consulta aquí y si escribo colecciones, como puedes ver aquí, va a devolver la conexión de colección. Aquí podemos apuntar a una colección específica, pero si voy aquí y hago colecciones, lo que ahora voy a necesitar hacer es usar bordes y nodos, ¿bien? Voy a tener que acceder a los bordes de esta lista de colecciones y luego tomar los datos que quiera cada colección dentro de esa lista de colecciones aquí bajo nodo. Puedo agarrar el, digamos el nombre con el mango de goma y luego si me golpeo correr aquí, probablemente tendré que ponerlo en el perímetro aquí. Como dice aquí, hay que proporcionar primero o último, entonces lo que eso significa es que tengo que especificar cuántos objetos de colección quiero devolver, para poder solicitar los primeros 10. Yo dirijo eso. Puedes ver aquí que me devuelvo un objeto que es similar a la estructura aquí, me devuelvo diez colecciones o máximo diez colecciones, solo hay 1, 2, 3, 4, 5, 6, creo, colecciones en nuestra tienda en total, por lo que obtenemos los primeros 10. Si solo hay seis, recuperamos seis y como solo hemos pedido el asa, solo recuperamos el asa en cada nodo. Ahora bien, esto de bordes, nodo es un poco confuso pero te vas a acostumbrar, la forma en que me gusta pensarlo es que podemos obtener más que solo los bordes de nuevo en una lista de colecciones en particular, cualquier lista para el caso. Si voy por debajo de los bordes aquí, también puedo obtener un objeto aquí llamado page info, que es una selección y luego puedo ver si tiene una página siguiente. Si voy por aquí y vuelvo a ejecutar eso, no sólo obtengo los datos que estoy buscando, también obtengo la información para la paginación, lo que me dice tiene una página siguiente, no la tiene. Si pongo esto a tres, entonces sólo me va a mostrar los tres primeros y los tres segundos y lo vuelvo a correr. Ahora, si miramos hacia abajo, solo obtenemos los tres primeros resultados y nos hacemos realidad ahora para tiene página siguiente. Algo similar con nodo, podemos ir por debajo del nodo y podemos escribir algo llamado cursor. Ejecutemos eso y veamos qué vuelve. Como puedes ver, ahora tenemos este pequeño id aquí en cada nodo, lo que nos da una dirección para ese nodo en particular. Puede sonar bastante complicado, ¿por qué no podemos simplemente devolver una lista, sino que se remonta a las conexiones relacionales entre estos diferentes recursos? Porque estos diferentes nodos son recursos sí mismos y lo que estamos haciendo es devolverles una conexión. No se trata solo de datos dentro de una colección. También son datos de productos que podrían formar parte de múltiples colecciones y así parece complicado, pero todo lo que necesitamos recordar aquí es incluso si no estamos usando paginación, así que si elimino estos, solo asegúrate de usar bordes y nodos cuando estemos manejando conexiones de esta manera de lista. Antes de pasar a hablar sobre el framework Hydrogen, solo quería mostrarte algunos ejemplos más de lo que podrías lidiar en términos de GraphQL mientras estás creando escaparates usando Hidrógeno. Algunos ejemplos los puedes encontrar dentro este tutorial que es proporcionado por Shopify, en esencia, esta clase es una versión en video de esto de todos modos, usaremos mucho de lo que se habla en este tutorial, pero tampoco usaremos una tonelada de ella también. Voy a tratar de que sea realmente simple. Gran parte de este tutorial que he encontrado realmente está saltando adelante en términos de agregar mucho código, lo que podría no tener mucho sentido. La clase ha sido diseñada para pasarla un poco más despacio para ustedes. Pero quiero llamar su atención sobre algunas consultas de GraphQL que puede terminar usando. Como puedes ver, tenemos esa consulta que vimos antes, donde accediendo nombre y descripción en tienda, así que ahí es una consulta muy básica. Si me desplazo un poco más hacia abajo, no estoy seguro de si está en esta página o en la página siguiente. Vamos a construir una página de colección, desplácese hacia abajo. Aquí, puedes ver que tenemos colecciones aquí. De hecho, podemos omitir la parte de bordes, así que podemos simplemente escribir nodos en lugar de escribir bordes y luego nodo singular. Si quería quitar bordes aquí y ejecutar eso, verás que recuperamos los nodos sin tener que poner en esa palabra bordes, así que esa es una opción también. Entonces como puedes ver aquí, tenemos el parámetro para obtener los ocho primeros ocho, de una colección en particular, pasando por un asa, que veremos más adelante en esta clase, y entonces estamos sacando la primera variante de cada producto. Nuevamente, haremos algo similar en la clase. Yo solo quería repasar algunos ejemplos, ver si hay algo teórico que tenga que decirles chicos antes de empezar, aunque esto es bastante similar si entro en la página siguiente. Aquí hay algo que quería mostrarles antes de que empecemos, es el uso de estos fragmentos. Los fragmentos son como si estás acostumbrado a Shopify desarrollo de temas, puedes pensarlo casi como un fragmento. Es un poco de código reutilizable que podemos conectar a otras partes de nuestra consulta GraphQL. Aquí definimos este fragmento, que dice qué campos vamos a querer en los medios. Todo este fragmento aquí nos dice qué selección de campos queremos y luego podemos conectarlo a donde lo necesitamos usando este punto, punto, punto. En lugar de escribir aquí todos los campos mediáticos, podemos simplemente expandir el fragmento que creamos aquí arriba. Eso es útil cuando queremos reutilizar esa selección en múltiples áreas de nuestra consulta. La otra cosa por aquí que quiero que noten es este punto, punto, punto, y luego encendido. Aquí, se ve similar en términos de que tienes los tres puntos, pero tan diferente en el sentido de que esto solo va a devolver esta selección cuando el tipo es imagen media. Va a devolver esta selección, cuando el campo mediático que regresa es una imagen mediática. Va a devolver esta selección cuando sea un video. Va a devolver esta selección cuando sea un modelo 3D y esta selección cuando sea un video externo. Supongo que por eso se crea en un fragmento para que no estemos anidando todo ese código dentro de nuestra selección aquí. No estoy seguro si vamos a usar necesariamente fragmentos en esta clase. Vamos a mantenerlo muy sencillo. Pero solo pensé en mencionar esto mientras miras a través de ejemplos de Shopify, fuera de esta clase, tal vez te estés preguntando qué está pasando aquí. Definitivamente busca fragmentos de GraphQL si te interesa conocer más sobre esto. Déjame bajar, ver si hay algo más que quiera compartir con ustedes. Como pueden ver aquí, chicos, este tutorial arroja mucho código muy rápido, razón por la cual no estoy siguiendo esto exactamente para esta clase de Skillshare. Creo que saltan a ciertas partes un poco demasiado rápido. Si bien no me gusta que me dibujen, sí me gusta cubrir muchas de las cosas en una secuencia paso a paso que les permita entender lo que está pasando en cada etapa, así que siento que es mejor ir más despacio y realmente entender profundamente lo que está pasando en lugar de saltar tanto adelante. En mi opinión, creo que están saltando un poco más adelante, especialmente para alguien que no ha usado React antes o es nuevo en React, este tutorial va y salta directo, tiene mucho detalle. Obviamente, mucho de esto es solo código React. Eso es lo principal que quería mostrarles chicos. Yo quería mostrarles chicos si vuelvo a aquí las cosas de fragmentos. Déjeme encontrar eso en la documentación para ustedes chicos, si quieren echarle un vistazo más tarde. Aquí puedes ver en la documentación de GraphQL, la oficial en graphql.org. Si nos fijamos en la sección sobre fragmentos, puedes entrar más en detalles aquí sobre qué son los fragmentos. Ese es el único ejemplo complejo que he visto en los ejemplos de Shopify de GraphQL. Probablemente no vamos a usar fragmentos en esta clase, pero por si acaso lo veas en un ejemplo como en documentación de Shopify y te estás preguntando qué está pasando ahí. Pero vamos a tratar de mantenerlo lo más simple posible y luego tratar de expandirnos a partir de ahí. Pero es importante entender GraphQL al menos en un nivel básico, antes de que nos quedemos atrapados en la creación de nuestros proyectos, necesitamos saber cómo vamos a consultar la API de escaparate en para obtener los datos necesarios para construir escaparates personalizados. Por eso necesitamos hacer una pequeña lección sobre GraphQL. En el siguiente video, vamos a cubrir el framework de Shopify Hydrogen. 5. El marco de Shopify de hidrógeno: En esta lección, ahora vamos a hablar sobre el framework Hydrogen, es decir, el conjunto de ganchos, componentes y utilidades que Shopify proporciona para ayudarnos a crear escaparates personalizados. Para la mayor parte de esta clase, voy a explicar los ganchos y componentes de Hidrógeno mientras trabajamos a través de nuestro propio proyecto de Hidrógeno. Pero hay algunos conceptos con respecto al Hidrógeno que me gustaría que ustedes entendieran antes de que nos quedemos atrapados. En primer lugar, si nos dirigimos al archivo App.server.jsx aquí, notarás que este archivo va a tener un aspecto bastante similar sin importar proyecto de Hidrógeno que estés viendo. Tienes esta función RenderHydrogen aquí mismo, que es responsable de la hidratación. La hidratación en este caso está relacionada con la renderización del lado del servidor. Básicamente, esta es la función que configura tu proyecto como una app de Hidrógeno. Después de importar RenderHydrogen aquí, los otros componentes de nivel superior que probablemente notará se relacionan con el enrutamiento y el suministro. En un proyecto típico de React, podrías usar algo como React Router, que es otra biblioteca para manejar el enrutamiento, pero Hydrogen viene con enrutamiento incorporado. Usando la combinación del componente Router y el componente FileRoutes, podemos configurar fácilmente el enrutamiento básico dentro nuestra aplicación que imita la estructura de archivos de nuestro proyecto. Por ejemplo, en nuestra carpeta de rutas, si hago clic por aquí, si creo un catálogo. Esto es lo que haremos en la clase más adelante, pero solo para mostrarte por adelantado, si creo un archivo catalog.server.jsx, entonces puedo acceder a él escribiendo catalog después del dominio de ruta de nuestra aplicación. Si ejecuto esto; actualmente no se está ejecutando en este momento, pero si ejecuto el comando yarn dev o npm run dev, vamos a estar ejecutándolo en localhost 3001. Estoy manejando otra tienda en este momento, razón por la cual está en 3001 y no 3000. Si mando, haz clic en eso, verás Hello World aquí. Si vuelvo a mi editor de código y vamos a poner algo en catalog.server.jsx. Vamos a agarrar lo que tenemos en index.server.jsx y solo reemplacemos esto a Catalog y reemplacemos esto aquí con Catalog con una mayúscula. Golpea “Guardar” en eso. a nuestra aplicación en el navegador. Como puedes ver aquí, está ejecutando la ruta índice, que si miramos, es solo crear un div con Hello World para que coincida. Entonces si voy por aquí y después de nuestra ruta dominio poner catálogo, ahora puedes ver la palabra catálogo que viene. Así es como obtenemos el enrutamiento incorporado en nuestra aplicación. Simplemente colocamos un router y lo envolvemos en FileRoutes, y así nuestro enrutamiento imitará lo que pongamos en esta carpeta de rutas. Podemos hacer anidamiento a través de carpetas anidadas. De hecho, es bastante fácil configurar el anidamiento con Shopify Hydrogen. También puedo hacer un valor dinámico. Digamos que tenía una ruta anidada para las colecciones. Voy a crear una carpeta de colecciones aquí. Entonces también puedo crear una ruta dinámica. Puedo usar handle como variable, server.jsx, y luego no lo vamos a hacer en este video porque tendremos que traer en el gancho de consulta use shop y comenzar a consultar API, que nos meteremos en un momento posterior video. Pero esencialmente ahora voy a cambiar esto a Collection. Si tuviéramos acceso a la colección, podemos empezar a tomar dinámicamente la Colección que estamos viendo y tal vez sacar su título o algo así. También podemos crear estas rutas dinámicas. Esto vivirá en, digamos que nuestra colección se llamaba zapatos, así que solo vamos a esta ruta, colecciones-zapatos, y entonces esa parte de zapatos se convierte en el asa, y así nos serviría esto archivo a través de esa ruta. También puedo usar el componente rutas. Actualmente no se importa pero podemos importar el componente de ruta desde Shopify Hydrogen. Lo que eso nos permite hacer es definir una ruta aquí abajo. Esto es útil para crear una ruta general para 404 páginas completas, por ejemplo. Si creo un componente NotFound, puedo cargarlo ahí. Entonces, si la URL no pasa por FileRoutes, puede pasar por esta ruta de respaldo en su lugar. Eso lo vamos a ver en esta clase también. Entonces los otros componentes, vas a ver son los componentes del proveedor. Como puedes ver aquí arriba, Shopify Provider es el componente de proveedor de nivel superior de Shopify Hydrogen. Ponemos eso alrededor del router para que tengamos acceso en cada página a funciones centrales de Shopify como el uso shop query hook, que usaremos en prácticamente todas las rutas. Este patrón de uso de un componente de proveedor con componentes y ganchos relacionados es algo que probablemente verá en varias partes de su aplicación. Los ejemplos incluyen CartProvider para proporcionar funcionalidad de carrito, ProductOptionsProvider para configurar estados para rastrear la variante seleccionada actualmente y la opción seleccionada en una página de producto y CartlineProvider, que proporciona un fácil acceso a los datos relacionados con una CartLine individual. Estos son solo algunos ejemplos de algunos de los componentes disponibles en el marco Shopify Hydrogen, cuya lista completa puedes encontrar aquí en la documentación oficial de Shopify. También como consejo, si alguna vez te sientes perdido en lo que hace un componente o gancho en particular, puedes simplemente Google Shopify Hydrogen, seguido del nombre del gancho o componente, y eso debería generalmente te dirigen a la página correspondiente de la documentación de Shopify Hydrogen. Recuerda que los ganchos generalmente se ven así con una primera letra minúscula mientras que todos los componentes comienzan con mayúscula. Esto es para diferenciarlos de las etiquetas HTML regulares. 6. Cómo comenzar con el hidrógeno: Sin más preámbulos, realmente entremos en la construcción de nuestro escaparate de hidrógeno. Hemos hablado mucho de teoría, es hora de entrar en lo práctico aquí. Hay dos formas en las que podemos empezar. Número 1, puedes hacerlo como lo hice que estaba siguiendo esta documentación aquí, shopify.dev/custom-storefronts/hydrogen/ getting-started/quickstart. Básicamente, solo busca esto en la navegación. Aquí, puedes ver en el Paso 1 podemos crear una app de Hidrógeno. Estaba usando NPM hasta que me encontré con este problema de almacenamiento en caché que me obligó a usar Yarn. Hablaremos un poco de eso en un segundo. Ahora utilizo Yarn, pero también puedes usar NPM. Es importante tener en cuenta aquí que cuando estamos usando estas herramientas, es necesario tenerlas instaladas. También debe asegurarse de tener instalada la última versión del nodo. Esto va a surgir cada vez que usemos gestores de paquetes. Si no estás familiarizado, node.js es el runtime de JavaScript, necesitamos esto, esto está en el núcleo de NPM y todo lo que haremos en este proyecto. Asegúrate de tener la última versión de eso. Entonces NPM es Node Package Manager, se sienta encima de eso y le ayuda a instalar y ejecutar paquetes de nodos. Tenemos que asegurarnos de que tenemos las últimas versiones de eso. Si quieres usar Yarn, también puedes instalar Yarn. Los detalles para instalar todas estas herramientas de interfaz de línea de comandos están en sus respectivos sitios web. Te voy a enseñar primero cómo hacerlo de esta manera. Voy a abrir mi aplicación de terminal favorita, se llama iterm. Voy a maximizar esto por ti, que veas más fácil. Despeja todas esas cosas ahí. Voy a simplemente navegar a mi escritorio para esto, así que voy a cd desktop. Entonces ejecutemos estos comandos. Vamos a ejecutar NPM init, Shopify hidrógeno. Dice que necesitarás instalar los siguientes paquetes. Sí. Solo hay que darle algo de tiempo para procesar aquí. Ahora aquí, te va a dar la opción de hacer Demo Store, o Hello World. Demo Store es un proyecto de hidrógeno más completo. No recomiendo instalar Demo Store para aprender hidrógeno, porque viene con mucho código y mucha configuración que si solo estás aprendiendo hidrógeno, es mejor mantenerlo simple. Me gusta ir con Hello World. Entonces, aquí hay una cuestión de preferencia, si no sabes qué es TypeScript o no usas TypeScript, entonces solo elige JavaScript. Voy a llamar a este escaparate personalizado. Ahora va a descargar el código del repositorio de hidrógeno. Ahora después de una buena cantidad de tiempo, ha terminado de instalar. Ahora, voy a abrir una nueva ventana o Visual Studio Code, y ya podemos empezar a ejecutar este proyecto. Voy a abrir una nueva ventana, solo voy a redimensionarla para que se ajuste a tu pantalla. Luego haré clic en “Abrir”, dirigiré a nuestro escritorio y abriré esa carpeta de escaparate personalizada. Aquí, si ejecutamos una terminal dentro de este proyecto, podemos hacerlo desde dentro del proyecto en código de Visual Studio, o podemos hacerlo usando nuestra otra aplicación de terminal. Simplemente es más fácil dentro de nuestro editor de código porque ya hemos navegado a esa carpeta. Ahora todo lo que necesito hacer para poder ejecutar esto, es npm run dev. Como puedes ver aquí, va a decir que ahora estamos funcionando en localhost 3,000. Voy a comando-clic para abrir eso. Como puedes ver, todo lo que dice es Hello World. La razón por la que dice Hello World es si entramos en nuestra carpeta src aquí mismo, y nos dirigimos a nuestra ruta de índice. Apenas aquí en índice de rutas, verás Hello World. Recuerda que ya hablamos un poco en el último video sobre lo que está pasando en el archivo app.server.jsx aquí, así que no voy a adentrarme en esto, pero este es el corazón de tu app aquí mismo. Tenemos nuestro proveedor de Shopify, que proporciona básicamente toda la funcionalidad que necesitaremos para nuestra aplicación de hidrógeno. Entonces por supuesto estamos tirando de él router y rutas de archivo, para nuestro enrutamiento. Este otro componente que estamos importando de react, es una característica experimental en reaccionar en este punto en el tiempo. Si miramos la página en busca de suspenso en el sitio web de Reacciona, puedes ver aquí que aquí hay mucho rojo. Básicamente un componente de suspenso, le permite esperar a que se cargue algún código y especificar declarativamente un estado de carga. Esto nos permite hacer carga asincrónica dentro de estas dos etiquetas. Podríamos en cambio, y dejarme hacer esto ahora mismo en lugar de tener un respaldo completo nulo, solo para cargar. Ahora lo que he hecho para que empecemos para que no estemos perdiendo el tiempo aquí, es que he creado todo el CSS para ti, que no estemos escribiendo CSS como codificamos a través de este proyecto. También he actualizado la ruta index.server.jsx, para que podamos ver el patrón que va a pasar en muchas de las rutas, donde ingresamos un montón de componentes y ganchos, exportamos un componente particular, y luego por debajo de eso, escribimos nuestra consulta. Lo que puedes hacer, esta es la segunda opción, es que puedes conseguir clonar el proyecto de escaparate, que he subido a mi GitHub, este es un repositorio público. Esto es básicamente lo mismo que si tuvieras que hacer lo que hicimos aquí en nuestra terminal con la creación de un nuevo proyecto de hidrógeno, y eligiendo Hello World, excepto que he actualizado esto index.server.jsx, para demostrar el patrón continuo que vamos a ver en muchas rutas. También he agregado un montón de CSS aquí. También voy a actualizar las sucursales a medida que avanzamos, para que también puedan ver el punto final. Te animo, en lugar de hacerlo de esta manera, te animo a que consigas clonar este proyecto, ejecutar npm , instalar, y luego sigamos juntos, usando exactamente el mismo proyecto. Lo que voy a hacer, dejar eso, y luego voy a hacerlo, vamos a cerrar esto. Entonces en mi iterm aquí, voy a navegar a mi carpeta de código, ir a mi carpeta Skillshare, que es donde pongo mis proyectos de Skillshare, y vamos a ejecutar git clone aquí. Voy a ir git clone, copiando esa URL. Todo lo que tengo que hacer es hacer clic en el botón de la pantalla, y luego copiar la dirección HTTPS, y luego ahora va a descargar ese repositorio a mi computadora. Naveguemos hacia la tienda de la clase hidrógeno. Entonces desde aquí, solo ejecutamos npm install, para instalar todos nuestros módulos de nodo. Esto es algo que está sucediendo automáticamente cuando ejecutamos ese comando anterior de npm init Shopify hydrogen. Ejecuta npm install por ti. Cuando estamos descargando un repositorio GitHub que dicho proyecto de nodo, va a conseguir ignorar el archivo de módulos de nodo, porque ese no es un código que es específico de este proyecto, y solo almacena las referencias en el archivo package.json. Entonces cuando ejecutes npm install , luego instalará todas las dependencias. Solo un poco de contexto extra ahí para esos tipos que no están muy familiarizados con los proyectos de nodo. Ahí vamos, hemos instalado nuestras dependencias. Ahora, voy a abrir de nuevo Visual Studio Code. Consigan esto a nuestro tamaño de pantalla para ustedes. Entonces voy a abrir esa carpeta. Entrando en código, Skillshare, escaparate de clase hidrógeno. Quitando esa pestaña ahí. Puedes ver si entramos en la carpeta SRC, en index.css, tenemos todo el CSS que ya escribí para este proyecto y luego si entramos en nuestra ruta index.server.jsx, tenemos esto justo aquí. Sigamos adelante y ejecutemos una nueva terminal directamente dentro de nuestro proyecto. Vamos a borrar todo este molesto código que surge. Eso es sólo una cosa de mí. No te preocupes por eso. Entonces ejecutemos nuestro comando para ejecutar el servidor, npm ejecutamos dev, y luego abriremos localhost:3000. Voy a deshacerme de estas otras pestañas. Ahora que ya tenemos nuestro proyecto a nivel local, y aquí puedes ver que tenemos un título y una descripción. Ahora, ¿de dónde viene eso? Quería actualizar el archivo index.server.jsx para mostrarte un patrón que vamos a usar en prácticamente todas nuestras rutas. forma en que vamos a ejecutar este proyecto es que vamos a crear una sección a la vez. Vamos a hacer la página del catálogo. vamos a hacer la página de colección. Vamos a hacer la página del producto, y luego vamos a habilitar la funcionalidad del código. Básicamente, el patrón que vamos a usar, y si puedes entender esto dentro de Shopify cómo hacer desarrollo, entonces estás bien encaminado a codificar cualquier tipo de proyecto. El patrón es éste. Vamos a importar lo que necesitamos de Shopify hidrógeno, vamos a exportar un componente, y luego vamos a crear nuestra consulta. Ahora bien, esto está fuera de servicio porque estamos usando la consulta aquí arriba en nuestro gancho UseShopQuery. Pero por cualquier razón en los ejemplos, Shopify pone al final la definición de su consulta, así que voy a seguir esa secuencia. Sólo voy a minimizar eso por un segundo. Aguanta, eso lo maximizó. Déjame ver si puedo simplemente crear algo más de espacio aquí para que podamos, no, eso crea una nueva pestaña. A lo mejor lo que voy a hacer es guardarlo por un periodo porque quiero que mires lo que está pasando aquí en su totalidad. Eliminemos eso para que podamos echar un vistazo más de cerca. Lo que está pasando aquí es que si recuerdas en el anterior index.server.jsx, solo tenía un componente simple que tenía un div con hello world en él. Ahora eso no va a ser particularmente útil porque eso no es contenido dinámico en absoluto. Pero lo que vamos a hacer en esta clase es que vamos a traer contenido dinámico de tu tienda. No voy a recargar la página aquí porque ya la apagué, pero aquí, puedes ver que tenemos hidrógeno y luego tenemos un escaparate personalizado impulsado por hidrógeno, Shopif's react-based marco para la construcción sin cabeza. ¿De dónde viene eso? Porque si miramos aquí dentro, se puede ver que ambos son valores dinámicos. Lo que realmente estamos haciendo es que estamos sacando esa información de la API de escaparate. Las tres cosas que importamos de Shopify hidrógeno aquí es el gancho UseShopQuery muy importante, que es lo que usamos para consultar la API de escaparate. Estamos trayendo aquí este objeto llamado Cachelong. Esto es solo una estrategia de almacenamiento en caché así que aquí no está pasando nada demasiado complejo. Podemos reemplazar esto fácilmente escribiendo la estrategia de almacenamiento en caché. Simplemente nos ayuda un poco a ahorrar tiempo al sacar esa poca utilidad del hidrógeno. Entonces esta de aquí es una utilidad que nos ayuda a hacer resaltado de sintaxis con nuestras consultas GraphQL aunque realmente no parece que esté funcionando en mi configuración particular, pero eso está bien. Realmente no necesariamente necesitamos eso, eso es simplemente un lindo tenerlo. Lo que estamos haciendo aquí, así que tenemos nuestro componente de hogar aquí mismo que se ejecuta en la ruta del índice, y en nuestra declaración de retorno aquí, estamos regresando JSX que vimos anteriormente en la teoría. Ya he establecido una clase aquí. Nuevamente, este no va a ser un curso CSS así que voy a simplemente poner nombres de clase que coincidan con el CSS que he construido para que podamos obtener un poco de estilo desde el principio. Todo lo que tenemos que hacer es hacer que coincida con nuestro archivo CSS aquí. Pero nuevamente, puedes editar esto totalmente a la manera que quieras. Simplemente no quería quedar atrapado en ningún CSS en esta clase porque esta no es una clase CSS. Volviendo a nuestro archivo index.server.jsx aquí, lo que estamos haciendo es que estamos pasando por un objeto a useShopQuery con nuestra estrategia de asignación de consultas GraphQL y luego estamos diciendo preload: true. Esta es solo una configuración básica predeterminada que puedes ver en los ejemplos de Shopify. Lo principal a entender aquí es que estamos escribiendo nuestra consulta aquí en GraphQL y luego la estamos poniendo en UseShopQuery. Ahora en los ejemplos, lo que verás es destrucción de objetos sucediendo aquí mismo. No tiene esta línea, pero me gusta romperla, o al menos para esta clase porque simplemente la hace un poco menos complicada. Puedes descomponer un poco los escalones. Lo que estamos haciendo es que los datos que van a ser devueltos de la API van a entrar en este objeto de datos aquí y luego lo vamos a desestructurar para obtener los datos devueltos. Ahora bien, aquí hay algo que puedes hacer a lo largo esta clase que te ayudará a determinar lo que regresa de la API. Se puede ir console.log (datos). Ahora bien, ¿dónde encontramos esta información? Bueno, en realidad estamos en un componente del lado del servidor aquí. Como pueden ver por aquí, no creo que todavía tengamos ningún componente del lado del cliente, pero como puede ver aquí, todos nuestros componentes hasta ahora tienen.server en ellos. Si ejecutamos esto, el registro de la consola va a suceder en nuestro terminal pero no en nuestro navegador. Volvamos a abrir nuestra terminal, deshacernos de todo eso, y luego ejecutemos npm run dev. Ahora sólo vamos a tener que darle a esto. Voy a refrescar la página y si volvemos a nuestra consola aquí, voy a abrir esto y se pueden ver los datos que vuelven. En realidad está regresando dos veces aquí. Se puede ver que obtenemos este objeto de datos y en su interior obtenemos el objeto filoso, y luego dentro de ese obtenemos el nombre y la descripción. Esto nos permitirá inspeccionar lo que hay dentro. Como puede ver, esta desestructuración coincide con lo regresa de ese objeto de datos. Podemos eliminar esto y en vez de tener Shop aquí, podemos hacer datos. datos. tienda. Refresca la página y verás que obtenemos el mismo resultado. Pero obviamente, eso es un poco más feo. Esto podría parecer un poco más complicado, pero nos ayuda a sacar esos objetos afilados para que no necesitemos poner datos, datos frente a él. Eso es esencialmente lo que está pasando ahí. Elimino ese registro de consola y se puede ver que estamos sacando el objeto shop fuera del retorno a los datos y luego podemos acceder al nombre y la descripción porque eso es lo solicitado en nuestra consulta GraphQL. Esa es la base de todo lo que vamos a hacer en esta clase, vamos a estar importando componentes, engancha utilidades del marco de hidrógeno. Vamos a estar usando esos ganchos para enchufar algunos datos. Vamos a estar usando esos datos aquí en nuestros componentes, y si lo requiere, vamos a escribir consultas a las que conectaremos en el caso de consulta UseShop para obtener nuestra datos. Si entiendes este patrón, entonces estamos en camino de codificar nuestro primer escaparate de hidrógeno. 7. Creación de un componente de diseño: En la última lección empezamos con nuestro proyecto, lo configuramos y ejecutamos en nuestra computadora. Se puede ver aquí. Una de las cosas que olvidé mencionar en el último video es que estos datos vienen de la tienda de vista previa de Shopify. Si entramos en nuestro explorador aquí, y bajamos a, creo que es hydrogen.cong.js, puedes ver que StoreDomain es hydrogen-preview.myshopify.com, y el StoreFrontToken es lo que necesitamos para conectarnos a eso. Por eso tenemos estos datos justo fuera de la puerta. En esta clase, en realidad no necesitamos crear una tienda o actualizar nuestra tienda con datos de demostración porque solo podemos usar esta tienda de demostración en la totalidad de esta clase. Sin embargo, cuando implementemos esto nuestra tienda Shopify real, vamos a querer reemplazar estos detalles con nuestro propio dominio de tienda y nuestro propio token de acceso a la tienda, ¿de acuerdo? Sólo pensé en mencionarlo antes de empezar. Algunos de ustedes se estarán preguntando, ¿de dónde obtenemos esta información? Bueno, está precargado para usar la tienda de avance de hidrógeno, lo cual creo que es muy agradable en esta clase. Por ejemplo, no queremos tener que crear todos estos datos de demostración, solo podemos conectarnos a los datos de demostración existentes, lo cual es muy conveniente. Con eso fuera del camino, lo que quiero hacer en este video es crear un componente de layout. Nuestro componente de diseño va a envolver todo nuestro sitio web y básicamente proporcionará un encabezado y un SEO necesario que se ejecutará en cada ruta en nuestra tienda de hidrógeno. Lo que voy a hacer es, voy a entrar en la carpeta SRC aquí, crear una nueva carpeta para mis componentes, y luego dentro de esta carpeta de componentes, voy a crear un componente layout.server.jsx, ¿bien? Ahora bien, este componente va a cumplir dos funciones; va a renderizar un encabezado, y también renderizar información de SEO para que cualquier página de nuestro sitio web ya tenga el SEO incorporado, ¿de acuerdo? Solo, para hacernos la vida más fácil, voy a copiar todo aquí y ponerlo aquí, ¿de acuerdo? Ahora lo que voy a hacer es, eliminar eso, y vamos a poner un div aquí para empezar para que no obtengamos un error, y luego vamos a nombrar esto no home, sino layout. Entonces como te mostré en el video de teoría, voy a usar la desestructuración de objetos para agarrar a los niños que pasen a este componente de diseño, ¿de acuerdo? misma consulta aquí, vamos a usar el nombre y la descripción para el encabezado y también la información de SEO. Entonces lo que voy a hacer es que en nuestro archivo index.server.js se simplifica como una tonelada, no vamos a usar estos datos en nuestra página de inicio, así puedo eliminar todo esto, puedo quitar esto aquí arriba, y sólo vamos a devolver un componente muy básico, y aquí dentro, voy a poner solo homepage, ¿de acuerdo? Deshazte de eso. Entonces lo que voy a hacer es traer ese componente de layout. Puedo importar, y creo que estamos exportando por defecto por aquí, así que no necesitamos usar los corchetes, solo podemos hacer layout desde componentes, y luego simplemente vamos a crear una ruta a el componente de diseño. Entonces lo que quiero hacer es pasar todo esto entre nuestras nuevas etiquetas de componentes de diseño, ¿de acuerdo? Ahora, como ve aquí, estamos accediendo a los niños, lo que quiero hacer aquí es poner a esos niños entre estos divs, ¿bien? A ver si eso está funcionando ahora para nosotros. Si voy por aquí, pueden ver, sí, no hay errores, ¿de acuerdo? Volviendo a aquí, lo que queremos envolver alrededor esta página básica es un encabezado e información SEO. Empecemos a trabajar en lo que hay dentro de nuestra declaración de devolución aquí, nuestro JSX. En primer lugar quiero devolver lo que sea que se pase a través de esas etiquetas de diseño. Lo que voy a hacer es llamar a esto principal porque esta va a ser nuestra parte principal de nuestra página, y luego voy a envolver a los niños en un par de etiquetas de suspenso porque no sabemos qué ordenar los datos podrían estar llegando a través. Recuerda que esto va a envolver cada ruta, no solo la ruta index.server.jsx, ¿de acuerdo? Ahora, vamos a obtener este error aquí y eso es porque aún no hemos importado suspenso. Voy a importar suspenso de react. Como pueden ver, solo llenó eso para nosotros. Ahora estamos trayendo a algún niño ya sea que esté cargado de forma asíncrona o no, ¿bien? Ahora todo lo que tenemos que hacer es traer nuestro SEO y nuestro encabezado. Ahora, la forma en que hacemos SEO en Shopify hidrógeno es simplemente importar un componente SEO del marco de hidrógeno, y entonces lo que podemos hacer es traer ese componente SEO de aquí. No necesitamos una etiqueta final, pero sí necesitamos ponerla en ese guión para cerrarla. Entonces dentro de aquí, pondremos en el tipo de SEO por defecto. Luego en el campo de datos, pondremos un objeto para título y descripción, y aquí es donde usaremos el nombre de la tienda y descripción que regresaron de la API de escaparate. Podemos poner eso aquí, nombre de la tienda y descripción de la tienda. Ahora, lo que notarás aquí después de que hayamos hecho esto es que estamos obteniendo todas estas líneas rojas onduladas, y eso es porque no podemos devolver múltiples elementos en el nivel superior con JSX, así que solo estamos va a tener que crear un elemento de nivel superior, y podemos crear uno de estos en blanco, así, un poco de un hack, pero ahora no obtenemos esas líneas rojas onduladas. Si vuelvo aquí, vuelva a ejecutar nuestra página de inicio y abro mis herramientas de desarrollo. Acabo de presionar Option Command I para hacer eso, lo contrario tendrás que entrar en tu menú y abrir DevTools. Hago esto en todas las clases, así que ojalá ustedes me estén siguiendo aquí. Entonces si entro en nuestros elementos aquí, puedes ver que si entramos en nuestra etiqueta de cabeza aquí, puedes ver que tenemos nuestro título y descripción llegando a través de estas metapropiedades, cuales son nuestras etiquetas SEO, ¿de acuerdo? Tenemos nuestro SEO llegando a través de ahora. Ahora solo queremos construir un encabezado. De nuevo, voy a aprovechar algunas de las clases que ya he escrito en el CSS, esta no es una clase CSS así que voy a agarrar este contenedor header-inner como clase. Entonces aquí voy a crear un enlace para que podamos usar el componente link en Shopify, y voy a enlazar eso a la página de inicio simplemente poniendo en slash ahí. Este enlace va a ser básicamente el logotipo del encabezado, es un patrón común con encabezados que si haces clic en el logotipo, te dirigirá de regreso a la página principal, así que eso es exactamente lo que estamos haciendo aquí. Entonces aquí es donde pondré el nombre de la tienda, ¿de acuerdo? Ahora necesitamos importar enlace de nuestro marco de hidrógeno porque aún no lo hemos hecho. Entonces si presiono “Guardar” en esa actualización de aquí, puedes ver que ya tenemos este encabezado. Entonces si hago clic en esto, nos llevará a la página de inicio en la que ya estamos , ¿de acuerdo? Eso va a ser útil después. Ahora lo que voy a poner es una lista desordenada con la clase de navegación de encabezado. Esto va a albergar nuestra navegación de cabecera obviamente. Entonces voy a usar algo de Emmet aquí para poner en tres enlaces. Simplemente vamos a tener enlaces vacíos en esta etapa, link 1, link 2, porque no tenemos otras páginas, así que solo voy a poner en algunos marcadores de posición básicamente. Entonces finalmente vamos a tener un spot aquí para enlazar a la página del carrito. Aún no tenemos eso, así que lo que voy a hacer es simplemente poner aquí un marcador de posición. El nombre de la clase va a ser header-cart-link, así que voy a poner eso ahí, ¿de acuerdo? Voy a golpear “Guardar” en eso. Si vamos por aquí, puedes ver que tenemos nuestro encabezado y todo es bonito y centrado. Básicamente, lo que vamos a hacer chicos es a medida que vayamos a lo largo de la clase, vamos a actualizar nuestro encabezado a medida que avanzamos. A medida que creamos nuevas páginas, podemos agregar enlaces a esas páginas aquí, y luego podemos agregar en nuestro ícono de carrito aquí con el número de artículos en nuestro carrito también. Llegaremos a eso más tarde en la clase. Pero ahora que hemos creado este componente de diseño, vas a envolver todas tus rutas con esta etiqueta de componente de diseño aquí, y eso asegurará que el encabezado y información de SEO aparezcan en cada ruta. Con eso fuera del camino, vamos a crear una página de catálogo para ver todos nuestros productos en nuestra tienda de hidrógeno Shopify. 8. Construyendo una página de catálogo: En el último video, creamos este componente de diseño, que es lo que vamos a usar como nuestro diseño estándar en todas nuestras rutas. Actualizamos nuestra ruta de índice y ahora tenemos nuestra página de inicio súper básica sentada dentro de nuestro diseño, que luego nos da nuestro encabezado y nuestro SEO, que vimos en el último video. En este video, lo que vamos a hacer es crear una nueva ruta. Voy a llamar a esto las rutas del catálogo, lo siento, esa es la carpeta equivocada, aquí mismo en nuestra carpeta de rutas, catalog.server.jsx. Así como un poco de contexto aquí, la razón por la que es un archivo.server.jsx aquí es porque vamos a estar consultando la API de escaparate. Es una buena idea que cada vez que consultes la API de escaparate en cada componente del router, que estés haciendo eso. Quieres estar haciendo eso como un componente basado en servidor o del lado del servidor, esa manera no estamos exponiendo lo que estamos consultando, esencialmente base de datos, al usuario final. Comencemos exportando un componente funcional aquí. Esta va a ser nuestra página de catálogo, que va a albergar todos los productos que existen en nuestra tienda. Entonces voy a poner una declaración de retorno aquí mismo y luego vamos, por supuesto, a comenzar con el componente de diseño. Vamos a tener que importar eso, lo contrario, vamos a obtener un error. Así que importa el diseño de navegar a la ruta, a nuestro diseño. Solo para que lo sepan, chicos, este punto-punto significa volver uno en la carpeta SRC, y luego podemos buscar en los componentes y luego encontrar el layout. Si no estás familiarizado con esto aquí mismo, eso es lo que eso significa. vamos a estar dibujando Aquí vamos a estar dibujando algún contenido asincrónico, así que voy a poner en suspenso justo después de mi maquetación. También vamos a tener que importar suspenso de React. Entonces un poco de estructura aquí que ya he configurado, he creado algunos CSS para las clases de página de catálogo y contenedor. Sólo vamos a poner nuestra página en un bonito contenedor. Entonces vamos a crear un div con la clase de grilla de productos y eso va a albergar todos nuestros pequeños artículos de cuadrícula de productos. Si presiono “Guardar” en eso, actualmente no estamos tirando ningún dato, pero si voy aquí a la página del catálogo, tenemos una página prácticamente en blanco. Si vamos a inspeccionar esto, verá, sin embargo, que tenemos esos divs que configuramos, la página del catálogo y la cuadrícula del producto. Esto es básicamente inútil hasta que traemos algunos datos. Escribamos nuestra consulta abajo aquí. Voy a crear una constante llamada query y luego voy a usar plantilla de cadena GQL y poner en nuestra consulta aquí. Porque estoy usando esto, voy a tener que importar eso de Hidrógeno, así que voy a hacer eso aquí arriba. Importar GQL de Shopify Hydrogen. En realidad, hagamos esto en nuestra interfaz gráfica. Entonces una vez que lo hayamos probado, sepa que funciona, podemos traerlo a nuestro proyecto. Creo que eso es un poco más agradable. Voy a ir a gráfica aquí. Podemos cerrar nuestras DevTools. Voy a deshacerme de esta consulta estándar aquí mismo, abre esto. Entonces lo que voy a hacer es que podemos nombrar primero a nuestra consulta. Es una buena convención para hacer eso, así que solo voy a crear una consulta con nombre. Voy a llamarlo productos de consulta. Entonces aquí es donde realmente empezamos a solicitar algunos datos. Voy a solicitar productos. Va a equivocarse a menos que determine cuántos quiero. Voy a pedir los primeros nueve. Entonces voy a abrir una selección aquí y voy a agarrar todos los nodos y los elementos que quiero en él. Empecemos con el título y el manejo. Vamos a correr eso. Dice que la consulta no existe en la ruta de consulta de tipo. Eso es porque tengo que mover esto. No debería estar anidando eso en un objeto ahí. Como pueden ver, ahora se ve mucho mejor, hay resaltado de sintaxis, así que creo que hemos resuelto ese tema. Vamos a averiguarlo. Ahí lo tenemos. Podemos recuperar los primeros nueve productos de la tienda a primeros nueve productos de la la que estamos accediendo, que es solo la tienda de vista previa de Hydrogen, y podemos recuperar el título y asa de todos estos productos. Empecemos con eso. Vamos a trasladar esto de nuevo a nuestro proyecto. Intenta sangrarlo muy bien aquí, así. Entonces necesitamos traer en uso la consulta aguda. Eso lo estamos importando de Hidrógeno, claro. Entonces queremos ir dentro de nuestro componente aquí. Básicamente podemos simplemente copiar lo mismo, pero usar una consulta nítida. Ahora lo hacemos por aquí. Del archivo layout.server.jsx, ponlo aquí. En lugar de una consulta nítida, solo va a ser consulta. Podemos nombrar a esto como queramos. Podríamos nombrar esta consulta de catálogo, pero por ahora solo la llamaré consulta. Entonces lo que voy a hacer es que solo consigamos en consola registrar los datos que regresen para que sepamos cómo estructurarlo en D. Echemos un vistazo aquí. Tenemos un poco de error. CacheLong no está definido, así que tenemos que asegurarnos de que estamos importando eso de Shopify Hydrogen también. CacheLong. A ver si esto funciona ahora. Volvamos. Abre localhost 3,000 en una nueva pestaña y volvamos a abrir nuestras herramientas de desarrollo para ver si hay algún error del lado del cliente. Aquí tenemos un error. Dice que no se pudo conectar a la API de escaparate. Esto podría deberse a mi conexión a Internet. Se me olvidó poner una C ahí, así que probablemente ese es el tema. Vamos a refrescarnos por aquí. Ahora solo necesitamos entrar en la ruta del catálogo, y ahora no hay errores. Aquí hay algún error. Pero antes de que viéramos ese error, puede ver aquí, podría ser un poco difícil de ver, pero en realidad estamos cerrando sesión en la consola el objeto de datos que vuelve de usar la consulta aguda. Puedes ver aquí, podemos usar esto como nuestro formato para la estructuración D, podemos agarrar nodos dentro de los productos dentro de los datos aquí. Yo voy a hacer eso. Déjame empujar esto de nuevo para que podamos copiar lo que tenemos aquí. Al igual que hicimos aquí cuando D-estructuramos y llegamos a esos objetos puntiagudos, qué podemos hacer aquí, si lo copio, vamos a entrar en datos una vez más, pero luego en vez de agudo vamos a entrar en productos. Entonces dentro de los productos se sacarán los nodos. Entonces si ejecuto nodos como mi consola registro aquí, vamos a refrescar nuestra página de catálogo, entonces si miro aquí puedes ver todos los nodos regresando. Estos son nuestros productos. Se puede ver que está regresando algunas veces, pero se puede ver una matriz de nodos. Estamos recuperando el título y el asa de cada uno de estos productos. Entonces lo que podemos hacer es que podamos usar eso aquí. Podría ir nodos. Aquí es donde en lugar de ejecutar un bucle, lo que vamos a hacer es ejecutar mapa. Te explicaré por qué lo hacemos en sólo un segundo. Vamos a correr mapa. Entonces lo que vamos a hacer es pasar por cada producto a través de alguna JSX. Solo voy a poner aquí un div básico y luego lo que puedo hacer es lanzar una expresión JavaScript en este JSX. Puedo hacer el título del producto aquí mismo. En realidad, lo que haremos es hacer de esto una lista, así haré una lista desordenada. Esta no va a ser la forma final, sino que simplemente se verá mejor para este ejemplo básico. Entonces le pegaré a “Enter” en eso. Aquí hay un error de sintaxis. Creo que ahí necesitamos otro soporte. A veces cuando hay un error de sintaxis detendrá su servidor por completo, así que necesitamos volver a ejecutar el servidor, npm ejecutar dev. Ahora si vamos a nuestra página de catálogo, verás que tenemos una lista desordenada con todos nuestros diferentes productos. Bueno, al menos los nueve primeros de ellos, que es lo que solicitamos aquí mismo. Ahora para explicar esta cosa del mapa aquí, básicamente, queremos devolver todos los nodos, pero necesitamos envolver cada uno de estos nodos en alguna JSX, ahí por qué estamos usando map. Si acabamos de hacer nodos por sí mismos sin ningún JSX, veamos si eso devuelve algo. No podemos simplemente devolver una matriz aleatoria. Necesitamos convertir esa matriz en JSX, así que es por eso que estamos usando map aquí, que básicamente va a crear una matriz de JSX. Esa expresión se insertará entre estas etiquetas de lista desordenadas. Ojalá, eso explica el uso de la función map ahí en JavaScript. Tenemos una lista básica de todos nuestros títulos de productos a continuación. Los primeros nueve, al menos, por el momento. Pero lo que queremos hacer es ampliar eso. Muestre el precio, exhiba la imagen en una pequeña grilla agradable como cabría esperar en cualquier sitio de comercio electrónico. Lo que vamos a hacer es crear un componente para este elemento de la cuadrícula del producto. Lo que voy a hacer es entrar en mi archivo de componentes aquí y crear, voy a llamarlo, ProductGridItem.server.jsx. Entonces lo que voy a hacer es la exportación habitual, una función por defecto, y así nuestro componente. Voy a simplificarlo dentro del propio componente real y llamarlo ProductCard. Entonces obviamente necesitamos una declaración return para el JSX. Seamos muy simples por el momento y movamos este elemento de la lista a nuestro componente aquí. Ahora vamos a intentar acceder al producto, lo que significa que necesitamos analizarlo como un prop. Voy a sacar el objeto producto del prop de este componente, y luego de este lado, necesitamos importar este productGridItem o ProductCard, como lo hemos llamado aquí. Primero voy a escribir aquí, ProductCard y presionar “Guardar” en eso. A veces lo importa automáticamente para ti, pero parece que esta vez vamos a tener que hacerlo nosotros mismos. Voy a importar esa ProductCard. Como pueden ver, el resto se llenó para nosotros, lo cual es muy agradable. Intentemos reorganizar esto un poco más agradable. Pondré mis componentes que yo mismo creo después mis importaciones de reaccionar e hidrógeno así. Entonces lo que vamos a hacer es crear un prop llamado product y analizar en ese producto objetos. Ahora si vamos por aquí y refrescamos, verás que obtenemos exactamente el mismo resultado. Ahora solo estamos encapsulando este código en su propio componente. Por supuesto, tenemos que exportar eso y luego importarlo aquí arriba y luego podemos usarlo aquí abajo, analizando cada producto en sus accesorios. Hay muchas cosas que vamos a hacer dentro de esta ProductCard. Eliminemos esta UL porque vamos a crear esto como una grilla, no como una lista. Así que voy a deshacerme de ese componente UL, actualizar el anidamiento, y luego por aquí lo que voy a hacer es crear un div con la clase de product-grid-item, que de nuevo, esto es CSS existente que coincide con lo que he creado aquí. Entonces lo que quiero hacer una vez que esté aquí adentro es obviamente traer el título, pero también quiero traer la imagen y el precio. Ahora cuando se trata de imágenes en Shopify Hydrogen, Shopify tienen este increíble componente que se acaba de llamar imagen. Si acabo de importar el componente de imagen de Shopify Hydrogen, y luego si agrego el campo de imagen por aquí, realidad, hagamos esta consulta de nuevo en una interfaz gráfica por aquí. Entonces si encuentro cuál es el campo que estoy buscando, esta es la parte práctica de usar gráficos. Aquí tengo autocompletar. Si olvido cuál es el nombre del campo de imagen en este nodo en particular, va a autocompletarlo por mí. Entonces si intento ejecutar eso, verás que se equivoca porque tengo que tener selecciones aquí. Esto va a devolver una conexión de imagen, creo. Si coloco el cursor sobre él, va a devolver una imagen. Lo que podemos hacer es buscar la documentación para ver qué campos hay en el objeto de imagen. Estoy aquí en la referencia de la API de escaparate. Vamos a la tienda en línea, a los objetos. Ahora creo que está en objetos comunes. Aquí está el último lugar en el que busques. Aquí puedes ver el objeto de imagen, y luego aquí puedes ver, para obtener la URL de la imagen, podemos acceder a él así. Podemos obtener el altText, podemos obtener el ancho. Lo que podríamos hacer es entrar aquí, tomar la URL, y luego podríamos crear nuestra propia imagen HTML básica y traer ese SRC. Pero entonces no obtendríamos el beneficio de las imágenes receptivas. Lo que realmente podemos hacer en cambio es usar el componente de imagen, si voy por aquí, desde el marco Shopify Hydrogen. Te voy a mostrar cómo funciona eso en sólo un segundo. Pero primero, necesitamos flashear esta consulta aquí mismo. Yo también voy a agarrar el AltText. Voy a agarrar la altura y voy a agarrar el ancho. Vamos a ejecutar esto, asegurarnos de que no haya errores. Tenemos el nombre de usuario y los datos relacionados con la imagen destacada. Voy a agarrar eso y pegar eso por aquí dentro de nuestra consulta. Ahí vamos. La anidación está un poco apagada. Dale un toque así. Entonces entonces lo que voy a hacer aquí es abrir un componente de imagen aquí mismo. Cómo funciona esto es que podemos poner dentro de Alt, podemos acceder a los objetos de imagen destacados en el producto y luego agarrar el AltText. Pero entonces para el resto de los datos de imagen, podemos simplemente analizar a través de este prop de datos, el objeto de imagen en sí. Sólo necesito cerrar eso. Entonces si presiono “Guardar” en eso y nos refrescamos por aquí en nuestra app de hidrógeno, puedes ver todas nuestras imágenes venir a través. Si hago clic con el botón derecho y los inspecciono, puedes ver que tenemos una carga perezosa incorporada, y tenemos todos estos diferentes tamaños de respuesta basados en el ancho de la pantalla. En Shopify Liquid, puedes hacer esta optimización creando un fragmento y usando el filtro de URL de imagen para crear diferentes URL de imagen para servir en función de las dimensiones de la imagen dentro de tu Shopify tienda. Pero aquí, todo lo que tenemos que hacer es usar el componente de imagen dentro de Shopify. Para mostrarte la alternativa, por ejemplo, si acabamos de hacer una etiqueta de imagen con SRC y luego podríamos simplemente analizar en product.featuredimage.url, guarda eso, actualiza por aquí, obtienes el mismo resultado, pero ya ves cómo se está cargando un poco más lento. Entonces si entramos aquí, vemos que sólo tenemos el único SRC. Para imágenes receptivas, no tenemos que pasar por y escribir todo el código nosotros mismos, solo necesitamos usar este práctico componente de imagen proporcionado por Shopify Hydrogen. Como puedes ver, ya está recargada y puedes ver ahora tenemos habilitada la carga perezosa y todas estas diferentes URL generadas automáticamente para nosotros. Ese es el poder de usar algunos de estos componentes que vienen a través del hidrógeno. Algunos de ellos innecesarios y algunos de ellos simplemente nos hacen la vida mucho más fácil. Veremos eso cuando hagamos opciones de productos y también cortamos. mejor podríamos hacer eso sin estos componentes, pero ellos simplemente nos hacen la vida mucho más fácil y espero que ustedes estén empezando a ver eso ahora. Lo que voy a hacer es envolver esto en un contenedor de imágenes. Esto es solo algunos CSS para que aparezca exactamente como lo queremos. Aquí nos estamos quedando sin espacio, así que voy a abrir esto. Entonces debajo del contenedor de imagen, voy a poner en un div aquí con la clase de product-grid-item-title. Entonces aquí puedo poner en el product.title, y luego vamos a golpear “Guardar” en eso, refrescar por aquí y se puede ver que tenemos el título del producto y la imagen. Pero generalmente en una grilla de productos también quieres ver el precio así que hagámoslo a continuación. Vamos a necesitar traer algunos datos adicionales para eso porque actualmente solo tenemos el identificador del título y la imagen destacada. Volvamos a pasar a la gráfica. Entonces debajo de la imagen destacada, si escribimos algo así como el precio, que va a obtener el rango de precios y el compareAtPriceRange. Algo que es un poco más preciso es sumergirse realmente en el producto y agarrar su variante. Verás que podemos acceder al rango de precios y compararRango de precios. Pero si queremos obtener un precio específico, lo que podemos hacer es indagar en las variantes. Lo que voy a hacer es que sólo voy a buscar la primera variante. Por supuesto, esta es una selección con nodos dentro de ella, así que vamos a tener que abrir nodos. Entonces dentro de varianza, voy a agarrar, veamos qué viene por precio. Tenemos PriceV2, y eso es en realidad una selección en sí, así que tenemos que entrar y agarrar la cantidad y el código de moneda. Entonces, si queremos tener el CompareatPrice también, tendremos que hacer exactamente lo mismo para eso, así como el código de moneda. Si le pego a “Guardar” en eso no se guardará sino que se ejecutará en eso. Miramos aquí abajo. Se puede ver que para este snowboard de hidrógeno, el precio es de 600 dólares, pero en realidad tiene un compareatPrice de casi 650 dólares. Obviamente esto funciona, voy a copiar eso. Péguela de nuevo en nuestro proyecto. Desafortunadamente, creo que vamos a perder nuestra anidación. No, en realidad, estar bien con el anidamiento. Pulsa “Guardar” en eso y luego por aquí lo que puedo hacer es crear un nuevo div aquí. Voy a usar la clase de producto-grid-prices y aquí, puedo hacer product.priceV2.amount para que sea realmente simple para empezar. ¿Qué he hecho mal aquí? Esto no está a la altura de lo que tengo aquí los productos. Se me olvidó entrar en la variante. Vamos a entrar en la varianza y entrar en nodos, agarrar el primer nodo. Eso es un error ortográfico, variantes.nodes , precio a cantidad. Ahí se puede ver que tenemos el precio entrando, pero no está formateado. ¿Qué vamos a hacer? Bueno en Shopify líquido hay un filtro para esto, que formatea muy bien el precio para nosotros. Tenemos algo similar dentro Shopify hidrógeno llamado el componente dinero. Voy a importar el componente de dinero aquí mismo y luego vamos a quitarle eso y luego abrir un componente de dinero aquí. Entonces igual que hicimos con la imagen, puedo poner en la preparación de datos ese mismo precio, pero no quiero entrar específicamente en la cantidad. Este componente va a averiguar cuál es la cantidad y cuál es la moneda y formatearla muy bien en base a esos dos. He cometido un error aquí. Tengo dos corchetes, y eso ha detenido mi servidor. Ejecutemos de nuevo el servidor, ejecutemos npm run dev, y luego volvamos a ejecutar nuestra página de catálogo aquí. Ahora puedes ver que tenemos el símbolo de moneda, y estos precios están formateados como moneda. Tenemos moneda muy bien formateada aquí. Ahora, por el bien de la integridad, vamos a construir en la comparación en el precio también. Lo que pueda hacer aquí abajo, hagamos esto para empezar, y luego limpiaremos esto. Voy a entrar aquí y voy a agarrar lo que fue comparar. Volvamos a aquí. Compara al precio V2, pon eso aquí, y ciérralo igual que ese. Ahora vamos a conseguir los dos precios uno al lado del otro. A lo mejor no. Aquí tenemos un error, que es interesante, que sí parece coincidir con lo que estamos regresando aquí. Vamos a usar un registro de consola para depurar aquí. Voy al objeto de productos de registro de consola aquí. Podemos ver lo que se está devolviendo. Tienes título, manejar imagen destacada. Vamos a entrar en variantes, nodos y volver a ejecutar. Desplazarse hacia arriba por aquí si vamos. Ya veo. A veces comparar precio V2 es nulo y por eso hay un error. A veces hay una comparación al precio V2, pero a veces es nulo. Lo que el componente de dinero está tratando de hacer es acceder y atribuir a un objeto que es ahora. Tenemos que asegurarnos de que estamos comprobando si esto es realmente nulo. Lo podemos hacer aquí es si está devolviendo un valor veraz, entonces podemos poner en esta básicamente declaración de retorno aquí y luego ejecutar ese precio de comparación. Aquí puedes ver en estos donde no hay una comparación de precio es solo mostrar un precio. Donde hay una comparación en el precio está mostrando ambos precios. Ahora bien, esto es desordenado obviamente. Mira esto, esto no es muy agradable. Lo que vamos a hacer es limpiar esto aquí arriba y luego poner algo un poco más agradable aquí abajo. Voy a deshacerme de este registro de la consola. Lo que voy a hacer es usar la desestructuración de objetos para quitar estos atributos de este nodo aquí mismo. Lo que voy a hacer es agarrar el precio V2, y lo voy a sacar como precio justo. Entonces voy a agarrar el comparar en precio y solo voy a lograr eso como comparar en precio, no el comparar en precio V2. Realmente no necesitamos ese V2. Creo que eso es solo el versionado de API ahí mismo. Entonces vamos a agarrar eso de lo que tenemos aquí abajo, product.variants.nodes, y luego agarrando el primero en esa matriz. Pero necesitamos algún respaldo en caso de que alguno de estos sea nulo. Aquí vamos a poner un signo de interrogación. Si es nulo o indefinido, simplemente pasaremos por un objeto vacío. Entonces en lugar de verificar si esto es ahora lo que haremos, que es un poco más sofisticado un poco más agradable, solo verificaremos si el monto de comparar al precio es mayor que el precio del mismo. Yo lo llamaré está descontado. Entonces pondremos aquí un booleano, compararemos al signo de interrogación de precio en caso de que devuelva nulo, cantidad es mayor que interrogación de precio en caso de que devuelva cantidad nula. Entonces, así que aquí, voy a cambiar estos aquí también, se descuenta. Si se descuenta, va a devolver esto. En lugar de tener el precio representado muy largo aquí, solo podemos usar el precio que sacamos aquí arriba, precio, y luego comparar al precio. Si le pego a “Guardar” en eso y vamos a refrescarnos por aquí, verás que obtenemos el mismo resultado, pero es un poco más limpio y en nuestro JSX, es mucho más agradable de leer. También le voy a dar a éste un nombre de clase de productos comparar a precio. Entonces si le pego a “Guardar” y recargar, ahora se puede ver que comparar al precio es claramente el precio de rebaja visualmente porque tenemos algunos CSS que se aplican en él ahora. Otra cosa que te mostraré antes de que terminemos es, como puedes ver, algunos de estos tienen.00, que quizás no quieras mostrar en la parte frontal. Obviamente, si hay un valor en estos decimales, probablemente no quieras redondear. Pero cuando hay algo como 600, realmente no necesitamos ir a dos decimales. Lo que podemos usar es similar en Shopify líquido con formato de precios, podemos poner algo así como sin ceros finales. Entonces si presiono “Guardar” en eso y volver atrás, puedes ver todos los productos que tenían.00 van a tener eso eliminado. Esa es otra pequeña y genial opción de formato ahí. Lo voy a dejar ahí para la página del catálogo. Lo que haremos en el futuro es que los haremos vinculables. Pero debido a que aún no tenemos una ruta de producto creada, solo va a resultar en dirigirse a una página 404. Lo mantendremos así por ahora. En el siguiente video, vamos a aprender a enviar a través de un gestor de colección en la URL y consultar nuestra API de escaparate para devolver solo los productos dentro de esa colección. Esencialmente, vamos a estar creando una página de colección en el siguiente video. 9. Construyendo una página de colección: Entonces en el último video, creamos una ruta de catálogo, que está mostrando todos los productos de nuestra tienda. No está filtrando por una colección en particular. En realidad corrección, sólo está mostrando los primeros nueve porque sólo hemos consultado a los nueve primeros. Pero si extendemos esto a 100 o lo que sea, obtendremos los primeros 100 o hasta cuantos sean los que estén en nuestra tienda para empezar. Si metemos 100 aquí y le pego a “Guardar” y vuelvo a ejecutar esto, no vamos a conseguir 100 porque no hay 100 en total, pero vamos a conseguir hasta 100. Entonces creo que hay 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12 tablas de snowboard dentro de esta previsualización de hidrógeno. Voy a poner eso a nueve. Aviso hacer que nuestro sitio funcione más rápido, pero siempre podemos actualizar eso a cuantos necesitemos. En este video, lo que vamos a hacer es crear algo muy parecido a esto, así que crearemos otra grilla de productos, pero con esta ruta en particular, será una ruta dinámica. Así podremos ir a colecciones/ algo así como zapatos, ya que aquí tengo prellenados, y luego podemos ir a mirar una cuadrícula de productos que está filtrando solo a esa colección. Lo que haremos para esto es que volveremos a nuestro editor de código aquí e iremos a rutas aquí, y porque va a ser una Ruta Anidada, entonces va a ser colecciones y luego va a tener el nombre de la colección o el asa de la colección. Necesitamos crear una carpeta dentro de nuestra carpeta rutas aquí, llamarla colecciones, y luego aquí vamos a hacer algo que es un poco interesante. Vamos a poner en una ruta dinámica, vamos a poner en el mango como una variable y luego escribir server.jsx. Ahora lo que voy a hacer aquí es que voy a sacar toda esta información, básicamente copiar y pegar todo de esto de aquí a esto de aquí mismo, y luego por supuesto, voy a necesitar actualizar esto de catálogo a colección, y eso es todo lo que voy a hacer por ahora. A ver, aquí tenemos un problema. Tenemos que actualizar las bocanadas aquí arriba que llevan a nuestros componentes porque ahora estamos anidados en, como puedes ver aquí, otra carpeta dentro de nuestra ruta así que vamos a necesitar agregar punto, punto dash, otro conjunto de esos dos, ambos de estos para que podamos navegar al lugar correcto o ejecutar npm, ejecutar dev nuevamente. Entonces si nos refrescamos por aquí, deberíamos estar todos bien. Esa era una cosa que necesitábamos actualizar también antes de que pueda ejecutarse. Realmente la única diferencia aquí en esta ruta comparación con nuestra ruta de catálogo es que vamos a pasar por el asa y así obviamente vamos a necesitar usar esa información. Vamos a necesitar pasar eso a nuestra consulta aquí abajo y luego la consulta va a devolver solo los productos que son de esa colección. Pero esencialmente aquí en nuestro JSX, prácticamente no hay nada que actualizar. Lo que vamos a hacer para poder utilizar los parámetros de ruta, es introducir un nuevo gancho de Shopify hidrógeno, podría ponerlo aquí. UserOuteParams, es el nombre del componente y luego podemos usar este gancho para sacar el asa de los params de ruta, así que voy a usar la estructuración aquí, agarra el asa, que vendrá de UserOuteParams. Ahora para poder pasar esa variable, que maneja a través nuestra consulta usando el gancho UseShopQuery, voy a tener que agregar en mis variables aquí. Voy a abrir un objeto y después sólo voy a pasar por el mango. Ahora si me desplazo hacia abajo, puedo usar ese identificador dentro de nuestra consulta. ¿Cómo lo hacemos? En primer lugar, voy a cambiar el nombre de esta consulta a algo más apropiado. Voy a llamarlo collectionDetails y luego en nuestro título, queremos especificar que vamos a pasar por una cadena como identificador. Entonces en lugar de buscar productos, voy a usar el Comando X para cortar a eso, así eliminándolo de nuestra consulta para empezar, pero luego lo voy a pegar de nuevo más tarde. Ahora lo que tenemos que hacer es en realidad consultar para encontrar una colección, y la forma en que vamos a hacer eso es por su mango, así como esto. Entonces dentro de aquí, vamos a agarrar algunos detalles sobre esta colección, ld, título, descripción. Tomemos algo de información SEO también. Esa es una selección, así que dentro de esa selección, necesitamos agarrar la descripción y el título. Podríamos agarrar la imagen de la colección. No lo vamos a usar en esta clase en particular, eso es sólo un ejemplo. Pero podemos sacar cualquier información que necesitemos de ese objeto de colección, y luego voy a pegar ese código que teníamos antes. Podemos entonces sobre esa colección en particular. Encuentra los primeros nueve productos y luego usa esa misma información. Vamos a tratar de arreglar la sangría aquí un poco, eso fue inútil. Si le pego a “Guardar” en eso, corramos ahora. En realidad necesitamos saber qué es una colección en nuestra tienda así que para poder hacer eso, solo voy a entrar aquí y consultar nuestra tienda aquí mismo por las primeras nueve colecciones, y luego voy a escribir en nodos para acceder a cada nodo, y luego voy a buscar el asa. Esto es solo para ver qué asas están disponibles en la tienda en este momento. Así que aquí están todas las diferentes colecciones a través de sus asas. El primero nueve por lo menos, pero sólo hay 1, 2, 3, 4, 5, 6. Se trata de todas las colecciones dentro de esta tienda en particular. Ahora puedo ir por aquí, ir a colecciones, y luego poner en esa ruta dinámica pasando en el asa de la colección, voy a golpear enter en eso. Tenemos un error, entonces, ¿qué tenemos? cadena no es un tipo de entrada definido, así que volvamos a nuestra consulta por aquí y he escrito mal esto. Necesito poner esto como cadena con un signo de exclamación. Esto es solo un error de sintaxis de mi parte y luego si me refresco por aquí, ¿qué tenemos ahora? Nodos de lectura indefinidos. Esto está relacionado con la configuración que tengo aquí arriba, porque ahora nuestros nodos están anidados dentro de los productos, dentro de las colecciones, no solo de los productos. Vamos a comentar esto por un segundo y voy a registrar en consola los datos que se están devolviendo de la API, así que si me desplazo hasta aquí, verás que tenemos colección primero. Entonces vamos a necesitar actualizar eso. Cortemos esto como hicimos antes con la consulta, pongamos en colección y luego peguemos después de eso. Tenemos que poner en otro llaves rizadas y luego productos nodos. Ahora puedes ver que funciona. Esto obviamente se ve bastante similar a la página del catálogo, así que si queremos confirmar que esta es en realidad esa colección, lo que puedo hacer es ponernos en un h1 aquí y podemos agarrar el punto de recolección de datos. ¿A qué accedimos? ¿Título? Accidentalmente he vuelto a abrir dos llaves aquí. Solo necesitamos uno a cada lado, y luego si presiono “Guardar” en eso, refrescar por aquí, tengo otro error aquí. No lo he configurado correctamente, así que recopilación de datos, creo que tenemos que ir datos dos veces aquí, data.data.collection.title, y aquí puedes ver Colección Freestyle. Entonces si entro en ¿cuál era uno de los otros? De vuelta al país, así que si entro en el backcountry, ahora definitivamente podemos ver que la lista de productos que aparecen diferente, esta vez, definitivamente comparada con la colección freestyle. Ahora puedes ver que podemos pasar en el asa de recogida y devolver solo esa colección. Ahora esto es feo, así que vamos a limpiarlo un poco. Hagamos recopilación de datos, recolección de datos, y luego deberíamos poder simplemente sacar el título de la colección así, y probablemente podamos hacerlo aún más agradable poniendo eso aquí . Entonces esta estructuración a partir de la colección, gritos. Ahora solo necesitamos gritos, colección. A ver si eso funciona. Así que eso es un poco más agradable también. Pasé por eso un poco rápido, pero básicamente solo estoy estructurando lo suficiente a partir del objeto de datos para obtener la colección y luego verme, tengo ese objeto de colección ahora. Entonces estoy sacando los nodos de producto de eso ahora. Eso resulta en una desestructuración menos anidada y nos permite agarrar cosas como collection.title, y nodos de estos objetos aquí mismo. Entonces, debido a que ya creamos nuestro artículo de cuadrícula de productos y lo reciclamos , no hay mucho trabajo aquí por hacer. Lo que hemos hecho en este video comparado con el último es pasar por ese identificador así que obviamente este no tenía ningún identificador viniendo y acabamos de acceder a los productos en nuestra raíz de consulta. Ahora estamos accediendo a los productos de nuestra colección, y por supuesto necesitamos especificar qué colección buscamos. Lo hacemos a través del asa y averiguamos el mango a través de los parámetros de ruta, y solo significa que tenemos un nivel de anidación más profundo porque estamos buscando dentro de una colección, así que que nos obligó a actualizar nuestro objeto desestructurando aquí arriba. Pero por lo demás ahora tenemos las páginas de colección establecidas en nuestra tienda. Entonces en el siguiente video, lo que vamos a hacer es crear nuestra página de producto ahora, para que en realidad podamos, cuando hacemos clic en estos artículos, entrar en cada uno de estos productos. 10. Construyendo una página de productos: En los dos últimos videos, configuramos nuestra cuadrícula de productos dentro de esta página del catálogo, que devuelve todos los productos dentro de nuestra tienda. Entonces nuestra ruta de recolección individual, que es una ruta dinámica que podemos pasar por el asa de cualquier colección que queramos cargar. Pido disculpas por la lenta velocidad de conexión aquí. Pero aquí tienes. Aquí está nuestra colección de estilo libre. Pero como puedes ver cuando hacemos clic en alguno de estos, no están enlazando a ninguna página de producto individual, porque aún no lo hemos construido. Eso es lo que haremos en este video. En el video siguiente, crearemos la funcionalidad del carrito. En los dos siguientes videos, podríamos ver aumentar un poco la complejidad porque las dos partes más grandes de la interactividad, se podría decir, dentro de un sitio web de Shopify suelen ser la selección de variantes y las funcionalidad de carrito. Estas son las áreas de nuestro sitio Shopify que solemos querer actualizar instantáneamente administrando el estado en el front end. Por suerte para nosotros estamos usando React y estamos usando Shopify Hydrogen. Toda esa funcionalidad asincrónica va a venir de forma natural a esta plataforma. Es uno de los beneficios de usar React e Hydrogen. Pero va a significar que vamos a usar algunos proveedores más y algunos ganchos más para que esa funcionalidad funcione. Pero como verás, después de que revisemos esto, comenzarás a ver que hay tantos componentes y ganchos en el Hidrógeno que nos están permitiendo hacer esto. Será bastante sencillo una vez que lo rodees de cabeza. Antes de que construyamos esta página de producto, voy a actualizar nuestros enlaces aquí arriba porque ahora tenemos una página de catálogo y una página de colección. Voy a repasar a nuestro componente de diseño, y luego en el primer enlace, lo voy a vincular a nuestro Catálogo. El segundo enlace, voy a vincular eso a colecciones Freestyle. Bien podría hacer éste, Freestyle. Si presiono “Guardar” en eso y se actualizará por aquí, ahora verá que podemos navegar a nuestro Catálogo a través de nuestra navegación de encabezado, y podemos navegar directamente a esa Colección Freestyle a través de nuestra navegación de cabecera también. Vamos a crear esta ruta de productos. Al igual que hicimos para las colecciones, vamos a crear una ruta dinámica, pero tenemos que anidarla dentro de nuestra carpeta de productos. Entonces aquí dentro, voy a hacer el mismo título que antes, handle.server.jsx. Entonces como suelo hacer, exportemos un componente de inmediato. Solo voy a llamar a este Producto y luego una declaración de devolución aquí para nuestro jsx. No le gusta que haga eso. Siempre tienes que poner algo de jsx en el medio aquí, lo contrario se asusta Vamos a poner algunos jsx aquí. De esa manera no impedirá que nuestro servidor ejecute npm run dev. Porque antes de comenzar a construir este componente, lo que quiero hacer es comenzar a probar algunas consultas GraphQL aquí mismo. En lugar de consultar productos, hagamos un producto de consulta. Entonces para apuntar a un producto específico, vamos a hacer lo mismo que antes con las colecciones. Voy a especificar que vamos a pasar en un identificador y el tipo va a ser una cadena. Vamos a noquear estas cosas de aquí. Entonces lo que voy a hacer es agarrar un producto a través de su asa. El identificador se va a pasar en las variables de nuestro gancho UseShopQuery, tal como lo hicimos para la recolección. Ahora una vez que determinemos el producto, voy a devolver el título del producto. ¿Qué más necesitamos? Descripción, HTML, y luego vamos a querer devolver la imagen del producto. Podemos pasar por los medios de comunicación. Los medios pueden ser modelos 3D , pueden ser imágenes, pueden ser videos. Pero para que sea realmente simple para esta clase, solo vamos a manejar imágenes. Voy a abrir los medios aquí. También para que sea simple, solo vamos a mostrar una imagen de producto. Sólo voy a seleccionar el primer bit de medios. En esta tienda Shopify en particular, podemos dar fe de que el primer medio va a ser una imagen de producto. De lo contrario, tal vez nos gustaría buscar múltiples medios y luego asegurarnos de que estamos encontrando una imagen fuera de esta lista de medios. Pero creo que es bastante seguro asumir que la primera parte de los medios va a ser una imagen. Continuando con esa suposición, voy a abrir nodos aquí. Entonces para los campos mediáticos, nuevamente, esto es asumir que es una imagen. Si quisieras que esto funcionara con todo tipo de medios, tendrías que hacer lo que te mostré en una de las lecciones de teoría, que era tener esos tres puntos y decir en MediaImage. En realidad sigamos haciendo eso. Si es un MediaImage, va a devolver esta selección, ID, y luego la propia imagen con la URL, ancho y alto. Nuevamente, sólo vamos a estar tratando con imágenes mediáticas en esta clase en particular. Pero si quisiéramos tener una selección diferente en función de si es video, solo podemos ir a Video y luego poner nuestra selección para videos. Lo haces en las fuentes. Esto es igual que el ejemplo que vimos anteriormente en la documentación de Shopify. Pero para que esta clase la mantenga simple, solo voy a asumir que solo estamos mirando imágenes, que creo en este escaparate de hidrógeno en particular. No sé si hay algún modelo 3D o videos de todos modos. Es una suposición bastante segura para hacer aquí. Entonces vamos a ejecutar eso para empezar. En realidad, tenemos que pasar por una variable aquí, así que probablemente no va a funcionar. No tenemos una variable. A lo mejor quiero jugar con eso aquí porque en realidad no tenemos un control del trabajo con, pero vamos a agarrar esto, y pongamos esto en una consulta aquí. Si se rompe, se romperá dentro nuestra aplicación y solo lo probaremos aquí. Haremos gql para albergar nuestra consulta. Entonces lo pondremos ahí. Entonces por supuesto tenemos que importar, useShopQuery que todo gancho importante de Hidrógeno. También necesitamos gql. Entonces si vamos a usar CacheLong, agarra también a CacheLong. Entonces aquí dentro, vamos a hacer un const data. No lo vamos a desestructurar todavía. Después usaremos ShopQuery. Haremos la consulta como la consulta constante que hemos enumerado aquí abajo. Cache será CacheLong, igual que antes. Después pasaremos en las variables de handle. Cómo vamos a pasar en el asa, vamos a tener que volver a usar los parámetros de ruta. Voy a agarrar UserOuteParams. Estoy corriendo por esto bastante rápido porque este es el mismo patrón que hicimos para la colección también. Sólo vamos a sacar el mango const del gancho de UserOuteParams. Entonces si no especificamos handle aquí, podemos escribir la forma corta de solo manejar. Obviamente tenemos un poco de error aquí que ha provocado que nuestro servidor se detenga. Pero vamos a registrar estos datos en la consola y ver si tenemos algún problema con nuestro código en este momento. Eso se ve bien. Ahora todavía vamos a necesitar pasar por un asa, así que vamos a construir eso en nuestros productosGridItem. Voy a introducir otro componente aquí arriba del hidrógeno, el componente de enlace, y voy a transformar esto de un div en un componente de enlace de Shopify. Entonces aquí dentro, voy a hacer para, agarrar el producto, e ir a su URL. En realidad, antes de hacer eso, voy a necesitar poner en los productos anteriores parte de ese camino. Vamos a pegarle a ahorrar en eso. Si volvemos a aquí, y vamos a ir a esa colección de estilo libre o cualquier página de colección o página catálogo donde ProductGridItem esté en uso. Ahora nuestras imágenes están actualmente enlazadas. Si inspeccionamos alguno de estos, se puede ver que se dirige a undefined. Eso no va a funcionar [Risas] indefinido. Tenemos que averiguar cuál es el tema ahí. URL del producto. Quizá no lo solicitamos. Vayamos al catálogo. No vamos a usar la URL, vamos a usar el identificador. Así es como vamos a construir la URL. Refresca por aquí y luego echa un vistazo aquí. Se puede ver que el snowboard es el asa de esa. El asa para este es mail-it-in-freestyle-snowboard. Nombres interesantes aquí. Si vamos aquí, podemos ir a esa ruta en particular. Actualmente, no hay nada que surja en la parte delantera. Volvamos a nuestro código por aquí, y por supuesto, nos registramos en consola a los datos. Aquí puedes ver, y voy a ampliar esto para que veas más fácil, vemos lo que se devuelve de la API de Storefront. Parece que nuestra consulta ha funcionado, hemos pasado en el identificador, y hemos vuelto el título y la descripción HTML, y un objeto que contiene los medios. Tendremos que profundizar en ese objeto si queremos ver qué hay dentro. Ahora solo voy a agregar también la información de variante a esta consulta porque definitivamente vamos a necesitar usarla para poder hacer la selección de variantes una vez que lleguemos a ella. Voy a intentar agarrar todas las variantes. Creo que el número total de variantes que puedes hacer en una tienda Shopify es de 100 de todos modos. Voy a intentar agarrar toda la varianza usando el argumento de los primeros 100. Entonces eso obviamente va a devolver una lista de nodos. Dentro de nodos, voy a agarrar el ID de variante y un montón de otras propiedades que nos van a ayudar. Vamos a necesitar agarrar el PriceV2. Entonces claro que es una selección, así que vamos a necesitar agarrar el monto y el CurrencyCode. Tomemos también el CompareAtPriceV2. Lo mismo otra vez, cantidad, CurrencyCode. Si quisiéramos, podemos tomar la imagen variante, pero solo vamos a usar la única imagen que existe en el producto para esta clase en particular. Pero una cosa que necesitamos traer en que va a ser esencial para averiguar qué variante se está seleccionando es SelectedOptions, para que podamos agarrar el nombre y el valor. Creo que eso es todo por ahora. Si recargamos por aquí, como pueden ver, solo dice objeto. Echemos un vistazo al interior de la varianza de datos. Todo lo que hacemos, tenemos que anidar. Ahora necesitamos entrar en el producto de datos.variantes. Actualicemos la página por aquí. Aquí tenemos un error indefinido en las variantes. Echemos un vistazo. Datos, producto, varianza. Producto está volviendo indefinido, lo cual es interesante. Volver a los datos de inicio de sesión de la consola. Voy a dejar esto en la clase para que ustedes vean cómo depurar. Si no sabe lo que está pasando en los datos, siempre puede simplemente registrarlo en la consola y luego puede averiguar cómo hacer su desestructuración y acceder a diferentes partes de los datos que obtienen regresaron. Como puedes ver aquí, tenemos un objeto de datos. Creo que necesito escribir de nuevo los datos. Datos, datos, producto.variantes. Aquí pueden ver eso es lo que necesitaba hacer. Aquí vamos. Si bajamos aquí, podemos ver la lista de nodos variantes y se puede ver el ID de escaparate de esa variante, el precio como un objeto, y las opciones seleccionadas como un array. Si quisiéramos profundizar aún más en eso, ir a la primera variante, así que vamos a los nodos, el primer nodo que viene a través de esa matriz de variantes, y luego entrar en selectedOptions sólo para echar un vistazo al interior. Como puedes ver aquí, para esta variante en particular, el tamaño de 154 cm, y el color de la sintaxis. Esto es lo que vamos a necesitar saber para poder determinar la variante. Básicamente lo que tenemos que hacer aquí chicos es sacar el producto de estos datos aquí mismo. O puedo desestructurar aquí abajo como lo hice antes y hacer esto fuera de los datos. O puedo ahorrar algo de espacio y mover esto aquí arriba, lo que hace que parezca un poco más complicado, pero es un poco más limpio. Así es como lo verás en los ejemplos de Shopify también. Ahora deberíamos tener acceso a ese producto si estamos pasando por un asa correcta. Entonces lo que puedo hacer aquí es product.title. Entonces si nos refrescamos por aquí, todavía no viene a través. ¿Qué estamos haciendo mal aquí? Nada está pasando en este div, lo cual es interesante. Echemos un vistazo a nuestros objetos de producto. Si actualizo, puedes ver el título del producto aquí. Yo creo que en realidad podría estar anidado. Product.product.title. Sí, y eso funciona. Eso es un poco funky, ¿no? Hagamos datos. Uy. Vamos a limpiar esto un poco. Datos, producto de datos. Entonces ahora deberíamos poder eliminar uno de esos productos. No, tampoco le gusta eso. Voy a hacer productos, y ahí lo tenemos. Necesitábamos actualizar nuestra desestructuración aquí para obtener ese objeto de producto. Pero ahora tenemos ese objeto producto, podemos empezar a usarlo aquí mismo. Ahora una cosa que notarás es que hemos perdido nuestro diseño, así que vamos a actualizar eso. Queremos poner en nuestro componente de diseño aquí y anidar esto dentro. Demos también a esta página de producto alguna información SEO. Voy a agarrar el componente SEO. Dentro del layout porque estamos consultando la base de datos o consultando la API de Storefront para obtener la información SEO, voy a envolverla en suspenso. Necesitamos importar suspenso de React. Entonces dentro de aquí, el componente SEO. Para ello, solo necesitamos escribir el tipo de producto y luego simplemente pasar el producto como el objeto de datos. El componente SEO hará el resto del trabajo por nosotros. Entonces aquí abajo, voy a darle a esto un nombre de clase de producto-página y contenedor que se alinearía con nuestro CSS predeterminado. Otra área aquí, el diseño no está definido. Fresco. En realidad, vamos a ponerlo aquí abajo porque es nuestro propio componente. Importe el diseño y ya está prellenado el resto para nosotros. Hermoso. Ahí vas. Ya tenemos nuestro diseño de encabezado, y así que si voy a cualquiera de los productos en alguna de las colecciones y hago clic en ellos, verás que irá a ese identificador, y luego cargará ese producto información. En este momento solo estamos usando el título. De hecho, construyamos esta página de producto un poco más. Para ello, con el fin de desacoplar esta consulta de la API de Storefront dentro del componente de servidor, voy a crear un componente cliente para mantener nuestra página de producto. Esto probablemente va a ser un video un poco más largo porque hay mucho código para pasar por aquí. Pero vamos a limpiar esto un poco aquí. Definitivamente vamos a querer echar un vistazo a esto, pero luego también vamos a querer crear nuestro componente productDetails aquí, client.jsx. Entonces otra vez, como hago cuando inicio cada componente, exportar función predeterminada, nombre del componente, lo llamaremos detalles del producto. Por supuesto vamos a pasar los datos del producto como una de sus indicaciones. Entonces claro que vamos a devolver alguna forma de jsx. Asegúrate de no guardar sin nada aquí de lo contrario, va a equivocarse. En esa nota, vamos a crear un div para evitar esa situación. Al igual que lo hicimos antes, ahí pondré el título del producto. Entonces en vez de esto, lo que voy a hacer es importar ProductDetails desde esa dirección. Entonces reemplazaré esto con productDetails y luego pasaré el producto como un prop. Ahí vamos. Si le pego a guardar en eso, refrescar por aquí. Otro error. este error sin contexto de localización disponible aquí, que es complicado de depurar. Lo que encontré fue que solo tenía que usar Yarn para borrar el caché. Esto es lo que mencionaba antes sobre Yarn. Inicialmente estaba usando npm run dev cada vez, pero luego instalé Yarn porque terminó siendo la única forma de sortear este problema y así que en su lugar vamos a cerrar el servidor que solo lo hice y luego voy a ejecutar yarn dev —force. Eso va a volver a ejecutar nuestro servidor, y como puedes ver ahora está funcionando. Eso es solo una extraña peculiaridad dentro del desarrollo de Shopify Hydrogen. Si alguna vez vuelves a tener un error extraño como ese y no puedes entender lo que está pasando da este comando hace, yarn dev —force. Obviamente en este caso ha funcionado y podemos seguir adelante. Lo que estaba tratando de mostrarte antes de que surgiera ese error es que ahora hemos movido ese dev con el título del producto a su propio componente y luego lo reemplazamos con la referencia a los componentes. Ahora bien, si le echamos un vistazo en nuestro navegador, se ve exactamente igual. Pero la razón por la que queremos trasladar esto a su propio componente está relacionada con la renderización del lado del servidor y del lado del cliente. Como dice en la documentación si miro por aquí a la descripción general de React Server Cponents en la documentación y me desplazo hacia abajo, puedes ver aquí que deberíamos usar componentes de servidor cuando haciendo llamadas a la API de escaparate y generalmente deberíamos usar componentes de cliente cuando estamos haciendo interactividad con estado del lado del cliente. Por eso ahora vamos a romper los detalles del producto. Deberíamos de todos modos, solo para que sea un código más limpio, pero esto quizás explique más por qué estamos usando un componente del lado del cliente aquí arriba. Estamos viendo nuestro primer componente del lado del cliente en la clase hasta el momento. Vayamos por aquí. Para ampliar esta página del producto voy a importar muchas cosas de Shopify Hydrogen, así que comencemos de inmediato. Voy a importar algunos proveedores y ganchos aquí eso nos va a permitir hacer selección de variantes mucho más fácilmente. Yo solo voy a poner en el camino al hidrógeno aquí primero, y luego voy a romper las llaves así porque va a haber un poco de una lista aquí que vamos a importar. Primero que nada quieres el ProductOptionsProvider, luego dentro de eso vamos a usar el gancho UseProductOptions y luego vamos a renderizar una imagen obviamente; ProductPrice que es muy similar al componente dinero pero está relacionado específicamente con ProductPrice. Luego el botón Agregar al carrito que quizás no utilicemos en esta lección, pero probablemente en la siguiente lección cuando comenzamos a incorporar la funcionalidad del carrito. Ahora en lugar de lo que tenemos aquí, voy a envolver todos los detalles del producto en el ProductoPtionsProvider. Este proveedor nos va a dar alguna funcionalidad clave respecto al cambio de variantes, y debido a que esto puede afectar a todo incluyendo la imagen del producto teóricamente voy a poner eso como el componente de nivel superior. Para que esto funcione, solo necesitamos pasar el producto como el prop de datos. Aquí voy a crear una imagen y solo necesitamos pasar los datos exactamente donde vive esa imagen. Vamos console.log aquí arriba para que podamos averiguar cómo navegar hasta donde vive esa información de imagen. Voy a console.log el objeto de producto que se pasa a través y a productDetails. aquí mismo voy a quitar eso de lo contrario probablemente va a haber un error. Ahora cambiemos a nuestro lado del cliente para poder leer nuestro console.log. Debido a que este es un componente del lado del cliente, ahora vemos los registros de la consola en nuestro navegador en el lado del cliente en lugar aquí en nuestra terminal en el lado del servicio, así que eso es algo a tener en cuenta. Si estamos trabajando con componentes del lado del servidor, cualquier registro de consola ocurrirá aquí. Si estamos en componentes del lado del cliente, cualquier registro de consola ocurrirá en nuestro lado del cliente, en nuestro navegador. Aquí tenemos un error porque no estamos poniendo nada en la imagen, pero esencialmente todavía tenemos el registro de la consola llegando a través. Si entramos en nodos de medios y luego entramos en esta imagen aquí, este objeto debería ser todo lo que requiere para que la imagen funcione. Echemos un vistazo. Vamos a los nodos de medios de producto; al primer nodo, y luego a la imagen. Hagamos eso, data= {products.media nodes [0]; tomaremos el primero de los nodos, y entonces.image}. Voy a presionar “Guardar” en esa actualización aquí y veamos qué pasa. El prop de datos debe tener la propiedad alt texts. Eso no me gusta, echemos un vistazo. A lo mejor solo necesitamos pasar el alt como dice aquí, así que bajemos a nuestra imagen y hagamos Alt Text aquí. Echemos un vistazo dentro de nuestra imagen principal de elementos. Se está renderizando, pero es un gigante enloqueciendo. Parecía que no estaba apareciendo, pero en realidad está apareciendo. Sólo tengo que poner aquí un nombre de clase para que se comporte, así que voy a hacer className. Nuevamente haciendo referencia al CSS que ya he creado para ti va a ser product-page-image, y luego ahora puedes ver que está muy bien en el lado ahí. Nuevamente, esto es asumir que solo estamos usando imágenes para nuestros medios de producto. Esto esencialmente se descompondría si alguien estuviera usando video o modelos 3D en sus medios de producto. Solo tenlo en cuenta, esta es una versión simplificada para el propósito de esta clase básica sobre Shopify Hydrogen. Vamos ahora dentro de este productoPtionsProvide componente puesto en un segundo componente, y aquí es donde voy a poner en mi formulario de producto. Vamos a crearlo primero. Esta es la primera vez que vamos a ver dos componentes en un archivo. No necesitamos exportarlo porque lo estamos usando directamente en este archivo, así que voy a llamar a este formulario de producto único. Hagamos un retorno con un div aquí para que toda la aplicación no se rompa solo como marcador de posición. Entonces lo que quiero hacer es en realidad quiero asegurarme de que estoy pasando por un producto como accesorio, y luego puedo agarrar componentes de ProductForm que acabamos de definir ahí abajo. Hagámoslo de cierre automático así, y luego puedo pasar por ese producto como el prop del producto. Entonces igual que antes, sólo voy a poner products.title aquí. Vamos a correr eso, a ver si funciona. Ahora tienes la imagen de los productos y el título aquí. Ahora anidado dentro de este componente ProductForm va a ser el gancho UseProductOptions. Dentro de aquí es donde vamos a empezar a crear nuestra funcionalidad de selección de variantes. Justo aquí; y esta es probablemente la parte más complicada del video así que tengan cuidado conmigo chicos, voy a sacar algunas cosas de este gancho; usoProductOptions, y este usoProductOptions es el gancho para administrar el estado de qué opciones se seleccionan y por lo tanto qué variante se selecciona de esas opciones. Lo que podemos hacer es sacar las opciones, podemos sacar el selectedVariant, podemos sacar las selectedOptions, y podemos sacar el método setSelectedOption. Es más fácil para ustedes leer, vamos a anidarlo así. Estamos agarrando todo esto desde el gancho useProductOptions, y luego aquí lo que voy a hacer es comenzar con un div pero voy a poner el título como h1 y luego debajo eso estoy va a utilizar ese componente ProductPrice, así que voy a agarrar el ProductPrice, darle un nombre de clase de producto-página-precio. Para CSS voy a pasar sin ceros finales como lo hicimos antes. Vamos a desglosar esto en múltiples líneas para ustedes. Sin ceros finales, voy a pasar en el objeto producto como el prop de datos y luego también voy a pasar en el ID de variante. Esto es importante porque el ProductPrice podría cambiar en función del ID de variante seleccionado y de hecho podemos tomar el ID de variante seleccionado de esta manera. Esto es realmente genial. Estamos agarrando esto que es una variable en este objeto de estado, así que esto en realidad se va a actualizar a medida que se actualiza en función de nuestra selección. Ese es el poder de usar este gancho, y ese es el estado del que estábamos hablando en este componente en particular que vamos a usar. Empezarás a ver esto funcionando en tan solo un segundo. Si me refresco por aquí, pueden ver que tenemos un precio subiendo por aquí. En realidad no tiene ceros finales, modo que sin ceros finales no está funcionando en esta página en particular sino para cualquier página que tenga dos ceros; dos ceros finales, eliminará esos pero como puedes ver aquí el precio sí viene a través. De nuevo, mi mala conexión a Internet está haciendo esta carga lentamente. Situación de Internet ordenada por el momento, perdón por eso. Ahí vas. Tenemos nuestro precio llegando justo ahí. Una buena idea sería obviamente crear otro productoPrice aquí y hacer lo que hicimos en ProductGridItem en términos de si es descontado mostrar el Comparar al precio también. Pero ya te he enseñado cómo hacer eso, así que deberías poder averiguarlo tú mismo. En aras del tiempo y asegurándonos de que esta lección no sea demasiado larga, sigamos adelante con la parte más importante que es el propio ProductForm. Lo que vas a ver aquí es que voy a anidar otra declaración return, así que esto va a estar basado en una matriz y esta sección vamos a alojar en un div con la clase de ProductOptions. Entonces aquí vamos a acceder a todas las opciones para crear nuestro formulario de producto. Vamos a usar mapa otra vez, vamos a tomar cada una de las opciones. Vamos a usar la estructuración para tomar el nombre y los valores de cada opción. Entonces vamos a crear una vuelta completa aquí, solo vamos a tener que añadir un soporte ahí. Entonces esto no se rompe y quita eso. Solo necesita mover esto aquí para abordar ese error. Ahí vamos. Las líneas onduladas rojas se han ido. Entonces lo que vamos a hacer es poner una declaración if aquí por si acaso solo hay un valor, en cuyo caso no hay opción para la selección. Si hay uno, sólo vamos a devolver nulo. Esto es solo un respaldo en caso de que no haya múltiples valores, en cuyo caso no tiene sentido seleccionar de opciones si solo hay una opción. Entonces si ese no es el caso, entonces vamos a devolver otro conjunto de JSX. Voy a tratar de hacer esto paso a paso como sea posible. Así que primero vamos a crear un grupo de opciones de producto para cada grupo de grupo de opciones de producto. Voy a poner aquí una llave porque es un requisito de reaccionar. Podemos usar el nombre aquí como la clave y luego voy a poner en un elementos de elegancia aquí con la clase de productos opción dash name, y luego puedo poner en el nombre de la opción. Dejémoslo ahí por ahora y echemos un vistazo. Como puedes ver, lo que vamos a recuperar es la lista de diferentes opciones. Si voy a mi catálogo aquí y voy a, creo que es este con la mayor cantidad de opciones. Puedes ver al momento de enumerar todas las diferentes opciones. Pero lo que aún no estamos enumerando son los valores. Vamos a pasar por eso ahora mismo. En este siguiente bit aquí, vamos a anidar otra declaración de retorno. Aquí es donde estoy diciendo que está empezando a verse un poco funky aquí. Aquí hay mucha anidación. Es solo la naturaleza de la bestia desafortunadamente. Vamos a usar otro mapa aquí para pasar nuestros valores a algunos JSX para mostrarlos. Voy a agarrar el valor, abrir esto, y luego pondré algún código antes de la declaración return. Pero solo para comenzar, solo para conseguir algo en la página, abriré mis devoluciones enseguida. Aquí es donde voy a poner en un div con una clase de productos valor de opción, y dentro de aquí es donde voy a poner un botón de radio. Haremos tipo de radio. Nombre va a ser igual al nombre de la opción. Entonces claro que queremos registrar el valor. Actualmente estamos recorriendo todos los valores para que podamos pasar el valor que estamos viendo actualmente y luego vamos a pasar por el método onChange. Esto es cuando comenzamos a usar el método de opción de conjuntos conferenciados que agarramos del gancho de opciones de productos de uso. Ahora voy a poner en un conjunto de funciones anónimas opción seleccionada, análisis, nombre y valor y cerrar ese elemento de entrada. Ahora veamos si obtenemos algún error. No está completamente completo, pero quería mostrarles lo que tenemos hasta ahora. Tenemos algo de espacio aquí, pero no pasa nada. Echemos un vistazo. Tenemos la leyenda y luego tenemos una entrada para cada una de ellas. Oh, se me olvidó poner la etiqueta aquí. La razón por la que estas entradas que he anidado dentro estos divs es para que podamos poner una etiqueta, que es una apariencia más agradable para la entrada en que es una apariencia más agradable para lugar de tener esos feos botones de radio. Aquí es solo una cosa HTML. Voy a crear esta etiqueta y luego voy a poner el valor aquí para que podamos ver realmente qué valor estamos seleccionando. Como puede ver, los valores se están cruzando ahora. Al pasar el cursor sobre cada opción, hay una línea que viene por debajo. Como estoy haciendo clic en estos ahora mismo, la opción de selección de conjunto debería estar funcionando. Simplemente no estamos recibiendo comentarios visuales en nuestro formulario. Para conseguirlo, lo que vamos a hacer es crear una variable aquí arriba llamada check y vamos a acceder al objeto al que aún no hemos accedido. Vamos a acceder a esto que aún no hemos usado, opciones seleccionadas. Si, cuando pasamos el nombre a Opciones seleccionadas, es igual al valor que estamos viendo actualmente, entonces comprobado será verdadero. Ahora solo tenemos que pasarlo a nuestra entrada aquí. Comprobado es igual al valor de ese. Golpea “Guardar” en eso. Ahora puedes ver en realidad todavía no funciona porque tenemos una cosa más que hacer aquí, y eso es lo que creó nuestro id Vamos a hacer const ID. Vamos a crear una pequeña cadena aquí con el nombre y el valor. Entonces podemos poner eso tanto aquí como luego también en la etiqueta, poner HTML para ID, y eso vinculará nuestra etiqueta a nuestra entrada. Esto debería ser todo lo que se requiere para funcionar. Ahora bien, si hago clic en alguno de estos, bien. No está funcionando todavía. ¿Qué tenemos pasando aquí? Cada niño en la lista debe tener un elemento clave único. A lo mejor ese es el problema que tenemos aquí. Aquí mismo, usemos ese id recién creado como nuestro prop clave aquí. Golpea “Guardar” en eso. Refresca por aquí. Todavía no podemos cambiar nuestras opciones aquí. Aquí tenemos un error relacionado con lo que nos encontramos dos niños con la misma clave. Echemos un vistazo. Se me olvidó poner entre mis corchetes aquí. Es literalmente poner en valor de signo de dólar. No es un valor dinámico. Como puedes ver aquí, ya puedes ver ahora que se está guardando una selección diferente. Ojalá eso no fuera demasiado difícil de seguir. Como pueden ver aquí como cambio varianza, la imagen no está cambiando, pero el precio es así que el uso de opciones de producto enganchar aquí, en realidad está administrando nuestro estado para nosotros, lo cual es realmente genial. Cada vez que estamos creando una nueva selección aquí, estamos seleccionando una nueva variante y que está actualizando automáticamente nuestro precio y cualquier otra cosa que esté relacionada con la varianza en nuestra página. Lo único que nos falta aquí, solo para rematarlo antes de pasar a la página del carrito es la descripción aquí. Lo que voy a hacer es crear un div con la clase de descripción del producto. En lugar de insertar HTML ahí, lo que voy a hacer es escribir este accesorio de aspecto muy extraño aquí llamado peligrosamente establecido en un HTML y luego aquí para subrayar, subrayar HTML y luego poner en nuestra descripción HTML para el producto. Descripción HTML. Cerremos esto para que podamos echar un vistazo. Entonces como pueden ver, aquí está nuestra descripción. Ahora bien, ¿por qué lo hemos puesto en este prop y no solo, vamos a eliminar todo eso y luego tirarlo aquí? Bueno, echemos un vistazo a lo que sucede cuando hacemos eso. Voy a presionar “Guardar” y como pueden ver, pone a través del HTML literal. Necesitamos realmente insertar ese HTML a través de un prop para renderizar. La razón por la que el prop se llama peligrosamente establecido en HTML en lugar de solo en un HTML, es que es un recordatorio de reaccionar para tener mucho cuidado al insertar HTML en un elemento que viene de una base de datos o de una fuente externa. La razón por la cual es algo llamado inyección HTML. Alguien podría romper tu página poniendo aquí HTML incorrecto. Entonces es una advertencia de React para hacerte saber que esto es un poco peligroso. Pero en nuestra situación cuando estamos insertando HTML de descripción del producto, siempre y cuando nosotros, los usuarios o los administradores no pongamos ningún HTML roto en ningún HTML roto en nuestro campo de descripción del producto, esto debería funcionar. Pero si el cliente o el administrador o quien esté agregando descripciones a los productos pone algún HTML roto, entonces esto se va a romper. Todo esto sí tiene el potencial de romperse. Por eso dice peligrosamente establecido en HTML. Eso es algo a tener en cuenta ahí. Eso es un poco de riesgo. Este ha sido uno grande. Espero que hayas seguido. Si te quedas atascado en algún momento, obviamente deja un comentario. Pero ahora si vamos a algún producto en una tienda, algunos de estos son menos complicados. Este solo tiene una opción. Podemos seleccionar solo una talla. Pero este de aquí mismo, los hidrógenos snowboard, creo que es el más complejo. Tiene tamaño, montura de encuadernación y material. Veremos en el siguiente video cuando agreguemos el botón “Agregar al carrito”, que al hacer clic en ese botón “Agregar al carrito”, la variante ya está determinada a partir de nuestra selección, y así esa variante obtendrá añadido al carrito. Así que gracias por seguir adelante en este video. En el siguiente video, vamos a hacer la mayor parte de nuestra aplicación, que es la funcionalidad del carrito. Básicamente la tienda no funciona hasta que tengamos una funcionalidad de carrito por lo que esta será la parte final de hacer que nuestra tienda funcione. Tal vez tómese un descanso, prepárese y regrese para la lección final antes de implementar nuestra aplicación en nuestra tienda Shopify. 11. Carrito Funcionalidad pt. 1: Muy bien chicos, es hora de la parte final y más esencial de conseguir que esta tienda funcione. Esta tienda simple, obviamente hay un montón de mejoras que puedes hacer aquí, pero para conseguir una tienda básica que funcione, hay una cosa más que tenemos que hacer y es habilitar el carrito funcionalidad. En este video vamos a extendernos a través de muchos componentes diferentes aquí. Vamos a actualizar nuestro componente de aplicación, actualizar nuestros componentes de diseño para poner en un botón de carrito aquí, actualizar nuestra página de producto aquí para poner en un botón de agregar al carrito y crear una página de carrito. Sin más preámbulos, comencemos. Tal vez tengamos que dividirlo en dos videos dependiendo de cuánto tiempo llegue esto. Pero lo primero, como mencioné, voy a abrir aquí nuestro archivo app.server.js. Para obtener la funcionalidad del carrito en nuestra aplicación, necesitamos agarrar el componente proveedor de carritos y luego queremos envolver nuestro enrutador en eso. Voy a ir a la cesta de eso. Todavía está en el portapapeles, colóquelo allí en nuestro proveedor de carritos y luego vuelva a pegar en ese enrutador entre las etiquetas del proveedor del carrito. Voy a golpear “Guardar” en eso. Ahora, así como así, vamos a poder usar los ganchos y funciones del carrito dentro de nuestra app. Vamos a entrar en nuestro explorador de archivos aquí y vamos a crear una nueva ruta para la página del carrito. Aquí ahora carpeta rutas, cart.server.jsx. En el tutorial oficial de Shopify, usan un cajón para esto, pero es traer bibliotecas externas y pegar mucho código. Definitivamente recomiendo tener un cajón como característica de diseño, experiencia de usuario sabia, pero para que sea simple y enfocarnos en lo que necesitamos para que esto funcione, solo vamos a hacer un página separada. Al igual que los detalles del producto, vamos a abrir una ruta aquí y luego servir a través de componentes del lado del cliente. Este archivo será bastante sencillo. Sólo vamos a exportar carrito de funciones por defecto, y luego aquí regresamos, y luego vamos a envolver todo en un componente de diseño. Voy a abrir un div con una clase de contenedor, así que todo está contenido, y luego voy a traer un componente del lado del cliente que estoy a punto de construir la página del carrito de código. Eso es básicamente. Todo lo que necesitamos ahora son nuestras importaciones. Vamos a importar layout desde componentes/servidor de layout. Tenemos un layout ahí, y luego vamos a tener que crear estos componentes, así que voy a crear un componente llamado CartPage.Client.jsx. Entonces podemos crear un componente aquí, exportar por defecto la función carritos página, return, un div básico para empezar, y luego podemos importar eso. Importar la página del carrito y el resto está prellenado para nosotros desde el código de Visual Studio. Escribimos un montón de código ahí, todas las cosas básicas, todas las cosas que hemos hecho antes, veamos si realmente funcionó. Si voy a mi ruta de carrito aquí, si miramos dentro de nuestros elementos aquí, vamos a principal, podemos ver hay un contenedor con un div dentro. Podemos adivinar que esto está funcionando y estamos en esta ruta en particular. Eso es todo lo que tenemos que hacer para nuestra ruta de carritos. Todo el trabajo que vamos a hacer para la página del carrito va a estar en este componente del lado del cliente. Al igual que el componente de detalles del producto, vamos a tener que importar muchos componentes y ganchos diferentes de hidrógenos Shopify. Voy a hacer lo que hicimos antes, dividirlo en múltiples líneas, y poner el de listo para comenzar. Sólo voy a pasar por todos los ganchos y componentes que vamos a estar trayendo, así que vamos a necesitar usar el gancho de carrito de uso. Vamos a usar un componente de proveedor llamado proveedor de línea de carrito, vamos a traer el componente de imagen para mostrar una imagen, vamos a traer el gancho de línea de carrito de uso, estamos va a traer el componente de dinero para formatear dinero, vamos a traer el componente de enlace para enlazar al producto, vamos a traer en el componente de costos de carrito. Como dije chicos, aquí hay mucho. Vamos a traer el componente de cantidad de línea de carrito, y finalmente vamos a traer el componente de botón de ajuste de cantidad de línea de carrito. No mentía cuando dije que hay una amplia gama de componentes dentro de Shopify hidrógeno, pero también tienen un propósito y nos hacen la vida más fácil. Confía en mí en eso, serás feliz una vez que empecemos a desarrollar esta página de que todo esto existe. Ahora, lo que quiero hacer es romper esta página de carrito en múltiples componentes. Lo que voy a hacer es que voy a crear un suspenso aquí. Se puede ver que se importa automáticamente de react para nosotros, y luego dentro de aquí, voy a dar salida a la tabla de carritos, que aún no hemos creado. Vamos a crear eso ahora. No necesito exportarlo porque solo lo estoy usando en el mismo archivo, y solo crearé este componente de tabla de carrito. La razón por la que quiero poner esto en un componente separado es porque vamos a estar usando algunas variables de estado aquí. Voy a estar tirando de líneas, checkouturl, y estado fuera de este gancho de carrito de uso. Entonces obviamente hacen de esto un componente. Tenemos que renderizar algún tipo, así que vamos a abrir y vamos a tirar en un elemento HTML tabla. Ahora, actualmente podemos dar fe de manera confiable que no hay artículos en nuestro carrito, y eso es porque aún no tenemos un botón de agregar al carrito en nuestra página de productos. Lo que es una buena alternativa para hacer de inmediato es si líneas.longitud es igual a cero como en, lo que significa que actualmente no hay líneas en nuestro carrito, no hay artículos en nuestro carrito, entonces podemos devolver algunos JSX aquí y decir algo así como no hay artículos actualmente en el carrito. Ahora hay cierto problema en esto, y quiero mostrarles lo que es eso. Lo que voy a hacer es poner aquí un registro de consola, y digamos que no hay líneas. Si ejecutamos eso, va a decir que actualmente no hay artículos en el carrito. Ahora, volveremos a esto en sólo un segundo. Lo que vamos a hacer es, cuál debemos hacer primero? Vamos a entrar en el componente de diseño aquí y rellenar esto. Lo voy a poner en un icono aquí de una biblioteca de iconos que se recomienda al usar tailwind. En el tutorial oficial de Shopify, usan algo llamado viento de cola y hay una biblioteca de iconos de viento de cola asociada. De hecho, todavía podemos usar la biblioteca de iconos incluso si no estamos usando viento de cola. Olvidé cómo se llama, pero si solo escribimos la biblioteca de iconos de viento de cola, debería aparecer. Íconos de héroes, así se llama. Este héroe iconos es una biblioteca de iconos SVG que SVG es ahora probablemente la mejor manera de implementar iconos en cualquier proyecto moderno. Podemos hacerlo como sólido, contorno o mini. Me gusta el esquema y solo voy a escribir carrito aquí. Puedes personalizarlo si quieres. Puedes usar este carrito de compras. Me gusta la bolsa de compras, y podemos o bien copiar el SVG o el JSX. Lo estamos usando en un proyecto react, así podemos copiar el JSX, está bien, y luego puedo pegarlo aquí. En realidad, es mejor que usemos el JSX porque aquí mismo puedes ver algo de lo que hablé en las lecciones de teoría. Esto de aquí mismo está enlazando a los vientos de cola, así que voy a quitar eso. Pero aquí puedes ver si esto era un SVG estándar en HTML, esto sería trazo, línea , join, o en realidad creo que es una palabra, pero ahí habrá un guión. Recuerden que hablamos de ello en las lecciones de teoría que podemos tener guiones. De hecho es una buena idea que agarramos el JSX aquí, solo te voy a mostrar eso ahora mismo, si copiamos el SVG, va a haber guiones en los nombres de atributos que no queremos. Definitivamente copia del JSX si estás usando JSX, que es lo que estamos haciendo ahora mismo. Voy a sangrarlo un poco, y como puedes ver aquí puedes poner una expresión JavaScript en algunos de estos atributos también, y luego por supuesto voy a transformar esto en un enlace. ¿Hemos importado? Sí, hemos importado el enlace aquí y lo estamos usando en otro lugar. Yo sólo puedo ir así. Entonces solo necesito enlazar a la ruta, que solo va a ser -cart. Aquí mismo vamos a poner en breve un indicador de cuántos artículos hay en el carrito, pero llegaremos a eso en solo un segundo. Si vuelvo a nuestra aplicación aquí puedes ver que tenemos este ícono de carrito aquí, y si estoy en cualquier otra página, si hago clic en este ícono de carrito, verás que nos trae de vuelta a la página del carrito. Vamos a entrar en una página de producto. Vamos a entrar en esa primera que vimos una vez que nuestra aplicación se carga. Aquí vamos, la tabla de snowboard de hidrógeno, y vamos a traer y agregar al botón del carrito. Abra nuestro componente de detalles del producto aquí mismo. Ya estamos importando nuestro botón añadir al carrito aquí arriba. Voy a bajar a, vamos a hacer después de las opciones pero antes de la descripción, y vamos a crear un botón de añadir al carrito aquí. En realidad no queremos que sea de cierre automático porque aquí vamos a agregar niños. Vamos a poner aquí añadir al carrito. Entonces para darle un poco de estilo, acuerdo con el CSS existente, voy a poner en, agregar al carrito como el nombre de la clase. Pasemos a nuestra aplicación aquí y verás que existe el botón de agregar al carrito. Acabo de refrescarlo, pero ahí puedes ver que tenemos nuestro botón de añadir al carrito. Ahora, una cosa que queremos hacer antes clic en este botón Agregar al carrito, o dejar que el usuario haga clic en este botón de agregar al carrito es restringirlo si está agotado. No queremos mostrar el botón agregar al carrito o al menos queremos decirle al usuario que está agotado si está agotado. Vamos a desplazarnos hacia arriba hasta el formulario del producto aquí y crear un booleano aquí. Voy a crear una const está agotada y eso va a devolver true si la variante seleccionada no está disponible para la venta. Si eso no sale , vamos a tener un respaldo aquí de falso. Ahora bien, creo que en realidad no hemos recuperado esto de nuestra consulta GraphQL, así que vamos a tener que hacer eso. Volvamos al handle.server.js x dentro de nuestra carpeta de productos ahí. Solo tenemos que asegurarnos de que en el nodo variante, vamos a comprobar si está disponible para la venta. Solo necesitamos actualizar eso, y luego tenemos esta bandera booleana aquí va a ser cierta si la variante seleccionada no está disponible para la venta. Lo que voy a hacer aquí es un operador ternario, va a romper esto en una nueva línea, y luego poner en una expresión JavaScript aquí tenemos un operador ternario. Si está agotado, vamos a decir agotado, y si no está agotado, solo vamos a decir agregar al carrito. Entonces también esto debería funcionar, lo voy a meter. Si está agotada, también debería estar deshabilitada, así que voy a poner eso en un utilería deshabilitada. Eso debería funcionar. No creo que ninguno de estos productos esté agotado, así que realmente no podemos probarlo, pero esto definitivamente está en stock. Si hago clic en “Agregar al carrito” ahora, verás que hay un poco de estado de carga ahí, pero como termina, entonces eso debería estar ahora en el carrito, y si hago clic en esta tarjeta aquí, ahora vamos obtener un error porque en realidad estamos tratando con cierta información del carrito. ¿Qué hace este renderizado? No está definido en la tabla del carrito. Echemos un vistazo a lo que estamos pasando aquí. Pongo render aquí en vez de retorno. Soy tan idiota. Ustedes probablemente estén gritando desde el otro lado de la computadora diciéndome que me equivoqué. Perdón por eso. Si refrescamos por aquí, seguirá diciendo que no hay artículos en el carrito, pero luego desaparece. Interesante. Si vuelvo a refrescar, actualmente no hay artículos en el carrito y al cabo de un tiempo desaparece. Este es el problema al que me refería antes. Dije que vamos a tener que entrar aquí y arreglar esto. Básicamente, no sé si esto es un error o algo así, pero esencialmente el carro regresará sin líneas para empezar, y luego descubrirá las líneas más adelante. Cuando lo carguemos por primera vez, va a decir que no hay artículos en el carrito, pero luego va a desaparecer si hay artículos en el carrito. Lo que he hecho aquí es que he sacado estado del objeto devuelto del carrito de uso. Aquí echemos un vistazo a qué es el estatus. Si me consola el estado del registro y luego me refresco por aquí, se puede ver que aparecen tres estados recuperando, sin inicializar la obtención, en realidad eso son solo dos; ¿no es así? Pero hay tres que surgen. Déjame poner esto del otro lado así vamos a obtener el estatus sin importar si las líneas son cero o no, y luego refrescarnos por aquí. Aquí puedes ver que obtenemos fetching, uninitialized fetching, y luego inactivo. Ahora bien, la razón por la que esto es útil es antes de que aparezca idol, piensa que las líneas de pedido son cero. Pero entonces cuando aparece inactivo, se da cuenta de que eso no es cierto y muestra la alternativa, que actualmente es solo una tabla vacía. Si realmente miramos aquí e inspeccionamos, verá que se está renderizando una tabla vacía. Pero claro esta mesa es la mesa que albergará todos nuestros artículos. Lo que voy a hacer aquí es además de verificar la longitud de las líneas, también voy a verificar el estado y solo voy a mostrar que actualmente no hay artículos en el carrito si el estado está inactivo. De lo contrario, podría estar en estado de carga. Si refresco por aquí, si hay artículos en el carrito ahora, no va a mostrar ningún artículo en el carrito. Esa es mi pequeña solución a ese problema. Ya estamos bastante metidos en el video y ni siquiera tenemos una lista de artículos del carrito que aparecen. Vamos a meternos en eso ahora mismo. Voy a darle a esta tabla una clase de tabla de carrito, nuevamente solo para formateo CSS, y luego voy a abrir una etiqueta t body aquí, y luego aquí es donde vamos a empezar a traer nuestras líneas. Usaremos de nuevo esa función de mapa familiar, y tomaremos cada línea, y con cada línea, vamos a devolver algunos JSX. Aquí es donde vamos a poner el proveedor de línea de carrito. Tenemos que darle una clave, así que ponle a través del ID de línea como clave, y luego pasaremos en la línea en la propiedad de línea. Nuevamente, realmente no puedo entrar en demasiados detalles sobre por qué funciona esto, porque es solo la naturaleza del componente. Estos componentes de proveedores proporcionan funcionalidad y son establecidos por las bibliotecas que estamos usando. Pronto empezarás a ver qué funcionalidades ofrece. Vamos a usar otro gancho dentro de aquí, pero lo que voy a hacer es crear otro componente llamado artículo de línea de carrito. Entonces así vamos de nuevo, función cartlineItem. Aquí, lo que voy a hacer es devolver algunos JSX, obviamente, voy a devolver una fila de mesa. Lo que voy a usar para eso va a ser devuelto de otro gancho aquí. Tenemos otro gancho aquí de la estructura algunas cosas fuera de este gancho, pero el gancho que vamos a usar aquí es UseCartline, y lo que vamos a hacer es agarrar el ID de línea, algo llamado mercancía, y el costo de este objeto. Aquí adentro, ahí es donde podemos usar ID de línea, y luego cada una de estas filas va a tener, creo, cuatro columnas. Yo lo configuré. Aquí, en la primera, ahí es donde vamos a poner nuestra imagen. Digamos solo imagen para comenzar como un lugaretero, la siguiente vamos a tener el título de nuestro producto. Solo voy a poner valores falsos para empezar, así sabemos lo que va a entrar aquí, selección de variantes y precio individual, y luego el siguiente va a tener nuestro selector de cantidad. Entonces el final va a tener nuestra línea total y un botón de eliminar. Si actualizo por aquí, puedes ver que tenemos una fila que muestra todos estos valores de marcador de posición. Eso no es particularmente útil, así que intentemos hacer que estos sean dinámicos. Voy a quitar estos marcadores de posición, y aquí, voy a usar el componente de imagen que creo que ya importé. Sí, lo hice. Muy buen trabajo, Chris. Entremos aquí y le demos un nombre de clase de LineItemImage para estilizar, y luego todo lo que tengo que hacer es pasar en la imagen, que en realidad está en los objetos de mercancía. Puedo hacer un registro de consola aquí para que ustedes lo demuestren. Si quieres ver lo que hay en el objeto mercancía, puedes simplemente consolar registrarlo tú mismo, pero solo confía en mí, cuando digo por el momento, para ahorrar tiempo, la imagen está dentro de este campo de mercancía. Si pasamos por eso y presiono “Guardar”, ahora puedes ver que el portalugares ha sido reemplazado por la imagen del producto de nuestro único producto que está en el carrito. Ahora queremos insertar selección de variantes de título de producto y precio individual. Hagámoslo ahora mismo. Voy a poner en un enlace para que cuando hagamos clic en este, vaya al producto. Aquí, voy a hacer productos/ y luego poner en el asa de productos de mercancía. En los objetos de mercancía tenemos acceso al producto, y en ese objeto tenemos acceso a ese manejo de productos. Entonces voy a darle a eso un nombre de clase para el estilo de line-item-product-title. Entonces entre estas etiquetas de enlace, voy a agarrar mercancía, productos, tittle. Estamos usando mucho la mercancía aquí así que podríamos hacer algunas reestructuraciones aquí para hacernos la vida más fácil. A lo mejor vamos a hacer eso ahora. Vamos a agarrar la mercancía. Podemos agarrar, me gusta poner en el mejor espacio, la imagen y el producto aquí, así que solo podemos sacar mercancía de estos es el beneficio de la reestructuración, que hemos visto varias veces a lo largo de esta clase. Yo he puesto ese enlace , vamos a comprobar si eso sigue funcionando. Ahí tenemos el snowboard de hidrógeno, y si hago clic en él, me llevará a ese producto un poco lento, pero ahí se puede ver que viene a través. Entonces queremos, debajo de esto, poner la selección de variantes. Vamos a tener que recorrer las opciones seleccionadas, que va a estar en la mercancía. Voy a sacar eso usando la estructuración y luego voy a ir a las opciones seleccionadas. Puede ser que no haya opciones seleccionadas, así que voy a hacer una reserva de una matriz vacía, y luego voy a ejecutar map. Entonces para cada opción renderiza algunos JSX. Lo siento, esto es un desastre cuando se trata de todos estos diferentes soportes. Tal vez sea solo porque no he pasado por mi expresión JSX aquí, que va a ser, de nuevo, vamos a usar una clave porque estamos recorriendo las cosas, y voy a usar el nombre de la opción como la clave, y luego solo voy a poner en bastante básicamente el nombre de la opción y el valor de la opción en esta selección de variante en particular. Vamos a golpear “Guardar” en eso y ver cómo funciona eso . Ahí vas. Esa es la selección de variantes. El formato está un poco apagado. En realidad no he puesto esto en un div con el nombre de clase variante de elemento de línea para obtener el formato que ya configuré. Ahí vamos. Entonces para el resto de esto, podría hacerlo en un video separado para ustedes porque este se está haciendo bastante largo y Skillshare le gusta que mantenga mis videos debajo de aproximadamente 30 min a 20 min cada uno. Vamos a hacer una segunda parte en esta, te veré en el siguiente video. 12. Carrito Funcionalidad pt. 2: Todo bien. Bienvenida de nuevo. Espero que estés listo para seguir adelante con esta funcionalidad de carrito y así , obviamente, la característica más importante que construiremos en nuestra pequeña aplicación. Por lo que merecía dos videos para poder cubrir todo. Así que tenemos estos marcadores de posición todavía aquí en este lado de nuestra mesa de carrito. Solo para recapitular lo que hicimos en el último video, habilitamos la funcionalidad del carrito en toda la aplicación envolviendo nuestro enrutador en el proveedor del carrito y luego creamos una ruta de carrito que enlaza con una página de carrito y luego también agregamos en un enlace al carrito aquí mismo y por supuesto agregamos un botón de agregar al carrito, que nos permite agregar artículos a nuestro carrito. Volvamos a construir nuestra página de carritos. Aquí vamos a usar algunos otros componentes que trajimos o que importamos aquí arriba, cantidad de línea de carrito y botón de ajuste de cantidad de línea de carrito. Ese es probablemente uno de los nombres más grandes de los componentes que estamos trayendo pero estos botones son bastante útiles como pronto verás. Ahora para esta, es importante que uses las clases de lo contrario va a parecer una porquería absoluta. Así que voy a envolver todo esto en el selector de cantidad del carrito y luego solo para comenzar, en realidad vamos a traer cantidad de la línea del carrito y si acabo de poner esto, siempre y cuando esto esté dentro de una línea de carrito proveedor, revisa esto, verás que la cantidad es la cantidad correcta. Entonces si iba a ir a este snowboard y agregar otro de estos al carrito. Creo que tiene que ser exactamente la misma variante y está tardando un tiempo. Ahora volvemos al carrito y ahora se puede ver que es hasta dos, entonces, ¿qué tan bueno es eso? Ya estamos trayendo el estado de cuál es la cantidad en esa línea de pedido con solo usar este componente de Shopify Hydrogen. Pero claro que queremos poder actualizar la cantidad. Así que de cada lado vamos a poner en un botón de ajuste de cantidad de línea de carrito y luego en el lado izquierdo para el parámetro de ajuste, vamos a hacer que disminuya. Voy a abrir ese hacia arriba y por dentro voy a poner en un SVG que es un símbolo menos. Así que voy a volver a los íconos de héroe aquí, encontrar menos copiar el JSX, tirarlo aquí. Entonces tenemos nuestra disminución y luego en el otro lado de la cantidad de la línea del carrito. Voy a poner en otra línea de carrito botón de ajuste de cantidad y como el prop de ajuste va a ser aumentar y luego el SVG y luego voy a poner aquí es por supuesto que va a ser lo contrario, que es plus. Entonces voy a copiar el JSX para ese icono, pegarlo aquí y luego presionar “Guardar” en eso. Ahora veamos qué pasa cuando refrescamos nuestra página por aquí. puede ver que ahora puedo reducirlo a uno, o puedo aumentarlo hasta tres o cuántos quiero hacerlo. Entonces esos son componentes muy útiles ahí de Shopify Hydrogen. Obtenemos algunas funciones de ajuste de cantidad de inmediato. Por aquí, para el total de la línea, voy a reemplazar ese marcador con un componente de dinero. Voy a poner en eso sin bandera de ceros al final y luego voy a pasar por el monto total del punto de costo para formatear la cantidad total en un formato agradable y fácil de usar. Entonces aquí arriba es donde estamos obteniendo el costo del uso del gancho de línea del carrito. Ya deberías entender que si acabamos de pasar eso, no estaría muy bien formateado. Entonces queremos poner eso en un componente de dinero, que podemos ver aquí. Si estamos obteniendo tres de ellos, el total termina siendo de 1,800 y luego el botón de eliminar es otro botón de ajuste de cantidad de línea de carrito. Voy a poner en como esto como prop, voy a hacer que se muestre como un div, voy a dar el nombre de clase de cart remove y luego el ajusta prop de remove. Esto va a decirle al componente del botón de ajuste de cantidad de la línea del carrito que quiero que que quiero que elimine toda la cantidad de este artículo. Entonces solo quita la línea de pedido por completo y para eso, voy a usar un ícono de papelera. Entonces entraré aquí, escribiré basura, copiaré el JSX, regresaré aquí tal como lo hicimos antes, y arreglaré el anidamiento. Entonces, si hemos escrito todos nuestros nombres de clase correctamente y volvemos aquí, verás que aparecerá en la esquina superior derecha aquí y así podemos simplemente hacer clic en eso y eliminar la línea de pedido completamente. Ahora verás que cuando actualicemos la página, no muestra que no hay líneas de pedido actualmente en el carrito hasta que lleguemos al estado inactivo. Eso es para evitar que esto aparezca antes de que sepamos con certeza si hay algún artículo en nuestro carrito. Bien, así que volvamos y agreguemos ese artículo en nuestro carrito. Hagamos una selección diferente aquí. Policarbonato, patrón de perno clásico 160, agregar al carrito. Entonces vuelve a nuestro carrito por aquí y creo que quería poner el precio de cada uno debajo de aquí, así que agreguemos eso también. Ya tenemos acceso a nuestro componente de dinero aquí. Voy a escribir dinero sin ceros finales porque esa es mi preferencia y luego dentro de los datos, prop, poner en precio de mercancía, v2, pulsa “Guardar” en esa actualización y podrás ver al individuo el precio es 610 y si lo aumento aquí arriba, el precio por cada uno se mantendrá igual, pero el costo total de esa línea de pedido subirá. Déjame mostrarte lo que pasa si agrego otro producto al carrito agreguemos unas tablas de snowboard full stack al carrito y luego haré clic en esto para llevarme a la página del carrito. Verás que tenemos dos aquí. Ahora, tenemos un pequeño problema. Uno de estos es aparecer en negrita y uno de estos no es aparecer en negrita, lo que tiene un problema, pero además no tenemos un pie de página aquí para el total, y obviamente necesitamos un botón para pagar. Entonces, vamos a ampliar esto. Quiero salir de esta línea de pedido del carrito, respaldarlo un poco aquí, y luego debajo de aquí, poner un div con el pie de página del carrito y obviamente vamos a obtener todos estos rojos líneas porque necesitamos un solo elemento raíz en nuestro retorno. Así que solo voy a hacer ese hack que usamos antes de abrir un elemento vacío y luego solo sangrar aquí y luego en nuestro pie de página del carrito, voy a poner en un enlace. El enlace va a ir a la URL de pago, que sacamos del carrito de uso. Nos va a generar automáticamente la URL de Checkout. Voy a darle un nombre de clase de botón Checkout, que está configurado en nuestro CSS. Genial, así que voy a cerrar eso y luego aquí voy a tener la palabra checkout y luego cerrar esa etiqueta de enlace. Si me refresco por aquí, tienes el botón Pagar, pero aún no he puesto en el carrito los totales. Creo que voy a poner eso en el cuerpo. Así que justo después de aquí, donde estamos regresando todas estas filas, podemos poner en una fila final y las dos primeras columnas, voy a hacer una llamada span de dos. Simplemente no vamos a tener nada y luego tendremos la palabra total y luego para la celda final, vamos a traer en costo de carrito. Lo que nos da un costo total del carrito sin ceros finales y no necesitamos pasar por ninguna información aquí siempre esté dentro del proveedor, que supongo que es el proveedor del carrito, esto va a estar bien . Así que refréscate por aquí y verás que esos dos sumados son iguales a eso y creo que la negrita se debió a que mi CSS hacía que la línea final fuera negrita. Entonces la línea final debió haber sido el total. Entonces ahora ese tema de estilismo está atendido. Todo bien. Así que tenemos dos de esta variante en particular. En una de esta variante en particular, si hago clic en el “botón Pagar”, echemos un vistazo a lo que sucede. Es un poco lento. Lo siento por mi pobre Internet. Pero pronto verás que vamos a la página de pago en la tienda Hydrogen. Si mostramos el resumen del pedido, este debe coincidir con la selección en nuestro carrito. Ahí van, chicos. Así de simple o no simple es. Es mucho código para escribir pero hay mucha funcionalidad que el marco Shopify Hydrogen se encarga de nosotros. No necesitamos poner ningún código especial en nuestro botón Pagar. Simplemente podemos traer la URL de pago. Podemos usar componentes como este. Todo lo que tenemos que hacer es meterlo en CartCost y nos da cuenta del resto. Estos increíbles botones CartLineQuantityAdjust, el CartQuantity en sí, en realidad es bastante impresionante la cantidad en realidad es bastante impresionante funcionalidad que algunos de estos componentes nos dan fuera de la caja. Una de las cosas finales que quiero hacer aquí es poner un indicador de cuántos artículos hay en el carrito aquí arriba. Lo que voy a hacer es en nuestros componentes de layouts, ¿dónde está? Justo aquí. Voy a insertar algo llamado CartBubble. Este va a ser un componente que construí yo mismo. Entonces voy a, debajo de aquí, crear este componente CartBubble. En realidad, porque vamos a estar usando carrito de uso, voy a mover esto a su propio archivo de componentes de clientes. Voy a entrar en un nuevo archivo, cartbubble.client.jsx; poner eso aquí, hacer una exportación por defecto. Después volviendo al archivo layout.server.jsx, voy a importar ese componente, cartBubble y el resto se rellena automáticamente para mí. Si vuelvo a cartbubble.client.jsx, obviamente tenemos que devolver algo aquí; devolver algunos jsx. Todo lo que estamos buscando aquí es la cantidad. Eso es todo lo que está haciendo. Voy a importar el gancho UseCart del framework Hydrogen. Voy a sacar la cantidad total del objeto que devuelve este gancho. Esta es una manera fácil de obtener nuestra cantidad total. Si la cantidad total es menor que uno, que es básicamente cero, voy a devolver null, así que básicamente no devuelvo nada. Pero si pasa de eso, devolveremos un span, y dentro del span haremos corchetes, y dentro de esos paréntesis simplemente devolveremos la cantidad total. Si guardo eso, refrescar por aquí o refrescar en cualquier parte de nuestra aplicación. Tenemos un poco de error, DOM ColSpan no válido. Necesitamos usar CamelCase para el ColSpan aquí. ¿Dónde estaba yo? CartPage. Tenemos que poner aquí una S mayúscula. Eso es algo raro de jsx. ¿Qué más tenemos aquí? Si leemos el mensaje de error, parece que viene de nuestro componente CartPage. Déjame simplemente ir a otra página nuestro sitio web y confirmar que está aislada al CartPage. Sí, lo es. Si miramos por aquí, junto a este icono de carrito, debería indicar cuántos artículos hay en el carrito. Déjame ir aquí a CartBubble. Si hay cero artículos en el carrito, debería devolver null, por lo que no aparecerá nada. Entonces esto está sugiriendo que no hay ningún artículo en el carrito. Volvamos a hacer clic en el carrito, y solo regresa, actualmente no hay artículos en el carrito. Si actualizo, ¿ obtengo el mismo error? Sí. Si navego por CartPage desde otra página, estará bien. Pero si llego directamente a la CartPage, obtendré este error. Creo que el tema aquí se remonta a si vamos a la CartPage. Esta representación sin la solicitud asíncrona a la API de escaparate devolviendo todavía. Tener Suspenso aquí debería comprobarlo. Pero en este caso, no está funcionando. Voy a poner esta declaración de retorno. Esto podría ser una solución un poco pirateo pero debería funcionar. Voy a pegarlo aquí. Si lines.length es más de cero, entonces vamos a renderizar el carrito. Si me refresco por aquí, eso resuelve nuestro problema. De alguna manera hemos perdido nuestros artículos en el carrito pero eso es todo bueno. Volvamos a nuestro catálogo o a cualquier colección. Haz una selección de producto, y luego voy a hacer clic, agregarlo al carrito. Ahora, puedes ver que nuestro cartBubble está funcionando. Tenemos un artículo en nuestro carrito, y si hago clic sobre él, verás que esta es nuestra tabla de snowboard Hydrogen. Si agrego un segundo, verás que este número sube también. Si agrego una tabla de snowboard diferente, tal vez esta de pila completa, haz clic en “Agregar al carrito” verás que eso también se agrega. Si entramos aquí, puedes ver las tres tablas de snowboard que tenemos en nuestro carrito. Ahí lo tienen, chicos. Si revisamos nuestros proyectos hasta el momento, tenemos nuestra página de inicio. Obviamente, aquí no hemos construido nada. Esto es para que ustedes averigüen lo que quieren poner en su página de inicio. Puedes traer una determinada colección y presentarla de todas las formas. Entonces tenemos aquí nuestra página de catálogo, que enumera los primeros nueve productos nuestra tienda independientemente de la colección en la que se encuentren. Si hacemos clic en alguno de estos, irá a ese producto. De igual manera, si vamos a una colección específica como la colección freestyle, y luego hacemos clic en una de estas páginas de productos, podemos hacer una selección de variantes, agregarla al carrito. Ve al carrito aquí. Como puedes ver, está guardada esa selección. Puedo incrementar la selección. Puedo sacarlo del carrito bajando esto hasta cero, y luego diré que no hay artículos actualmente en el carrito, o si voy a agregar otro producto al carrito nuevamente, agregue este 154 centímetros uno y aumentar la cantidad, verás que aumenta aquí también. Una mejora para esta aplicación sería trabajar en los estados de carga y construir algo un poco más agradable para un suspenso. este momento no tenemos ningún retroceso, pero podrías construir en algunos estados de carga bastante agradables aquí. También podemos, obviamente, pagar haciendo clic en este botón aquí mismo, y eso llevará nuestra selección directamente a la caja. En este punto, estamos dejando nuestra aplicación e yendo directamente a la página de pago como alojada en la tienda Shopify. Aquí vamos. También podemos eliminar ese artículo presionando ese botón. Como puedes ver aquí, lleva un poco de tiempo construir CartPage, pero las funciones del carrito están bastante bien manejadas por todos estos componentes y ganchos que están disponibles dentro del Shopify Biblioteca de hidrógeno. Para resumir todo lo que hemos hecho en este proyecto, quiero destacar los temas que resalté al inicio de esta clase antes incluso de entrar en el lado práctico de las cosas. Si volvemos a lo que aquí es sencillo, todos estos han resultado bastante construidos al final. Pero por ejemplo, tenemos un elemento de cuadrícula de productos, por ejemplo, es un componente del lado del cliente que pasamos en un producto. Si echamos un vistazo a nuestras rutas de recolección, estamos haciendo una solicitud a la API de escaparate, tomando toda la información que necesitamos a través de una consulta, pasándola a cada uno de estos componentes de la tarjeta de producto, y usando ganchos en el camino. Si alguna vez estás perdido o confundido, puedes buscar cualquiera de estos ganchos o componentes en la documentación. Si estás importando desde React, quieres buscar en la documentación de React. Si estás importando desde Hidrógeno, quieres ver la documentación de Hidrógeno. Literalmente puedes simplemente ir a la documentación de Hidrógeno. Esta es la API de escaparate. Pero debería poder buscar desde aquí, UserOuteParams, entrar en API Hydrogen, hacer clic aquí, y podrás conocer más sobre todos los diferentes hooks y componentes que usamos en esta clase. En el siguiente video, te voy a mostrar cómo implementar esta app en tu tienda Shopify. Eso va a implicar conectarse a la API de escaparate. Entonces actualizaré nuestras credenciales aquí, y luego publicaremos esto en vivo en tu tienda Shopify. Obviamente, muchas mejoras que podemos hacer aquí. He dejado aquí este tercer enlace, y eso va a ser para el video bonus donde vamos a agregar en un blog. Pero por ahora, estos son los componentes principales que necesitas para tener un escaparate Shopify que funcione. En el siguiente video, vamos a desplegar esto en nuestra tienda Shopify. Te veré en esa. 13. Despliegue nuestro Storefront personalizado: Bienvenidos de nuevo chicos en esta lección vamos a aprender a implementar nuestra tienda de hidrógeno Shopify en oxígeno, que es la plataforma de alojamiento proporcionada por Shopify, que podemos acceder directamente en nuestro Tienda Shopify a través del canal de ventas de hidrógeno. Desafortunadamente, al momento de grabar, oxígeno solo está disponible para los planes Shopify Plus. Pero si estás viendo esto en el futuro, es posible que ya esté disponible para otros planes de Shopify. Esta es una característica bastante nueva, así que supongo que solo la están implementando en las tiendas Shopify Plus ya que son el nivel de pago más alto, obtendremos prioridad en esta nueva función. Desafortunadamente, si vienes a esta página en la documentación y esta advertencia sigue aquí, si estás en algo bajo Shopify Plus, entonces desafortunadamente lo estamos, esto no te va a aplicar. Tienes que usar una solución de alojamiento diferente si decides implementar una tienda de hidrógeno. Ahora, por suerte para mí, Shopify me han habilitado una tienda con canales de venta de hidrógeno, así puedo demostrar esta característica. Pero solo quiero mostrarte en algunas tiendas, no vas a poder acceder a esto. Por ejemplo, en mi tienda de pruebas original, Chris testing shop. Si voy aquí a canales de ventas y luego hago clic en todos los canales de venta recomendados. Rondas aquí es donde viviría el botón para instalar hidrógeno si estuviera en Shopify Plus, o en el caso de esta tienda, tenerlo habilitado por Shopify. Desafortunadamente, en esta tienda, no puedo agregarla, pero como mencioné aquí en Chris testing shop 2, que es una tienda que configuré específicamente para hidrógeno. Si hago clic en los canales ventas y entro en los canales de venta recomendados, ya no aparecerá aquí porque ya está instalado. Pero antes de que lo instalara, estaba disponible para agregar aquí. Ahora pueden ver que tengo un canal de ventas de hidrógeno aquí mismo. Si estás en Shopify Plus, deberías poder ingresar a los canales de ventas, canales venta recomendados, y agregarlo aquí, entonces tendrás este elemento del menú aquí. Desafortunadamente, si eres todos los demás al momento de grabar, entonces no vas a poder hacer esto. Voy a cerrar este abajo no podemos hacer ningún hidrógeno ahí. Déjame entrar en el canal de ventas de hidrógeno. Ahora lo que podemos hacer es regresar a la documentación y seguir adelante. Yo hice esto y me encontré con algunos hipo. Lo que he hecho es que he averiguado qué funciona y solo te voy a mostrar eso en este video. Si vuelvo aquí a mi canal de ventas de hidrógeno aquí mismo, pueden ver que tengo una prueba de hidrógeno aquí, pero lo que vamos a hacer es crear una nueva tienda. En primer lugar, quiero volver a mi editor de código aquí, y quiero hacer algunos cambios. En primer lugar, quiero hacer una rama de producción, y esa es la sucursal que vamos a desplegar en nuestra tienda Shopify. Voy a entrar aquí, crear nueva sucursal, llamar a esta rama producción. Entonces lo siguiente que vamos a querer hacer es cambiar estas credenciales a nuestra tienda de hidrógeno Shopify real. La forma habitual de hacerlo es buscar en nuestras aplicaciones privadas, que actualmente se encuentran en configuraciones, aplicaciones y canales de ventas. Después por aquí para desarrollar apps. Como puedes ver aquí, tengo acceso a la API de escaparate como una aplicación personalizada. Simplemente demostraré esto rápidamente, crearé una aplicación y diré acceso a la API de escaparate. Entonces solo pondré aquí a Skillshare para diferenciarlo. Presiona “Crear aplicación”. Entonces solo necesitaré dar click aquí para configurar los alcances de la API de escaparate. Voy a marcar todas las casillas aquí. Entonces puedo hacer clic en el botón verde guardar. Después de hacer eso, puedo hacer clic en “instalar aplicación”, hacer clic en “Instalar”. Entonces aquí bajo credenciales API, voy a tener mi token de acceso a la API de escaparate para que pueda tomar eso y ponerlo aquí. Pero lo que va a suceder cuando implementemos nuestro canal de ventas de hidrógeno es que obtendrá automáticamente un token de acceso a la API de escaparate. Te voy a mostrar que ahora mismo si entramos en el canal de ventas de hidrógeno, haz clic en “Crear escaparate”. Aquí es donde podemos crear un nuevo repositorio de hidrógeno. Yo no voy a hacer eso. Voy a conectar un repositorio existente porque tenemos, por supuesto, ya tenemos nuestro proyecto en GitHub. Voy a hacer clic en “Conectar” un repositorio existente, seleccionar “Mi cuenta” y luego encontrar ese repositorio bajo la tienda de la clase hidrógeno. Ahora, algo a tener en cuenta aquí es que necesitarás configurar la integración a GitHub. Ya lo hice , por lo tanto, esto está apareciendo sin advertencias. Pero si no lo has hecho, y voy a poner una captura de pantalla en tu pantalla ahora mismo para que veas que hay un cuadro de advertencia que aparece pidiendo permisos. Tendrás que instalar la aplicación Shopify GitHub en tu cuenta de GitHub y luego habilitar ciertos permisos para aquellos tipos que han estado usando la integración de GitHub con el desarrollo de temas, es exactamente la misma aplicación Shopify GitHub. Solo requiere algunos permisos adicionales. Una vez que hayas habilitado la aplicación y dado esos permisos, podrás buscar tu repositorio y hacer clic en este botón verde para Conectar. Ahora antes de hacer eso, solo quiero tomar nota de la rama de producción tiene que ser maestra o principal. Es realmente molesto para mí porque me gusta que la rama de producción sea una rama separada llamada producción. Pero por defecto aquí en hidrógeno y no te dejan cambiarlo en la actualidad, va a seleccionar automáticamente la rama master o creo que la rama principal si no tienes una rama master como tu rama de producción. Si tienes la versión de producción de tu app en tu rama master o principal, entonces esto va a ser bastante fácil para ti. Pero para mí que me guste mi rama de producción, en una rama separada llamada producción, va a haber algunos pasos adicionales aquí va a haber algunos pasos adicionales. Toma nota de eso. Ahora voy a presionar el botón verde Conectar y va a cargar esta nueva tienda de hidrógeno. Como puedes ver aquí, acabamos de recibir un nuevo escaparate. Simplemente se llama escaparate de clase hidrógeno. Como puedes ver aquí abajo, está desplegando una rama de vista previa. Sólo voy a esperar a que eso termine y luego echaremos un vistazo. Eso ya está terminado, y si hago clic en esta URL de vista previa, verá que la rama maestra se está desplegando y está tirando mis credenciales reales de escaparate. El nombre real de esta tienda, no el nombre de la vista previa de Shopify. Ahora suceden algunas cosas detrás de escena ahí que quiero mencionar aquí. Si entramos en esto aquí mismo, puedes ver que agregó un archivo especial llamado archivo flujo de trabajo de implementación de oxígeno de Shopify. Eso lo hizo a través de la carpeta.github slash workflows. Esto es importante porque se requiere para que estas sucursales se desplieguen. Si volvemos aquí y buscamos en producción, no hay despliegues. Si entro en todas las implementaciones aquí, verás que no hay nada en producción, hay algo en vista previa. Entonces si entro en la configuración de escaparate, puedes ver que aquí hay una rama de producción, pero si hago clic en ella, vamos a obtener una página 404. Ahora, como dije, no me gusta tener mi rama de producción en master, así que voy a crear otro ambiente de producción. Pero antes que nada, voy a actualizar y publicar esta rama de producción nuestra cuenta de GitHub para que podamos conectarla realmente. Ahora, como mencioné antes, este escaparate de hidrógeno nos va a generar un token API de escaparate. Podemos usar eso en lugar de crear una aplicación privada. Lo que voy a hacer es reemplazar el token de escaparate aquí por el que está dentro de nuestra configuración de escaparate. Entonces, claro, el dominio de la tienda va a ser Chris-testing-shop-2.myshopify.com. Desafortunadamente, no puedo copiarlo directamente, así que solo lo voy a escribir. Yo sólo copiaré eso y me aseguraré de que funcione. Sí, esa es la dirección correcta. Dulce, así que hemos actualizado nuestros permisos aquí, y presionaré “Guardar” en eso y luego comprometeré esos cambios obviamente. Stage, Update Hydrogen config file será el mensaje de confirmación y luego presionaré “Commit”. Después voy a dar click aquí para publicar. Ahora que he empujado esa rama y está en nuestra cuenta de GitHub, puedo ir a “Agregar entorno”. Voy a seleccionar la rama de producción. Ahí vamos y voy a llamar a esta producción, producción solo para diferenciarla de la otra rama de producción. Desafortunadamente, no puedo cambiar el nombre de los otros. Esta sólo va a ser producción y entre paréntesis producción porque ese es el nombre de la rama real. Voy a hacer esto público y voy a darle a “Guardar”. Ahora si vuelvo, pueden ver que aquí tenemos un segundo ambiente. Pero si hago clic en la URL, vamos a obtener el mismo problema, este error 404. La razón por la cual es que en realidad no se está desplegando. Si vuelvo aquí y voy a todas las implementaciones, verás aquí en vista previa tenemos una implementación. En producción, sin implementación, y bajo nuestro despliegue o entorno de producción personalizado , no hay implementación. Ahora bien, cuál es la diferencia entre estos y éste es que Shopify agregó este archivo de flujo de trabajo de implementación de Oxygen. Nosotros también vamos a hacer eso por nosotros mismos. Lo que voy a hacer es dirigirme a mi repositorio GitHub. Aquí está, christopherdodd/ escaparate de clase hidrógeno. Solo para ser claros chicos, este es mi repositorio, así que tengo acceso a esto y puedo crear una rama de producción aquí para ustedes, querrán hacer una bifurcación u otro repositorio y una rama de producción sobre eso. Este no es el proyecto literal de GitHub que estarás implementando en tu tienda. Yo sólo quería dejar eso claro. Pero si miramos aquí dentro y usamos el mío como ejemplo, si voy aquí a mirar las diferentes ramas, puedo ver una aquí abajo, han agregado una nueva sucursal, y esta es nuestra rama de vista previa. Si miro dentro, puedes ver que está basado en maestro. Pero lo que han hecho es que han agregado un archivo de flujo aquí y esta es nuestra configuración de implementación aquí mismo. Eso es lo que se sirve en esta URL de vista previa aquí. Shopify no lo dejes muy claro, pero eso es esencialmente lo que está sucediendo. Lo que vamos a hacer es que vamos a tomar este archivo. Sólo tenemos que tomar nota del camino aquí. Es.Gitthub/flujos de trabajo y luego metemos este archivo en. Voy a dar click aquí para obtener el archivo raw. Lo que voy a hacer es un poco fuera de pantalla. Voy a entrar en el menú de archivos. Haga clic en “Guardar página como”. Entonces dentro de nuestro proyecto de escaparate aquí, voy a copiar la ruta que era crear una carpeta.gitthub. Nos va a advertir que puntos están reservados para el sistema, lo que significa que no podremos ver esta carpeta en nuestro buscador, o supongo que es el Explorador de Windows en Windows. Pero lo podremos ver en nuestro editor de código. Entonces voy a crear la carpeta de flujos de trabajo y luego aquí dentro puedo guardar ese archivo de despliegue. Voy a salir de eso. Volvamos a esto y luego si entro en mi editor de código aquí, puedes ver que ese cambio viene a través. Si voy aquí al Explorer, se puede ver que hemos agregado ese archivo a esta ruta. Todo lo que tenemos que hacer es comprometerlo. Voy a escenificar ese archivo de despliegue de oxígeno. Voy a presionar “Commit”. Empujaré ese cambio a la rama de producción. Una vez que eso es empujado, si volvemos aquí a nuestras implementaciones y pasamos a producción en producción, se puede ver que algo se está desplegando en este momento. Si entro en todo, puede ver que estamos agregando nuestro archivo de implementación de oxígeno a nuestra rama de producción aquí mismo. Solo voy a esperar a que eso termine desplegarse y ahora se puede ver que se ha desplegado con éxito y si hago clic en esta URL aquí, largo he aquí, aquí está nuestra aplicación. Si entro en la página del catálogo, puedes ver que esto está funcionando igual que lo teníamos localmente. Puedo entrar en cualquiera de estas tablas de surf o tablas de snowboard más bien, agregar al carrito, entrar en la página de mi carrito y check out. Eso nos llevará a la caja de nuestras tiendas reales. Independientemente de si quieres implementarlo en la rama maestra o no, todavía vas a necesitar agregar ese archivo de implementación de oxígeno para que esa rama se despliegue. Aquí puedes ver que he creado un entorno personalizado ahora usando la rama de producción y podemos acceder a esta URL pública, lo cual es realmente genial. Si queremos eso para la rama maestra, podemos hacerlo también. De lo contrario, tenemos aquí esta URL de vista previa y eso nos muestra qué es exactamente lo que requiere Shopify para que esto se despliegue correctamente. Como se puede ver, esto no viene por debajo del rubro de producción porque supone que la rama maestra va a entrar en el ambiente de producción. Pero para mí, prefiero tener una sucursal separada porque la rama maestra podría estar desplegándose en diferentes tiendas así que a menudo tengo diferentes sucursales de producción para diferentes tiendas. Pero, por supuesto, hay algún código común que va entre tiendas cuando estoy trabajando con clientes. Por eso me gusta tener rama maestra como el código común que recorre todas las ramas de producción y luego tener una rama de producción separada para cada tienda. Esa es una pequeña explicación de por qué uso la producción como mi rama de producción. Pero por alguna razón, Shopify asume master como la rama de producción. Ahí vas. Ahora tenemos nuestro entorno de producción y nuestra URL pública para nuestra tienda de hidrógeno. Ahora que sabemos cómo desplegar nuestro escaparate al oxígeno, si estamos en Shopify Plus o en cualquiera de los otros planes que ojalá esté disponible en el futuro. Ahora, pasemos a la lección extra. Daremos un paso atrás, construiremos sobre lo que ya hemos creado y agregaremos en un blog. Te veré en el siguiente video. 14. Bono: adición de una sección de blog: Bien, así como lo hago a menudo en mis clases de Skillshare, he tirado un video bonus final, que no es esencial como vimos antes ya hemos creado colecciones, productos y carrito habilitado funcionalidad, que es realmente todo lo que necesitamos para crear una tienda básica que funcione. Pero para ganar más práctica con el flujo de trabajo en Hidrógeno, te voy a mostrar cómo crear una configuración de blog aquí también para que podamos sacar entradas de blog de la tienda también. Lo que he hecho es creé una rama de producción la última vez, pero volví a la antigua configuración de Hydrogen, así que estamos usando nuevamente las entradas del blog de la vista previa de Hydrogen, esto va a ser siguiendo de hace dos videos, no el último video que solo necesitaba hacer referencia a eso. Estamos ejecutando la vista previa de Hidrógeno, no conectándonos a mi tienda en particular. Lo que queremos hacer es el número 1, crear un diseño de blog, y luego el número 2 es crear una ruta para todos los diferentes artículos dentro de esa entrada de blog. Déjame abrir nuevamente GraphiQL porque solo quiero verificar que sí tenemos blogs en esta tienda Shopify en particular, así que voy a hacer blogs, esto listará nuestros blogs y haré nodos y manejadores. Si ejecuto esto, debes proporcionar al menos primero o último, así que digamos los primeros cinco blogs, no debería haber más de cinco blogs seguramente. Hay dos blogs en la tienda de ejemplos de hidrógeno de Shopify, y eso es noticias y diario. Esto va a funcionar, así que si volvemos aquí, lo que voy a hacer es volver a nuestro proyecto aquí y vamos a crear una ruta de blog. Dentro de nuestra carpeta rutas aquí, nuevo archivo blog punto servidor, en realidad lo siento, necesito hacer eso un blog mayúscula punto servidor punto JSX. Entonces vamos a exportar los valores predeterminados del blog de la función, y luego devolver algunos JSX. No presione “Guardar” todavía porque tiene un error porque no tenemos ningún JSX ahí dentro. Entonces vamos a importar algunas de las cosas que vamos a necesitar usar, vamos a necesitar, por supuesto usar la consulta use shop, porque vamos a estar consultando la API de escaparate para obtener la información de la publicación del blog. Voy a importar CacheLong y GQL, otra vez no le pegues a “Guardar” todavía porque se romperá y luego voy a importar suspenso de react, voy a importar layout desde nuestro servidor de punto de layout de componentes y eso es lo que voy a hacer por ahora. Lo que voy a hacer es probar una consulta por aquí en nuestro GraphiQL, así que voy a acceder al blog de la revista así que vamos a crear una consulta con nombre Voy a nombrar a esta consulta artículos, y entonces podemos acceder al blog a través su identificador que como podemos ver aquí tenemos dos opciones para elegir, revista o noticias, hagamos diario y luego dentro de aquí, accedamos lo siento, artículos, saltando un poco ahí. Tenemos que poner en el parámetro aquí así que vamos a ir por los primeros nueve, y vamos a escribir en nodos aquí y luego en los nodos podemos seleccionar el título de cada artículo, el identificador de cada artículo vamos a necesitar eso navegación y luego la imagen, por lo que la URL y el texto alt. Eso es todo lo que deberíamos necesitar si le pego a “Ejecutar” en eso, verás que recuperamos los primeros 1,2,3,4 así que solo hay cuatro artículos, pesar de que especificamos nueve si hay menos de nueve, eso es lo que recuperamos. Pero la buena noticia es que todo funcionó así que volvamos a nuestro proyecto por aquí, y voy a crear esta consulta, const query es igual a GQL y luego vamos a pegar la consulta aquí, solo voy a dejar la sangría así y fui un idiota y presioné “Guardar” sin poner nada en nuestra declaración de retorno así que vamos a tener que reiniciar nuestro servidor eso no es gran cosa. Antes de hacer eso sin embargo, voy a usar el gancho de consulta de use shop así que voy a agarrar los datos de use shop query, analizando la consulta como tal, use cachelong, como lo hemos hecho anteriormente, preload true y luego debajo de aquí, voy a hacer const. En realidad antes de hacer eso, antes de hacer estructura hagamos lo que solemos hacer y echemos un vistazo a ese objeto de datos. Solo necesito poner alguna forma de JSX aquí de lo contrario, el servidor no se va a ejecutar, así que solo voy a hacer eso y luego vamos a hacer npm run dev aquí abajo, así que ya está funcionando, vamos actualizar y vamos a nuestra ruta de blog, tenemos un problema aquí, no Shopify contexto encontró esto suena como uno de esos errores extraños que podemos arreglar usando yarn dev dash dash force, refresh and as you puede ver que eliminó todos los errores. Sin embargo, lo que estamos buscando es lo que hay en el objeto de datos y como puedes ver aquí dentro de los objetos de datos, tenemos datos nuevamente , tenemos blog nuevamente, y luego tenemos artículos que contienen un objeto así que vamos a desestructurar aquí, así vamos a ir const a partir de los datos que vamos a entrar, acceder a los datos, luego dentro de los datos, acceder al blog como blog. Entonces lo que podemos hacer es dejar que solo consigamos el blog de registro de consola, asegurarnos de que tenemos el correcto. Si miramos por dentro aquí, puedes ver todavía tenemos artículos y dentro de los artículos tenemos una lista de nodos cool. Lo que vamos a hacer es que podríamos entrar aquí y poner el título del blog pero no vamos a hacerlo en este video en particular, realidad todo lo que estamos usando esto es para agarrar los artículos así que voy a ir un paso más profundo en la estructuración y agarrar los artículos, en realidad no creo que necesitemos poner los dos puntos ahí y luego si solo vuelvo a iniciar sesión en la consola, no necesitas hacer estos registros de consola , solo estoy verificando que tengo los datos correctos aquí. Aquí puedes ver si, tienes la lista de nodos aquí mismo. En realidad vamos a entrar e ir a los artículos de nodos, refrescar por aquí y ahora que elimina los nodos del frente, así que solo tenemos artículos, tenemos una matriz de solo objetos de artículo. Eso es todo lo que buscamos vamos y pongamos aquí como nuestro componente padre, el layout ya lo hemos importado desde donde existe y luego porque estamos accediendo a datos asincrónicos, vamos a poner en suspenso, voy a poner todo esto en un contenedor y luego ya configuré una clase para la grilla del artículo que va a ser muy similar a la grilla del producto y luego muy similar a la grilla del producto, voy a repasar todos los artículos, ejecutar mapa sobre eso y luego para cada artículo, abrir esta devolución y no necesitamos poner la devolución aquí, Creo que podemos simplemente poner en un div aquí, poner un poco de JSX aquí, y volvamos el título del artículo. Aquí vamos y tenemos acceso al título del artículo aquí, así que si le pego a “Guardar” en eso, refrescar por aquí, no está pasando nada en este momento, echemos un vistazo. La cuadrícula del artículo está llegando, pero no el título del artículo aquí, y tal vez no debería haber puesto esto ahí. Hagámoslo a ver que pasa, Sí, así que ahí tienes aquí tenemos cuatro divs con todos los títulos. Podríamos hacer esa lista como te mostré antes, pero vamos a convertir estas en cuadrículas muy pronto así que dejémoslas como divs. Puedo crear un componente separado en mi carpeta de componentes por aquí, pero solo voy a usar esto en esta ruta particular del blog, así que lo voy a poner a continuación, y voy para llamarlo Artículo grid item y voy a pasar por el artículo como un prop, y luego vamos a devolver exactamente el mismo JSX que tenemos aquí, y luego así que voy a reemplazar aquí con elemento de cuadrícula de artículo. Entonces lo único que tenemos que hacer es pasar por el artículo como utilería y eso va a pasar eso justo aquí, que luego podemos usar dentro de nuestro JSX aquí abajo. Pulsa Guardar en eso y deberíamos obtener el mismo resultado, lo cual hacemos. Lo que voy a hacer es agregar esta clase aquí para habilitar esto para usar nuestro elemento de cuadrícula de artículo CSS es el nombre de la clase. Entonces vamos a insertar dos enlaces aquí. Uno un enlace de imagen y otro un enlace del título. ¿Hemos importado link e imagen? No, no lo hemos hecho. Importemos enlace e imagen desde hidrógeno. Entonces voy a poner aquí un componente de enlace. Voy a agregar en cadena aquí. Vamos a anidar el artículo dentro de una ruta de blog. Al igual que hicimos con los productos, usa el identificador de artículos como su URL. Estableceremos esa ruta en sólo un segundo. Voy a darle a eso un nombre de clase de contenedor de imagen. Entonces dentro de aquí, vamos a configurar nuestro componente de imagen. Todo lo que necesitamos hacer es pasar por la imagen del artículo y componente de imagen de Shopify manejará el resto aparte de alt, que tenemos que pasar por aquí mismo, artículo, imagen, alt, texto. Fresco. No queremos que se cierre así, queremos que sea autocierre. Barrido. Vamos a ver si eso funciona. Sí, tenemos estas imágenes llegando a través. Hermoso. Aquí, voy a crear otro componente de enlace, enlazando al mismo lugar. Voy a darle a esto un nombre de clase para el CSS de article-grid-item-title. Cerremos esto, para que podamos ver. Cierra eso y luego coloca el título del artículo entre estas etiquetas de enlace. Guarde eso y aleluya, tenemos nuestra grilla de artículos aquí. Si hago clic en uno de estos, básicamente va a ir a una página en blanco porque aún no hemos configurado esa ruta. Vamos a configurarlo ahora mismo. Al igual que hicimos con colecciones y productos, solo necesitamos crear una nueva carpeta llamada blog. Entonces al igual que hicimos con colecciones y productos, configuramos una ruta dinámica [handle] .server.jsx. Aquí es donde haremos la mayor parte de nuestro trabajo para esta lección. Exportemos una función predeterminada. Vamos a llamar a este artículo componente y pasaremos por el artículo como utilería. En nuestra declaración de retorno aquí, solo voy a dar salida a nuestro archivo de diseño y luego averiguaremos qué poner dentro de eso en un poco. Tenemos que importar algunas cosas aquí. Voy a expandir esto en múltiples líneas como lo hemos hecho a lo largo de esta clase e importar algunas cosas de la biblioteca de hidrógeno de Shopify. Voy a necesitar usar ShopQuery. Voy a necesitar usoLocalización. Voy a agarrar el componente SEO porque de qué sirve tener un buen artículo si no está optimizado para motores de búsqueda. Voy a agarrar el GQL y voy a agarrar el componente de imagen. También voy a importar suspenso de react e importar los componentes de layouts por supuesto. Creo que tenemos que volver dos veces, yendo a componentes y luego layout.server. Ahí vamos. A continuación vamos a construir la consulta. Hagámoslo en la interfaz gráfica, para que podamos corregir cualquier error antes de ejecutarlo. También aprovechamos el auto completo haciéndolo de esta manera. Voy a deshacerme de ese viejo y llamemos singular a este artículo de consulta. Antes de abrir eso, realidad necesitamos pasar en qué variable vamos a pasar? Tenemos que decir que vamos a estar pasando en una variable llamada handle, ese es el tipo de cadena. Entonces vamos a apuntar al blog específico de revista. Entonces lo que tenemos que hacer es especificar un artículo por asa. No se llama artículo por alguna razón, se llama ArticleByHandle. Eso es bastante específico, pero obviamente vamos a poner como parámetro nuestro mango. Ábrelo y luego aquí dentro, cuáles son algunas de las cosas que vamos a necesitar recuperar de cada artículo. Obviamente el título, la fecha en que se publicó, el autor que ahora es AutorV2. Que en realidad es una selección, solo necesitamos especificar lo que queremos en esa selección. Yo solo quiero el nombre y luego la imagen, que obviamente es una selección. Vamos a agarrar la URL y el texto alt y luego el contenido HTML, que es el contenido del artículo. Obviamente esto no va a funcionar porque no hemos especificado el valor del identificador, pero al menos hemos utilizado gráficos para ayudarnos a autocompletar algunos de estos campos. Volvamos aquí. Yo sólo voy a anotar aquí consulta como un GQL constante, abre esto y luego aquí vamos. Hemos codificado el hecho que estamos mirando dentro del diario, pero el mango vamos a pasar como una variable. Dentro de aquí podemos agarrar el mango que estamos buscando a través de los parámetros, a través de los apoyos de este componente. Voy a agarrar el asa del artículo y luego vamos a UseShopQuery, así que const data es igual a UseShopQuery. Esta vez sólo voy a poner en la consulta y las variables. Las variables por las que vamos a pasar es simplemente el mango. Como siempre lo hago, voy a registrar en consola los datos que se devuelven de nuestra consulta. Cuando vamos a uno de estos, tenemos un error, no podemos desestructurar el manejador de propiedad del artículo ya que está indefinido. En realidad no tenemos acceso a un objeto de artículo aquí. Echemos un vistazo. Estamos usando lo incorrecto aquí. Necesitamos UserOuteParams. Perdón por eso. UserOuteParams. lo vamos a pasar, solo vamos a usar los RouteParams. Voy a UserOuteParams aquí y me arranco el asa. Vamos a refrescarnos. Uy. Volvamos a nuestro blog. Da click en uno de estos. Ahora tenemos un error de la API de Storefront, el manejador de la variable se proporcionó no válido. Probablemente es porque no usé los corchetes aquí para invocarlo. Vamos a refrescarnos por aquí. Sí. Ahora no obtenemos errores. Déjame echar un vistazo aquí. Nos desplazamos hacia abajo. Ahí vamos. Estamos obteniendo el registro de datos de la consola aquí y nos está devolviendo el artículo del blog de datos por mango y luego objeto dentro de allí. De hecho, podemos simplemente copiar esto y usarlo para nuestra desestructuración. Obviamente no necesitamos usar objeto aquí, pero podemos sacar el artículo por asa y luego nuestra consola registrar el artículo por asa. Refresca por aquí. Si abro esto, verás que tenemos este objeto venir a través del título, PublishedAT, AuthorV2, imagen y el contenido de la misma. Muy chulo. Eso está funcionando ahora, nuestra consulta de API de Storefront. Ahora tenemos esta cosa llamada ArticleByHandle. Realmente no me gusta ArticleByHandles, así que solo voy a intercambiar eso. Sólo voy a llamarlo un artículo. No sé por qué tiene que ser ArticleByHandle. Entonces usaremos el artículo dentro de aquí. Lo que voy a hacer es, voy a abrir un suspenso para el componente SEO digamos tipo artículo y luego los datos solo va a ser el artículo. Quiero hacer de eso una etiqueta de cierre automático. Después de eso lo que vamos a hacer es crear esta página de artículo, así que voy a crear un dev con la clase de artículo, página y contenedor. Entonces voy a tener dos partes para esto. Voy a tener el encabezado de la página del artículo y luego el artículo en sí, el encabezado de la página del artículo es el nombre de la clase. Voy a poner a través del H1, el título del artículo. Voy a crear aquí un lapso para la fecha que aún necesitamos formatearla. Pero digamos que es artículo. Vamos a pasar por el sin formato por ahora. PublishedAt, vamos a separar eso con un punto y poner el artículo authorv2.name aquí para el nombre del autor, y luego después de la cabecera, vamos a crear, abrir un artículo etiqueta HTML aquí es donde vamos a poner nuestra imagen principal del artículo. Voy a pasar por el artículo.imagen, y luego en los textos alt, la imagen del artículo, texto alt. Etiqueta de cierre automático para la imagen, y luego lo que vamos a hacer es el div para traer el HTML. Vamos a ver de nuevo este atributo dangerOuslySetInnerHTML, y solo tenemos que hacer este guión bajo, subrayar HTML es igual y luego no es igual a dos puntos más bien. Después poner en contenido HTML proveniente del objeto article, y luego voy a darle a eso un nombre de clase para formatear el cuerpo del artículo. Fresco. Vamos a terminar ese div, y veamos qué pasa ahora cuando ejecutamos esta página. Mira esto. Tenemos el título, tenemos la fecha que aún necesitamos formatear. Tenemos el nombre completo del autor, y luego tenemos esta imagen aquí, que es la imagen principal. Si cierro esto, puedes ver que esa es la primera parte y luego el contenido del artículo. Esto está prácticamente hecho. Lo único que realmente tenemos que hacer es arreglar esta marca de tiempo aquí. Es bastante jodidamente feo. Obviamente no podemos dejarlo así para el usuario, y también en caso de que no haya artículo, quiero poner en un fallback también. Déjame hacerlo primero. Sólo lo voy a poner en una reserva. Si no hay ningún artículo, entonces volvamos con nuestros componentes de diseño. Todavía usando el contenedor. Simplemente pondremos en un div con artículo no encontrado, y eso también me recuerda construir algo a nuestro componente de aplicación que mencioné en las lecciones de teoría, pero no he implementado en este particular proyecto que está incorporando el componente de rutas y haciendo una ruta NotFound. Podemos usar este comodín seleccionado aquí. Cualquier cosa que se deslice a través de rutas de archivos y llegue hasta aquí, solo traeremos componentes NotFound. Lo siento, esto es bastante tangente, pero solo pensé en ello entonces cuando estaba creando ese respaldo para la página del artículo, y luego debajo de aquí, en realidad hagámoslo aquí. Función NotFound. Esto es solo un pequeño retorno de 404 páginas sin maquetación, que creo que tendremos que importar layout de los componentes, layout.server. Entonces al igual que hicimos para la página del artículo, un contenedor con un div dentro que solo dice página no encontrada. Ahora bien si voy a un artículo que no se encuentra, entonces nuestro hola, vamos a poner algo al azar así. Volverá artículo no encontrado. Si vamos en la ruta raíz y tecleamos algo aleatorio como hola ahí, dirá página no encontrada. Eso es un pequeño bono para ti ahí. Actualicemos en realidad el enlace 3. Estoy rebotando un poco por aquí, pero es el video extra. Dame algunos tipos flojos. En layout.server, pongamos en un enlace al blog. Deshazte de ese feo enlace 3, y luego si hago clic en “Blog”, nos va a llevar al blog, y luego si hago clic aquí, llegaremos a uno de nuestros artículos, y así sí. Como decía antes de irme en esa tangente, necesitamos formatear esta fecha, que es un poco más complicada de lo que nos gustaría, pero estamos trayendo, usa la localización aquí, que es un gancho de hidrógeno. Podemos usar la estructuración para sacar algunas cosas aquí desde el gancho de localización de uso. Lo que vamos a lograr es el lenguaje, IsoCode. LanguageCode es como lo vamos a llamar, y luego country sacará el isoCode del país y lo traerá a su propia variable llamada countryCode. Esto va a ser para la siguiente función que usemos. Vamos a crear una fecha formateada, y vamos a crear nuevos objetos de formato de fecha y hora internacionales. Esta es una especificación dentro de JavaScript. Esto no es reaccionar ni hidrógeno. Entonces abriremos una cadena aquí, poniendo en esas dos variables que acabamos de crear y que acabamos de sacar de la localización de uso. El primero LanguageCode, luego dash countryCode, y luego el siguiente argumento irá y pondrá en un objeto año numérico, mes largo y día numérico. Todo esto depende de tu preferencia personal. Pero vamos a tener un año numérico, una pantalla larga para el mes, lo que creo que solo le gusta si es enero, va a dar salida a enero por completo, y luego el día va a ser numérico también, lo que tiene sentido. Luego después de aquí, vamos a ejecutar formatos en ese objeto recién creado y luego ejecutarlo a través un nuevo objeto, Article.Publishedat. Eso parece bastante agitado, pero básicamente estamos convirtiendo esa fecha PublishedAt en este formato de fecha internacional. Ahora que tenemos esta fecha formateada, solo podemos bajar aquí y reemplazar artículo PublishedAt con la fecha formateada, y a menos que hayamos cometido algunos errores aquí, que parece que tenemos. ¿Qué hemos hecho? No se puede acceder al artículo antes de inicialización. He hecho la variable artículo después de haber escrito todo este código, así que solo necesitaba moverlo antes, y luego si presiono Guardar en esa actualización por aquí puedes ver el nombre de forma larga del mes que es el 3 de junio de 2022 de Ben cell o como sea que pronuncies su nombre, y ahí está tu artículo. Si vamos a otros artículos de este blog, verás que funciona igual de bien. Eso es un pequeño bono para ustedes. La página del blog, siento que esta lección debería ser bastante buena práctica para ustedes porque como mencioné anteriormente, estamos corriendo como una secuencia una y otra vez de construir estos componentes, capturando datos de la API de escaparate usando consulta nítida usada para tomar los datos que queremos dentro de esos datos devueltos y luego usarlos dentro de nuestro componente. Entonces al mismo tiempo, trayendo algunos de estos otros componentes y ganchos de Shopify, que nos hacen la vida mucho más fácil. Eso básicamente concluye esta clase chicos. Espero que lo hayan disfrutado. Cualquier duda como siempre las deja abajo, pero saltemos a la conclusión ahora donde hablaremos sobre tu proyecto de clase. Te veré ahí. 15. Conclusión y proyecto de clase: Esto concluye esta clase sobre Shopify hidrógeno. Para tu proyecto de clase, te animo a crear tu propio escaparate personalizado usando hidrógeno. Para inspirarte, puedes tomar lo que hemos hecho hasta ahora en esta clase y ampliarlo. Podrías construir una galería de productos para traer más fotos de productos desde el backend, crear un cajón para alojar el carrito del usuario sin que salgan de la página del producto, o construir secciones personalizadas para mostrar las mejores características de su producto. La elección es suya. Como siempre, si tienes alguna duda o inquietud, deja un comentario en el cuadro de discusión a continuación, y haré todo lo posible para señalarte en la dirección correcta. Gracias como siempre, por ver y espero volver a verte en algunas de mis otras clases.