{"version":3,"file":"ShopPayButton.mjs","sources":["../../src/ShopPayButton.tsx"],"sourcesContent":["import {useShop} from './ShopifyProvider.js';\nimport {useLoadScript} from './load-script.js';\n\n// By using 'never' in the \"or\" cases below, it makes these props \"exclusive\" and means that you cannot pass both of them; you must pass either one OR the other.\ntype ShopPayButtonProps = {\n  /** A string of classes to apply to the `div` that wraps the Shop Pay button. */\n  className?: string;\n  /** A string that's applied to the [CSS custom property (variable)](https://developer.mozilla.org/en-US/docs/Web/CSS/--*) `--shop-pay-button-width` for the [Buy with Shop Pay component](https://shopify.dev/custom-storefronts/tools/web-components#buy-with-shop-pay-component). */\n  width?: string;\n} & (\n  | {\n      /** An array of IDs of the variants to purchase with Shop Pay. This will only ever have a quantity of 1 for each variant. If you want to use other quantities, then use 'variantIdsAndQuantities'. */\n      variantIds: string[];\n      /** An array of variant IDs and quantities to purchase with Shop Pay. */\n      variantIdsAndQuantities?: never;\n    }\n  | {\n      /** An array of IDs of the variants to purchase with Shop Pay. This will only ever have a quantity of 1 for each variant. If you want to use other quantities, then use 'variantIdsAndQuantities'. */\n      variantIds?: never;\n      /** An array of variant IDs and quantities to purchase with Shop Pay. */\n      variantIdsAndQuantities: Array<{\n        id: string;\n        quantity: number;\n      }>;\n    }\n);\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace JSX {\n    interface IntrinsicElements {\n      'shop-pay-button': {\n        variants: string;\n        'store-url': string;\n      };\n    }\n  }\n}\n\nconst SHOPJS_URL =\n  'https://cdn.shopify.com/shopifycloud/shop-js/v1.0/client.js';\n\n/**\n * The `ShopPayButton` component renders a button that redirects to the Shop Pay checkout.\n * It renders a [`<shop-pay-button>`](https://shopify.dev/custom-storefronts/tools/web-components) custom element, for which it will lazy-load the source code automatically.\n * It relies on the `<ShopProvider>` context provider.\n */\nexport function ShopPayButton({\n  variantIds,\n  className,\n  variantIdsAndQuantities,\n  width,\n}: ShopPayButtonProps) {\n  const {storeDomain} = useShop();\n  const shopPayLoadedStatus = useLoadScript(SHOPJS_URL);\n\n  let ids: string[];\n\n  if (variantIds && variantIdsAndQuantities) {\n    throw new Error(DoublePropsErrorMessage);\n  }\n\n  if (variantIds) {\n    ids = variantIds.reduce<string[]>((prev, curr) => {\n      const bareId = getIdFromGid(curr);\n      if (bareId) {\n        prev.push(bareId);\n      }\n      return prev;\n    }, []);\n  } else if (variantIdsAndQuantities) {\n    ids = variantIdsAndQuantities.reduce<string[]>((prev, curr) => {\n      const bareId = getIdFromGid(curr?.id);\n      if (bareId) {\n        prev.push(`${bareId}:${curr?.quantity ?? 1}`);\n      }\n      return prev;\n    }, []);\n  } else {\n    throw new Error(MissingPropsErrorMessage);\n  }\n\n  const style = width\n    ? ({\n        '--shop-pay-button-width': width,\n      } as React.CSSProperties)\n    : undefined;\n\n  return (\n    <div className={className} style={style}>\n      {shopPayLoadedStatus === 'done' && (\n        <shop-pay-button\n          store-url={`https://${storeDomain}`}\n          variants={ids.join(',')}\n        />\n      )}\n    </div>\n  );\n}\n\n/**\n * Takes a string in the format of \"gid://shopify/ProductVariant/41007289630776\" and returns a string of the ID part at the end: \"41007289630776\"\n */\nexport function getIdFromGid(id?: string) {\n  if (!id) return;\n  return id.split('/').pop();\n}\n\nexport const MissingPropsErrorMessage = `You must pass in either \"variantIds\" or \"variantIdsAndQuantities\" to ShopPayButton`;\nexport const DoublePropsErrorMessage = `You must provide either a variantIds or variantIdsAndQuantities prop, but not both in the ShopPayButton component`;\n"],"names":["SHOPJS_URL","ShopPayButton","variantIds","className","variantIdsAndQuantities","width","storeDomain","useShop","shopPayLoadedStatus","useLoadScript","ids","Error","DoublePropsErrorMessage","reduce","prev","curr","bareId","getIdFromGid","push","id","quantity","MissingPropsErrorMessage","style","undefined","_jsx","join","split","pop"],"mappings":";;;AAuCA,MAAMA,aACJ;AAOK,SAASC,cAAc;AAAA,EAC5BC;AAAAA,EACAC;AAAAA,EACAC;AAAAA,EACAC;AAJ4B,GAKP;AACf,QAAA;AAAA,IAACC;AAAAA,MAAeC,QAAtB;AACMC,QAAAA,sBAAsBC,cAAcT,UAAD;AAErCU,MAAAA;AAEJ,MAAIR,cAAcE,yBAAyB;AACnC,UAAA,IAAIO,MAAMC,uBAAV;AAAA,EACP;AAED,MAAIV,YAAY;AACdQ,UAAMR,WAAWW,OAAiB,CAACC,MAAMC,SAAS;AAC1CC,YAAAA,SAASC,aAAaF,IAAD;AAC3B,UAAIC,QAAQ;AACVF,aAAKI,KAAKF,MAAV;AAAA,MACD;AACMF,aAAAA;AAAAA,IACR,GAAE,CANG,CAAA;AAAA,aAOGV,yBAAyB;AAClCM,UAAMN,wBAAwBS,OAAiB,CAACC,MAAMC,SAAS;;AACvDC,YAAAA,SAASC,aAAaF,6BAAMI,EAAP;AAC3B,UAAIH,QAAQ;AACVF,aAAKI,KAAM,GAAEF,WAAUD,kCAAMK,aAANL,YAAkB,GAAzC;AAAA,MACD;AACMD,aAAAA;AAAAA,IACR,GAAE,CANG,CAAA;AAAA,EAAA,OAOD;AACC,UAAA,IAAIH,MAAMU,wBAAV;AAAA,EACP;AAED,QAAMC,QAAQjB,QACT;AAAA,IACC,2BAA2BA;AAAAA,EAE7BkB,IAAAA;AAEJ,6BACE,OAAA;AAAA,IAAK;AAAA,IAAsB;AAAA,IAA3B,UACGf,wBAAwB,UACvBgB,oBAAA,mBAAA;AAAA,MACE,aAAY,WAAUlB;AAAAA,MACtB,UAAUI,IAAIe,KAAK,GAAT;AAAA,IAAA,CAFZ;AAAA,EAAA,CAHN;AAUD;AAKM,SAASR,aAAaE,IAAa;AACxC,MAAI,CAACA;AAAI;AACT,SAAOA,GAAGO,MAAM,GAAT,EAAcC,IAArB;AACD;AAEM,MAAMN,2BAA4B;AAClC,MAAMT,0BAA2B;"}