import { ReadonlyURLSearchParams } from 'next/navigation'; import { Cart } from './shopify/types'; import { ShopifyAnalyticsProduct } from '@shopify/hydrogen-react'; export const createUrl = (pathname: string, params: URLSearchParams | ReadonlyURLSearchParams) => { const paramsString = params.toString(); const queryString = `${paramsString.length ? '?' : ''}${paramsString}`; return `${pathname}${queryString}`; }; export const ensureStartsWith = (stringToCheck: string, startsWith: string) => stringToCheck.startsWith(startsWith) ? stringToCheck : `${startsWith}${stringToCheck}`; export const validateEnvironmentVariables = () => { const requiredEnvironmentVariables = ['SHOPIFY_STORE_DOMAIN', 'SHOPIFY_STOREFRONT_ACCESS_TOKEN']; const missingEnvironmentVariables = [] as string[]; requiredEnvironmentVariables.forEach((envVar) => { if (!process.env[envVar]) { missingEnvironmentVariables.push(envVar); } }); if (missingEnvironmentVariables.length) { throw new Error( `The following environment variables are missing. Your site will not work without them. Read more: https://vercel.com/docs/integrations/shopify#configure-environment-variables\n\n${missingEnvironmentVariables.join( '\n' )}\n` ); } if ( process.env.SHOPIFY_STORE_DOMAIN?.includes('[') || process.env.SHOPIFY_STORE_DOMAIN?.includes(']') ) { throw new Error( 'Your `SHOPIFY_STORE_DOMAIN` environment variable includes brackets (ie. `[` and / or `]`). Your site will not work with them there. Please remove them.' ); } }; /** * This function takes a cart and a quantity and returns an array of ShopifyAnalyticsProduct objects. * */ export const productToAnalytics = ( cartItems: Cart['lines'], quantity: number, variantId: string ) => { const line = cartItems.find((line) => line.merchandise.id === variantId); if (!line) return; const { merchandise } = line; if (!merchandise) return; return [ { productGid: merchandise?.product.id, variantGid: variantId, name: merchandise?.product.title, variantName: merchandise?.title, price: merchandise?.price.amount, quantity } as ShopifyAnalyticsProduct ]; };