Solución de errores de hidratación en carritos con Next.js y Shopify

Clase 48 de 57Curso de Next.js 14

Resumen

¿Cómo integrar el checkout de Shopify a nuestro carrito de compras?

Bienvenidos a una inmersión profunda en la integración del checkout de Shopify con nuestro carrito de compras. En este tutorial, exploraremos cómo solucionar problemas de hidratación en React, manejar componentes de carga dinámica y finalmente implementar el sistema de compras usando Shopify.

¿Qué es un problema de hidratación en React?

El problema de hidratación en React ocurre cuando hay una discordancia entre el HTML que el servidor envía al cliente y lo que se renderiza finalmente en el cliente. A menudo, esto crea inconsistencias visibles entre lo esperado y lo presentado, especialmente cuando algunos datos o componentes dependen de estados o almacenamientos locales que no coinciden instantáneamente.

  • Hidratación: Es el proceso de integrar el JavaScript necesario en la estructura HTML proporcionada desde el servidor para hacer que el componente funcione adecuadamente en la aplicación.
  • Solución: Utilizamos Next Dynamic para manejar componentes dinámicos, evitando que pasen por el proceso de renderizado en el lado del servidor.

¿Cómo manejar componentes de carga dinámica en Next.js?

Para evitar problemas de hidratación, específicamente en un carrito de compras que depende de localStorage, emplearemos import dynamic de Next.js. Este manejo permite que los componentes carguen únicamente en el cliente.

import dynamic from 'next/dynamic';

const NoSSRShoppingCart = dynamic(() => import('./ShoppingCart'), {
  ssr: false,
});

export default function Header() {
  return (
    <header>
      {/* Otros componentes */}
      <NoSSRShoppingCart />
    </header>
  );
}
  • import dynamic: Se utiliza para importar componentes que no deberían ser renderizados en el lado del servidor.
  • ssr: false: Evita que el componente pase por el Server-Side Rendering.

¿Cómo implementar el sistema de compras de Shopify?

Una vez superados los problemas de hidratación, el siguiente paso es vincular nuestro carrito con Shopify para completar las compras.

Obtener la URL de checkout de Shopify

Usaremos GraphQL con una mutación para crear un carrito (create cart) que devuelva una URL de checkout.

async function handleCreateCart() {
  const token = // Obtener token del acceso
  if (!token) redirectToLogin();

  const userEmail = // Extraer correo electrónico
  const variables = {
    buyerIdentity: { accessToken: token, email: userEmail },
    lines: // Obtener y formatear productos del carrito
  };
  
  const response = await fetch('/api/shopify', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ query: CREATE_CART_MUTATION, variables }),
  });

  const data = await response.json();
  return data.data.cartCreate.cart.checkoutUrl;
}
  • buyerIdentity: Identifica al comprador usando un token de acceso y correo electrónico.
  • lines: Productos en el carrito, formateados para GraphQL.

Manejar la acción de compra y redirección

Implementaremos la lógica para limpiar el carrito y redirigir al usuario a la página de Shopify tras crear un checkout exitoso.

async function handleBuy() {
  try {
    setIsBuying(true);
    const checkoutUrl = await handleCreateCart();
    if (checkoutUrl) {
      localStorage.removeItem('shopping-cart');
      window.location.href = checkoutUrl;
    }
  } catch (error) {
    console.error(error);
  } finally {
    setIsBuying(false);
  }
}
  • setIsBuying(true): Indica que se está procesando una compra.
  • localStorage.removeItem('shopping-cart'): Limpia el carrito luego de enviar la compra.
  • window.location.href = checkoutUrl: Dirige al usuario al checkout de Shopify.

Ajustes finales y pruebas en Shopify

Para probar la funcionalidad, configuraremos una pasarela de pagos de prueba en Shopify y realizamos una compra simulada.

  • Configuración de pruebas: En Shopify, activamos pagos de prueba utilizando el proveedor 'Bogus' para imitar transacciones.

Este flujo no solo asegura que la funcionalidad de compra en línea esté activa y corriendo, sino que también mejora la experiencia del usuario al reducir errores de renderizado. ¡Continúa explorando y experimentando! implementar correctamente estas técnicas te acercará más al dominio completo de integraciones e-commerce.