{"version":3,"file":"cart-hooks.mjs","sources":["../../src/cart-hooks.tsx"],"sourcesContent":["import {useState, useCallback} from 'react';\nimport {useShop} from './ShopifyProvider.js';\nimport {flattenConnection} from './flatten-connection.js';\nimport {CartInput, Cart as CartType} from './storefront-api-types.js';\nimport {CartCreate, defaultCartFragment} from './cart-queries.js';\nimport {Cart} from './cart-types.js';\nimport {\n  SHOPIFY_STOREFRONT_ID_HEADER,\n  SHOPIFY_STOREFRONT_Y_HEADER,\n  SHOPIFY_STOREFRONT_S_HEADER,\n} from './cart-constants.js';\nimport type {StorefrontApiResponseOkPartial} from './storefront-api-response.types.js';\nimport {\n  getTrackingValues,\n  SHOPIFY_UNIQUE_TOKEN_HEADER,\n  SHOPIFY_VISIT_TOKEN_HEADER,\n} from './tracking-utils.js';\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function useCartFetch() {\n  const {\n    storefrontId,\n    getPublicTokenHeaders,\n    getStorefrontApiUrl,\n    sameDomainForStorefrontApi,\n  } = useShop();\n\n  return useCallback(\n    <ReturnDataGeneric,>({\n      query,\n      variables,\n    }: {\n      query: string;\n      variables: Record<string, unknown>;\n    }): Promise<StorefrontApiResponseOkPartial<ReturnDataGeneric>> => {\n      const headers = getPublicTokenHeaders({contentType: 'json'});\n\n      if (storefrontId) {\n        headers[SHOPIFY_STOREFRONT_ID_HEADER] = storefrontId;\n      }\n\n      if (!sameDomainForStorefrontApi) {\n        // If we are in cross-domain mode, add tracking headers manually.\n        // Otherwise, for same-domain we rely on the browser to attach cookies automatically.\n        const {uniqueToken, visitToken} = getTrackingValues();\n        if (uniqueToken) {\n          headers[SHOPIFY_STOREFRONT_Y_HEADER] = uniqueToken;\n          headers[SHOPIFY_UNIQUE_TOKEN_HEADER] = uniqueToken;\n        }\n        if (visitToken) {\n          headers[SHOPIFY_STOREFRONT_S_HEADER] = visitToken;\n          headers[SHOPIFY_VISIT_TOKEN_HEADER] = visitToken;\n        }\n      }\n\n      return fetch(getStorefrontApiUrl(), {\n        method: 'POST',\n        headers,\n        body: JSON.stringify({\n          query: query.toString(),\n          variables,\n        }),\n      })\n        .then(\n          (res) =>\n            res.json() as StorefrontApiResponseOkPartial<ReturnDataGeneric>,\n        )\n        .catch((error) => {\n          return {\n            data: undefined,\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n            errors: error?.toString(),\n          };\n        });\n    },\n    [\n      getPublicTokenHeaders,\n      storefrontId,\n      getStorefrontApiUrl,\n      sameDomainForStorefrontApi,\n    ],\n  );\n}\n\nexport function useInstantCheckout(): {\n  cart: Cart | undefined;\n  checkoutUrl: Cart['checkoutUrl'];\n  error: string | undefined;\n  createInstantCheckout: (cartInput: CartInput) => Promise<void>;\n} {\n  const [cart, updateCart] = useState<Cart | undefined>();\n  const [checkoutUrl, updateCheckoutUrl] = useState<Cart['checkoutUrl']>();\n  const [error, updateError] = useState<string | undefined>();\n\n  const fetch = useCartFetch();\n\n  const createInstantCheckout = useCallback(\n    async (cartInput: CartInput) => {\n      const {data, errors} = await fetch<{\n        cartCreate: {cart: CartType};\n      }>({\n        query: CartCreate(defaultCartFragment),\n        variables: {\n          input: cartInput,\n        },\n      });\n\n      if (errors) {\n        // eslint-disable-next-line @typescript-eslint/no-base-to-string\n        updateError(errors.toString());\n        updateCart(undefined);\n        updateCheckoutUrl(undefined);\n      }\n\n      if (data?.cartCreate?.cart) {\n        const dataCart = data.cartCreate.cart;\n        updateCart({\n          ...dataCart,\n          lines: flattenConnection(dataCart.lines),\n          note: dataCart.note ?? undefined,\n        });\n        updateCheckoutUrl(dataCart.checkoutUrl);\n      }\n    },\n    [fetch],\n  );\n\n  return {cart, checkoutUrl, error, createInstantCheckout};\n}\n"],"names":[],"mappings":";;;;AAmBO,SAAS,eAAe;AAC7B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE,QAAA;AAEJ,SAAO;AAAA,IACL,CAAqB;AAAA,MACnB;AAAA,MACA;AAAA,IAAA,MAIgE;AAChE,YAAM,UAAU,sBAAsB,EAAC,aAAa,QAAO;AAE3D,UAAI,cAAc;AAChB,gBAAQ,4BAA4B,IAAI;AAAA,MAC1C;AAEA,UAAI,CAAC,4BAA4B;AAG/B,cAAM,EAAC,aAAa,WAAA,IAAc,kBAAA;AAClC,YAAI,aAAa;AACf,kBAAQ,2BAA2B,IAAI;AACvC,kBAAQ,2BAA2B,IAAI;AAAA,QACzC;AACA,YAAI,YAAY;AACd,kBAAQ,2BAA2B,IAAI;AACvC,kBAAQ,0BAA0B,IAAI;AAAA,QACxC;AAAA,MACF;AAEA,aAAO,MAAM,uBAAuB;AAAA,QAClC,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO,MAAM,SAAA;AAAA,UACb;AAAA,QAAA,CACD;AAAA,MAAA,CACF,EACE;AAAA,QACC,CAAC,QACC,IAAI,KAAA;AAAA,MAAK,EAEZ,MAAM,CAAC,UAAU;AAChB,eAAO;AAAA,UACL,MAAM;AAAA;AAAA,UAEN,QAAQ,+BAAO;AAAA,QAAS;AAAA,MAE5B,CAAC;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAEJ;"}