@beamimpact/web-sdk 1.30.1 → 1.31.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -0
- package/dist/chunks/_share-dialog-dependencies-Qc0imrGB.esm.js +2 -0
- package/dist/chunks/_share-dialog-dependencies-Qc0imrGB.esm.js.map +1 -0
- package/dist/chunks/_share-dialog-dependencies-rEYm7Xgo.esm.js +2 -0
- package/dist/chunks/_share-dialog-dependencies-rEYm7Xgo.esm.js.map +1 -0
- package/dist/chunks/beam-errors-AMvTvR1C.esm.js +2 -0
- package/dist/chunks/{beam-errors-l02WBee5.esm.js.map → beam-errors-AMvTvR1C.esm.js.map} +1 -1
- package/dist/chunks/cart-contents-P2GzTrNn.esm.d.ts +10 -0
- package/dist/chunks/events-60jQoHQi.esm.d.ts +108 -0
- package/dist/chunks/events-wNy5BoJV.esm.js +2 -0
- package/dist/chunks/events-wNy5BoJV.esm.js.map +1 -0
- package/dist/chunks/index--N2RR1Fn.esm.js +2 -0
- package/dist/chunks/index--N2RR1Fn.esm.js.map +1 -0
- package/dist/chunks/{index-Iupghntz.esm.d.ts → index-CItwC8WO.esm.d.ts} +1 -1
- package/dist/chunks/index-FDDoUJQk.esm.js +2 -0
- package/dist/chunks/index-FDDoUJQk.esm.js.map +1 -0
- package/dist/chunks/index-JrZwQjr2.esm.js +2 -0
- package/dist/chunks/index-JrZwQjr2.esm.js.map +1 -0
- package/dist/chunks/{index-h39_A7fk.esm.d.ts → index-L59voCOg.esm.d.ts} +1 -1
- package/dist/chunks/index-L8CVKt4D.esm.js +2 -0
- package/dist/chunks/index-L8CVKt4D.esm.js.map +1 -0
- package/dist/chunks/index-YPrpyEl9.esm.js +2 -0
- package/dist/chunks/index-YPrpyEl9.esm.js.map +1 -0
- package/dist/chunks/{index-4o5tH5RA.esm.d.ts → index-Zzs4grqC.esm.d.ts} +17 -7
- package/dist/chunks/index-czOZQ1Sz.esm.js +2 -0
- package/dist/chunks/index-czOZQ1Sz.esm.js.map +1 -0
- package/dist/chunks/index-g5lw5BB-.esm.js +2 -0
- package/dist/chunks/index-g5lw5BB-.esm.js.map +1 -0
- package/dist/chunks/index-iTqsULiK.esm.d.ts +15 -0
- package/dist/chunks/{index-IXwIgGSV.esm.js → index-jFZJm9-Y.esm.js} +2 -2
- package/dist/chunks/{index-IXwIgGSV.esm.js.map → index-jFZJm9-Y.esm.js.map} +1 -1
- package/dist/chunks/index-l_MORcbP.esm.d.ts +15 -0
- package/dist/chunks/index-np6s8UdD.esm.js +2 -0
- package/dist/chunks/index-np6s8UdD.esm.js.map +1 -0
- package/dist/chunks/{local-storage-Rrnk_Dg-.esm.js → local-storage-GYvYzZ_j.esm.js} +2 -2
- package/dist/chunks/{local-storage-Rrnk_Dg-.esm.js.map → local-storage-GYvYzZ_j.esm.js.map} +1 -1
- package/dist/chunks/{localize-nH-zlK_j.esm.js → localize-kPkHxPNe.esm.js} +2 -2
- package/dist/chunks/{localize-nH-zlK_j.esm.js.map → localize-kPkHxPNe.esm.js.map} +1 -1
- package/dist/chunks/{network-listeners-CEOxhlYW.esm.js → network-listeners-O5LKv8Yy.esm.js} +2 -2
- package/dist/chunks/{network-listeners-CEOxhlYW.esm.js.map → network-listeners-O5LKv8Yy.esm.js.map} +1 -1
- package/dist/chunks/{cart-contents-iOS70Cw8.esm.d.ts → openapi-spec-scRfHArN.esm.d.ts} +51 -23
- package/dist/chunks/{order-page-R2OPVBti.esm.js → order-page-1-A-Yhbv.esm.js} +2 -2
- package/dist/chunks/{order-page-R2OPVBti.esm.js.map → order-page-1-A-Yhbv.esm.js.map} +1 -1
- package/dist/chunks/{order-page-gj5qxIFJ.esm.d.ts → order-page-40SzBc--.esm.d.ts} +3 -2
- package/dist/chunks/{order-page-zS1d11nZ.esm.js → order-page-l0phiTZ7.esm.js} +2 -2
- package/dist/chunks/{order-page-zS1d11nZ.esm.js.map → order-page-l0phiTZ7.esm.js.map} +1 -1
- package/dist/chunks/{remote-session-mmQFfNd6.esm.js → remote-session-V4YG-mcS.esm.js} +2 -2
- package/dist/chunks/{remote-session-mmQFfNd6.esm.js.map → remote-session-V4YG-mcS.esm.js.map} +1 -1
- package/dist/chunks/routes-N9ZmkAD6.esm.js +2 -0
- package/dist/chunks/routes-N9ZmkAD6.esm.js.map +1 -0
- package/dist/chunks/types-7kSi85Gv.esm.d.ts +10 -0
- package/dist/chunks/{update-cart-SgZzL7m7.esm.d.ts → update-cart-3nc7XKMm.esm.d.ts} +1 -1
- package/dist/chunks/update-cart-TJ7G8Xfl.esm.js +2 -0
- package/dist/chunks/update-cart-TJ7G8Xfl.esm.js.map +1 -0
- package/dist/components/community-impact.d.ts +1 -1
- package/dist/components/community-impact.esm.js +1 -1
- package/dist/components/community-impact.esm.js.map +1 -1
- package/dist/components/community-impact.js +1 -1
- package/dist/components/community-impact.js.map +1 -1
- package/dist/components/cumulative-impact.d.ts +1 -1
- package/dist/components/cumulative-impact.esm.js +1 -1
- package/dist/components/cumulative-impact.esm.js.map +1 -1
- package/dist/components/cumulative-impact.js +1 -1
- package/dist/components/cumulative-impact.js.map +1 -1
- package/dist/components/impact-overview.d.ts +1 -1
- package/dist/components/impact-overview.esm.js +2 -2
- package/dist/components/impact-overview.esm.js.map +1 -1
- package/dist/components/impact-overview.js +2 -2
- package/dist/components/impact-overview.js.map +1 -1
- package/dist/components/index.d.ts +3 -2
- package/dist/components/index.esm.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/post-purchase.d.ts +5 -3
- package/dist/components/post-purchase.esm.js +3 -3
- package/dist/components/post-purchase.esm.js.map +1 -1
- package/dist/components/post-purchase.js +3 -3
- package/dist/components/post-purchase.js.map +1 -1
- package/dist/components/redeem-transaction.d.ts +4 -3
- package/dist/components/redeem-transaction.esm.js +1 -1
- package/dist/components/redeem-transaction.esm.js.map +1 -1
- package/dist/components/redeem-transaction.js +1 -1
- package/dist/components/redeem-transaction.js.map +1 -1
- package/dist/components/select-nonprofit.d.ts +4 -3
- package/dist/components/select-nonprofit.esm.js +1 -1
- package/dist/components/select-nonprofit.esm.js.map +1 -1
- package/dist/components/select-nonprofit.js +1 -1
- package/dist/components/select-nonprofit.js.map +1 -1
- package/dist/components/shopify.d.ts +6 -5
- package/dist/components/shopify.esm.js +1 -1
- package/dist/components/shopify.esm.js.map +1 -1
- package/dist/components/shopify.js +1 -1
- package/dist/components/shopify.js.map +1 -1
- package/dist/index.d.ts +12 -9
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/integrations/beam.d.ts +90 -0
- package/dist/integrations/beam.esm.js +2 -0
- package/dist/integrations/beam.esm.js.map +1 -0
- package/dist/integrations/beam.js +2 -0
- package/dist/integrations/beam.js.map +1 -0
- package/dist/integrations/cart.d.ts +3 -2
- package/dist/integrations/cart.esm.js +1 -1
- package/dist/integrations/cart.js +1 -1
- package/dist/integrations/index.d.ts +11 -8
- package/dist/integrations/index.esm.js +1 -1
- package/dist/integrations/index.js +1 -1
- package/dist/integrations/logs.d.ts +2 -0
- package/dist/integrations/logs.esm.js +2 -0
- package/dist/integrations/logs.esm.js.map +1 -0
- package/dist/integrations/logs.js +2 -0
- package/dist/integrations/logs.js.map +1 -0
- package/dist/integrations/session.esm.js +1 -1
- package/dist/integrations/session.js +1 -1
- package/dist/integrations/shopify.d.ts +5 -4
- package/dist/integrations/shopify.esm.js +1 -1
- package/dist/integrations/shopify.js +1 -1
- package/dist/integrations/statsig.d.ts +53 -0
- package/dist/integrations/statsig.esm.js +12 -0
- package/dist/integrations/statsig.esm.js.map +1 -0
- package/dist/integrations/statsig.js +12 -0
- package/dist/integrations/statsig.js.map +1 -0
- package/dist/integrations/utils.d.ts +6 -3
- package/dist/integrations/utils.esm.js +1 -1
- package/dist/integrations/utils.js +1 -1
- package/dist/react/community-impact.d.ts +1 -1
- package/dist/react/community-impact.esm.js +1 -1
- package/dist/react/community-impact.esm.js.map +1 -1
- package/dist/react/community-impact.js +1 -1
- package/dist/react/community-impact.js.map +1 -1
- package/dist/react/cumulative-impact.d.ts +1 -1
- package/dist/react/cumulative-impact.esm.js +1 -1
- package/dist/react/cumulative-impact.esm.js.map +1 -1
- package/dist/react/cumulative-impact.js +1 -1
- package/dist/react/cumulative-impact.js.map +1 -1
- package/dist/react/impact-overview.d.ts +1 -1
- package/dist/react/impact-overview.esm.js +1 -1
- package/dist/react/impact-overview.esm.js.map +1 -1
- package/dist/react/impact-overview.js +1 -1
- package/dist/react/impact-overview.js.map +1 -1
- package/dist/react/index.d.ts +4 -3
- package/dist/react/index.esm.js +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/post-purchase.d.ts +3 -2
- package/dist/react/post-purchase.esm.js +1 -1
- package/dist/react/post-purchase.esm.js.map +1 -1
- package/dist/react/post-purchase.js +1 -1
- package/dist/react/post-purchase.js.map +1 -1
- package/dist/react/redeem-transaction.d.ts +4 -3
- package/dist/react/redeem-transaction.esm.js +1 -1
- package/dist/react/redeem-transaction.esm.js.map +1 -1
- package/dist/react/redeem-transaction.js +1 -1
- package/dist/react/redeem-transaction.js.map +1 -1
- package/dist/react/select-nonprofit.d.ts +4 -3
- package/dist/react/select-nonprofit.esm.js +1 -1
- package/dist/react/select-nonprofit.esm.js.map +1 -1
- package/dist/react/select-nonprofit.js +1 -1
- package/dist/react/select-nonprofit.js.map +1 -1
- package/package.json +2 -2
- package/dist/chunks/_share-dialog-dependencies--e9Yfdxt.esm.js +0 -2
- package/dist/chunks/_share-dialog-dependencies--e9Yfdxt.esm.js.map +0 -1
- package/dist/chunks/_share-dialog-dependencies-UDSD9RFy.esm.js +0 -2
- package/dist/chunks/_share-dialog-dependencies-UDSD9RFy.esm.js.map +0 -1
- package/dist/chunks/beam-errors-l02WBee5.esm.js +0 -2
- package/dist/chunks/events-6sWBONuH.esm.d.ts +0 -43
- package/dist/chunks/events-rRSQYdP1.esm.js +0 -2
- package/dist/chunks/events-rRSQYdP1.esm.js.map +0 -1
- package/dist/chunks/index--XzN0d8d.esm.js +0 -2
- package/dist/chunks/index--XzN0d8d.esm.js.map +0 -1
- package/dist/chunks/index-FNXmLkmP.esm.js +0 -2
- package/dist/chunks/index-FNXmLkmP.esm.js.map +0 -1
- package/dist/chunks/index-FmuWTWCO.esm.js +0 -2
- package/dist/chunks/index-FmuWTWCO.esm.js.map +0 -1
- package/dist/chunks/index-MAzMDqhV.esm.js +0 -2
- package/dist/chunks/index-MAzMDqhV.esm.js.map +0 -1
- package/dist/chunks/index-NYK2Edpr.esm.js +0 -2
- package/dist/chunks/index-NYK2Edpr.esm.js.map +0 -1
- package/dist/chunks/index-qKG37btQ.esm.js +0 -2
- package/dist/chunks/index-qKG37btQ.esm.js.map +0 -1
- package/dist/chunks/index-wuUhCB0N.esm.d.ts +0 -14
- package/dist/chunks/logger-ad87ovol.esm.js +0 -2
- package/dist/chunks/logger-ad87ovol.esm.js.map +0 -1
- package/dist/chunks/routes-g2iqYrq1.esm.js +0 -2
- package/dist/chunks/routes-g2iqYrq1.esm.js.map +0 -1
- package/dist/chunks/types-4zLXwf8o.esm.d.ts +0 -4
- package/dist/chunks/update-cart--iw762bF.esm.js +0 -2
- package/dist/chunks/update-cart--iw762bF.esm.js.map +0 -1
package/dist/chunks/{network-listeners-CEOxhlYW.esm.js.map → network-listeners-O5LKv8Yy.esm.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-listeners-
|
|
1
|
+
{"version":3,"file":"network-listeners-O5LKv8Yy.esm.js","sources":["../../src/shared/wait-for-element.ts","../../src/shared/network-listeners.ts"],"sourcesContent":["// Based on https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e (MIT License, JWilson)\n\nimport { BeamError } from \"./beam-errors\";\n\nexport function waitForElement(selector: string, { timeout = 10000 } = {}): Promise<Element> {\n return new Promise((resolve, reject) => {\n let el = document.querySelector(selector);\n if (el) {\n resolve(el);\n return;\n }\n\n let mutationObserver: MutationObserver;\n\n const timer = setTimeout(() => {\n if (el) return; // no need to reject\n mutationObserver?.disconnect();\n reject(new BeamError(`Timed out waiting for '${selector}'`));\n }, timeout);\n\n new MutationObserver((_mutationRecords, observer) => {\n mutationObserver = observer;\n // Query for elements matching the specified selector\n Array.from(document.querySelectorAll(selector)).forEach((element) => {\n el = element;\n resolve(element);\n // Once we have resolved we don't need the observer anymore.\n observer.disconnect();\n clearTimeout(timer);\n });\n }).observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n });\n}\n","import { BeamNetworkCallEvent } from \"./events\";\n\n/**\n * Fetch Listener\n */\n\nconst originalFetch = window.fetch;\n\nconst fetchHandler = {\n apply: function (target: any, _thisArg: any, args: any[]) {\n return target(...args).then((response: Response) => {\n if (response.ok) {\n const responseCopy = response.clone();\n window.dispatchEvent(\n new BeamNetworkCallEvent({\n url: args[0].toString(),\n method: (args[1]?.method || \"get\").toLowerCase(),\n type: \"fetch\",\n response: responseCopy,\n })\n );\n }\n return response;\n });\n },\n};\n\nexport const fetchProxy = new Proxy(originalFetch, fetchHandler);\n\n/**\n * XMLHTTPRequest Listener\n */\n\nconst originalXhr = XMLHttpRequest;\n\nconst xhrHandler = {\n construct(TargetConstructor: any, args: any[]) {\n const xhr: XMLHttpRequest = new TargetConstructor(...args);\n xhr.addEventListener(\"load\", () => {\n window.dispatchEvent(\n new BeamNetworkCallEvent({\n url: (args[1] || \"\").toString(),\n method: (args[0] || \"get\").toLowerCase(),\n type: \"xhr\",\n xhr,\n })\n );\n });\n return xhr;\n },\n};\n\nexport const xhrProxy = new Proxy(originalXhr, xhrHandler);\n\n/**\n * Side-Effects Setup (initialize listeners)\n */\n\nlet initializedListeners = false;\n\nexport const initNetworkListeners = () => {\n if (initializedListeners) return;\n window.fetch = fetchProxy;\n XMLHttpRequest = xhrProxy;\n initializedListeners = true;\n};\n"],"names":["waitForElement","selector","timeout","resolve","reject","el","mutationObserver","timer","BeamError","_mutationRecords","observer","element","originalFetch","fetchHandler","target","_thisArg","args","response","responseCopy","BeamNetworkCallEvent","fetchProxy","originalXhr","xhrHandler","TargetConstructor","xhr","xhrProxy","initializedListeners","initNetworkListeners"],"mappings":"+FAIO,SAASA,EAAeC,EAAkB,CAAE,QAAAC,EAAU,GAAM,EAAI,CAAsB,EAAA,CAC3F,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,IAAIC,EAAK,SAAS,cAAcJ,CAAQ,EACxC,GAAII,EAAI,CACNF,EAAQE,CAAE,EACV,MACF,CAEA,IAAIC,EAEJ,MAAMC,EAAQ,WAAW,IAAM,CACzBF,IACJC,GAAkB,WAAW,EAC7BF,EAAO,IAAII,EAAU,0BAA0BP,CAAQ,GAAG,CAAC,EAC7D,EAAGC,CAAO,EAEV,IAAI,iBAAiB,CAACO,EAAkBC,IAAa,CACnDJ,EAAmBI,EAEnB,MAAM,KAAK,SAAS,iBAAiBT,CAAQ,CAAC,EAAE,QAASU,GAAY,CACnEN,EAAKM,EACLR,EAAQQ,CAAO,EAEfD,EAAS,aACT,aAAaH,CAAK,CACpB,CAAC,CACH,CAAC,EAAE,QAAQ,SAAS,gBAAiB,CACnC,UAAW,GACX,QAAS,EACX,CAAC,CACH,CAAC,CACH,CC7BA,MAAMK,EAAgB,OAAO,MAEvBC,EAAe,CACnB,MAAO,SAAUC,EAAaC,EAAeC,EAAa,CACxD,OAAOF,EAAO,GAAGE,CAAI,EAAE,KAAMC,GAAuB,CAClD,GAAIA,EAAS,GAAI,CACf,MAAMC,EAAeD,EAAS,MAAM,EACpC,OAAO,cACL,IAAIE,EAAqB,CACvB,IAAKH,EAAK,CAAC,EAAE,SACb,EAAA,QAASA,EAAK,CAAC,GAAG,QAAU,OAAO,YAAY,EAC/C,KAAM,QACN,SAAUE,CACZ,CAAC,CACH,CACF,CACA,OAAOD,CACT,CAAC,CACH,CACF,EAEaG,EAAa,IAAI,MAAMR,EAAeC,CAAY,EAMzDQ,EAAc,eAEdC,EAAa,CACjB,UAAUC,EAAwBP,EAAa,CAC7C,MAAMQ,EAAsB,IAAID,EAAkB,GAAGP,CAAI,EACzD,OAAAQ,EAAI,iBAAiB,OAAQ,IAAM,CACjC,OAAO,cACL,IAAIL,EAAqB,CACvB,KAAMH,EAAK,CAAC,GAAK,IAAI,SAAA,EACrB,QAASA,EAAK,CAAC,GAAK,OAAO,cAC3B,KAAM,MACN,IAAAQ,CACF,CAAC,CACH,CACF,CAAC,EACMA,CACT,CACF,EAEaC,EAAW,IAAI,MAAMJ,EAAaC,CAAU,EAMzD,IAAII,EAAuB,SAEdC,EAAuB,IAAM,CACpCD,IACJ,OAAO,MAAQN,EACf,eAAiBK,EACjBC,EAAuB,GACzB"}
|
|
@@ -716,7 +716,10 @@ interface paths {
|
|
|
716
716
|
};
|
|
717
717
|
} | {
|
|
718
718
|
schema: {
|
|
719
|
-
/**
|
|
719
|
+
/**
|
|
720
|
+
* @default generic
|
|
721
|
+
* @enum {string}
|
|
722
|
+
*/
|
|
720
723
|
source: "generic";
|
|
721
724
|
/** @enum {string} */
|
|
722
725
|
variant?: "default";
|
|
@@ -1060,7 +1063,7 @@ interface paths {
|
|
|
1060
1063
|
200: {
|
|
1061
1064
|
content: {
|
|
1062
1065
|
"application/json": {
|
|
1063
|
-
/** @description The Beam
|
|
1066
|
+
/** @description The Beam internal ID */
|
|
1064
1067
|
beamUserId: string;
|
|
1065
1068
|
};
|
|
1066
1069
|
};
|
|
@@ -1069,7 +1072,7 @@ interface paths {
|
|
|
1069
1072
|
201: {
|
|
1070
1073
|
content: {
|
|
1071
1074
|
"application/json": {
|
|
1072
|
-
/** @description The Beam
|
|
1075
|
+
/** @description The Beam internal ID */
|
|
1073
1076
|
beamUserId: string;
|
|
1074
1077
|
};
|
|
1075
1078
|
};
|
|
@@ -1113,7 +1116,7 @@ interface paths {
|
|
|
1113
1116
|
/** One of `beamUserId` or `email` is required to identify the user. One of cartTotal or donation is required to create a valid transaction. */
|
|
1114
1117
|
post: {
|
|
1115
1118
|
responses: {
|
|
1116
|
-
/** Existing transaction */
|
|
1119
|
+
/** Existing transaction updated */
|
|
1117
1120
|
200: {
|
|
1118
1121
|
content: {
|
|
1119
1122
|
"application/json": {
|
|
@@ -1122,6 +1125,8 @@ interface paths {
|
|
|
1122
1125
|
* @example bqkdk-0393b-jbkdd-02difj
|
|
1123
1126
|
*/
|
|
1124
1127
|
transactionId: string;
|
|
1128
|
+
/** @description Whether the transaction was created (T) or updated (F) */
|
|
1129
|
+
transactionCreated?: boolean;
|
|
1125
1130
|
/**
|
|
1126
1131
|
* @description UUID
|
|
1127
1132
|
* @example bqkdk-0393b-jbkdd-02difj
|
|
@@ -1359,6 +1364,8 @@ interface paths {
|
|
|
1359
1364
|
* @example bqkdk-0393b-jbkdd-02difj
|
|
1360
1365
|
*/
|
|
1361
1366
|
transactionId: string;
|
|
1367
|
+
/** @description Whether the transaction was created (T) or updated (F) */
|
|
1368
|
+
transactionCreated?: boolean;
|
|
1362
1369
|
/**
|
|
1363
1370
|
* @description UUID
|
|
1364
1371
|
* @example bqkdk-0393b-jbkdd-02difj
|
|
@@ -1627,7 +1634,10 @@ interface paths {
|
|
|
1627
1634
|
* @example bqkdk-0393b-jbkdd-02difj
|
|
1628
1635
|
*/
|
|
1629
1636
|
selectionId?: string;
|
|
1630
|
-
/**
|
|
1637
|
+
/**
|
|
1638
|
+
* @description Beam generated cart id if exists
|
|
1639
|
+
* @example bqkdk-0393b-jbkdd-02difj
|
|
1640
|
+
*/
|
|
1631
1641
|
beamCartId?: string;
|
|
1632
1642
|
/** @description (externalCartId) Unique identifier for the cart provided by partner. */
|
|
1633
1643
|
cartId?: string;
|
|
@@ -1718,7 +1728,10 @@ interface paths {
|
|
|
1718
1728
|
};
|
|
1719
1729
|
} | {
|
|
1720
1730
|
schema: {
|
|
1721
|
-
/**
|
|
1731
|
+
/**
|
|
1732
|
+
* @default generic
|
|
1733
|
+
* @enum {string}
|
|
1734
|
+
*/
|
|
1722
1735
|
source: "generic";
|
|
1723
1736
|
/** @enum {string} */
|
|
1724
1737
|
variant?: "default";
|
|
@@ -2277,7 +2290,10 @@ interface paths {
|
|
|
2277
2290
|
selectionId?: string | null;
|
|
2278
2291
|
/** @description Cart ID from partner site */
|
|
2279
2292
|
cartId?: string;
|
|
2280
|
-
/**
|
|
2293
|
+
/**
|
|
2294
|
+
* @description internal cart ID
|
|
2295
|
+
* @example bqkdk-0393b-jbkdd-02difj
|
|
2296
|
+
*/
|
|
2281
2297
|
beamCartId?: string;
|
|
2282
2298
|
/** @description Beam store ID */
|
|
2283
2299
|
storeId?: number;
|
|
@@ -2706,12 +2722,14 @@ interface paths {
|
|
|
2706
2722
|
* @description ISO formatted date
|
|
2707
2723
|
* @example 2023-04-19T03:23:59.301Z
|
|
2708
2724
|
*/
|
|
2709
|
-
expiresAt: string;
|
|
2725
|
+
expiresAt: string | null;
|
|
2710
2726
|
/**
|
|
2711
2727
|
* @description UUID
|
|
2712
2728
|
* @example bqkdk-0393b-jbkdd-02difj
|
|
2713
2729
|
*/
|
|
2714
|
-
beamCartId: string;
|
|
2730
|
+
beamCartId: string | null;
|
|
2731
|
+
/** @description Whether the Beam Cart was created (T) or updated (F). Null if beamCartId is null. */
|
|
2732
|
+
beamCartCreated?: boolean | null;
|
|
2715
2733
|
};
|
|
2716
2734
|
};
|
|
2717
2735
|
};
|
|
@@ -2743,7 +2761,7 @@ interface paths {
|
|
|
2743
2761
|
requestBody: {
|
|
2744
2762
|
content: {
|
|
2745
2763
|
"application/json": {
|
|
2746
|
-
/** @description Beam
|
|
2764
|
+
/** @description Beam-generated cart id if exists */
|
|
2747
2765
|
beamCartId?: string | null;
|
|
2748
2766
|
/** @description (externalCartId) Unique identifier for the cart provided by partner. */
|
|
2749
2767
|
cartId?: string;
|
|
@@ -3255,11 +3273,8 @@ interface paths {
|
|
|
3255
3273
|
* @example Frankie's Collective is dedicated to innovating women's streetwear...
|
|
3256
3274
|
*/
|
|
3257
3275
|
description: string;
|
|
3258
|
-
/**
|
|
3259
|
-
|
|
3260
|
-
* @example https://cdn.beamimpact.com/logos/beam.png
|
|
3261
|
-
*/
|
|
3262
|
-
image: string | null;
|
|
3276
|
+
/** @description The list of images for the chain with marketing image first */
|
|
3277
|
+
images: string[];
|
|
3263
3278
|
/**
|
|
3264
3279
|
* @description The Chain's logo image.
|
|
3265
3280
|
* @example https://cdn.beamimpact.com/logos/beam.png
|
|
@@ -5183,13 +5198,26 @@ interface paths {
|
|
|
5183
5198
|
};
|
|
5184
5199
|
};
|
|
5185
5200
|
};
|
|
5186
|
-
|
|
5187
|
-
|
|
5188
|
-
|
|
5189
|
-
|
|
5190
|
-
|
|
5191
|
-
|
|
5201
|
+
"/logs": {
|
|
5202
|
+
post: {
|
|
5203
|
+
responses: {
|
|
5204
|
+
/** Successful response */
|
|
5205
|
+
200: unknown;
|
|
5206
|
+
};
|
|
5207
|
+
requestBody: {
|
|
5208
|
+
content: {
|
|
5209
|
+
"application/json": {
|
|
5210
|
+
/** @enum {string} */
|
|
5211
|
+
type: "error" | "log";
|
|
5212
|
+
code: string;
|
|
5213
|
+
metadata?: {
|
|
5214
|
+
[key: string]: unknown;
|
|
5215
|
+
};
|
|
5216
|
+
};
|
|
5217
|
+
};
|
|
5218
|
+
};
|
|
5219
|
+
};
|
|
5192
5220
|
};
|
|
5193
|
-
}
|
|
5221
|
+
}
|
|
5194
5222
|
|
|
5195
|
-
export type {
|
|
5223
|
+
export type { paths as p };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as
|
|
2
|
-
//# sourceMappingURL=order-page-
|
|
1
|
+
import{i as B}from"./lodash-ZxBiuGue.esm.js";import{a as u}from"./cookies-BnIoXWd0.esm.js";import{i as v,w as L}from"./network-listeners-O5LKv8Yy.esm.js";import{f as T,c as U,b as j}from"./events-wNy5BoJV.esm.js";import{c as C}from"./local-storage-GYvYzZ_j.esm.js";import{B as A}from"./cart-contents-h60geKWa.esm.js";import{L as f}from"./update-cart-TJ7G8Xfl.esm.js";import"../components/post-purchase.js";import{D as O}from"./routes-N9ZmkAD6.esm.js";import{B as k}from"./beam-errors-AMvTvR1C.esm.js";const g=window.Shopify?.routes?.root||"/";let _=!1;const J="cart";async function K(e){if(_)return!1;const i=await w(e);await f(e,i.cart),v(),window.addEventListener(T.eventName,async c=>{const r=c,a=/cart\/(add|change|update|clear)\.js$/,o=r.detail.type==="xhr"?r.detail.xhr.responseURL:r.detail.response.url,m=new URL(o);if(!a.test(m.pathname))return;const n=await w(e);if(!n.changed)return;const l={schema:n.cart.schema,content:{items:n.cart.content.items}};window.dispatchEvent(new U(l)),await f(e,n.cart)});let s,d;return window.addEventListener(j.eventName,async c=>{const r=c,{selectedNonprofitId:a,selectionId:o}=r.detail,m=await u(J),n=await u(A),{chainId:l,storeId:p}=e;s===a&&d===o||(await E({selectedNonprofitId:a,selectionId:o,beamCartId:n,cartId:m,chainId:l,storeId:p}),d=o,s=a)}),_=!0,!0}async function w(e){const{token:i,total_price:s,item_count:d,currency:c,items:r}=await window.fetch(g+"cart.js",{method:"GET",headers:{"Content-Type":"application/json"}}).then(n=>n.json()),a={cartId:i,subtotal:s/100,itemCount:d,currencyCode:c,schema:{source:"generic"},content:{items:r.map(({sku:n,final_line_price:l})=>({remoteProductIdentifier:n,localAmount:l}))}};let o=!1;const m=C(e).getItemJson("cart");return B(a,m)||(o=!0),{changed:o,cart:a}}const R=f;async function E({selectedNonprofitId:e,selectionId:i,beamCartId:s,cartId:d,chainId:c,storeId:r}){const a={beam:JSON.stringify({nonprofit_id:e,selection_id:i,beam_cart_id:s,shopify_cart_id:d,chain_id:c,store_id:r})};try{await window.fetch(g+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:a})})}catch(o){console.error(o)}}async function x({parentSelector:e=".step__sections",apiKey:i,baseUrl:s=O,storeId:d,postalCode:c,countryCode:r,orderId:a,email:o,cartTotal:m,cart:n,discountCodes:l,currencyCode:p="USD",lang:b="en",debug:N=!1}){const h=document.querySelector(e)||await L(e);if(!h)throw new k(`Timed out waiting for selector '${e}'. Could not render Beam post-purchase widget.`);const I=await u("cart");if(I){const y=C({apiKey:i}),S=y.getItemJson("cart")||{};y.setItemJson("cart",{...S,cartId:I})}const t=document.createElement("beam-post-purchase");t.apiKey=i,t.baseUrl=s,t.storeId=d,t.postalCode=c,t.countryCode=r,t.orderId=String(a),t.email=o,t.cartTotal=m,t.cart=n,t.discountCodes=l,t.currencyCode=p,t.lang=b,t.debug=N,h.appendChild(t)}export{K as B,w as C,R as N,E as h,x as s};
|
|
2
|
+
//# sourceMappingURL=order-page-1-A-Yhbv.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-page-R2OPVBti.esm.js","sources":["../../src/integrations/shopify/cart-page.ts","../../src/integrations/shopify/order-page.ts"],"sourcesContent":["/* eslint-disable camelcase */\nimport isEqual from \"lodash-es/isEqual\";\nimport { getCookieValue } from \"../../shared/cookies\";\nimport { initNetworkListeners } from \"../../shared/network-listeners\";\nimport { BeamCartChangeEvent, BeamNetworkCallEvent, BeamNonprofitSelectEvent } from \"../../shared/events\";\nimport { createScopedLocalStorage } from \"../../shared/local-storage\";\nimport { BEAM_CART_COOKIE_NAME, TCart, TCartApi, TCartItems } from \"../../shared/cart-contents\";\nimport { BeamCartAPIConfig, updateCart } from \"../cart\";\n\ntype BeamShopifyCartIntegrationConfig = BeamCartAPIConfig & {\n storeId: number; // will be added to cart custom_attributes, and used in cart API call\n chainId?: number; // will be added to cart custom_attributes\n};\n\nconst SHOPIFY_BASE_URL = window.Shopify?.routes?.root || \"/\"; // see window.d.ts\n\nlet isBeamCartIntegrationRegistered = false; // Skip registering event listeners if already set up\n\nconst SHOPIFY_CART_COOKIE_NAME = \"cart\";\n\n/**\n * @main registerCartIntegration - set up event listeners to integrate Beam with Shopify cart\n * @return {boolean} returns true if NEW listeners were created, false if setup was already done\n */\nasync function registerCartIntegration(config: BeamShopifyCartIntegrationConfig) {\n if (isBeamCartIntegrationRegistered) {\n return false; // Do nothing if listeners are already attached\n }\n\n // Handle full-page load, ie, first-time page load and reloads from form submit events\n // This creates a GET to /cart.js\n const currentCart = await getCurrentCart(config);\n await updateCart(config, currentCart.cart);\n\n // Set up event listeners for AJAX events\n initNetworkListeners();\n\n window.addEventListener(BeamNetworkCallEvent.eventName, async (_event: Event) => {\n const event = _event as BeamNetworkCallEvent;\n const cartChangePaths = /cart\\/(add|change|update|clear)\\.js$/;\n // note: response urls below follow redirects\n const requestUrlStr = event.detail.type === \"xhr\" ? event.detail.xhr.responseURL : event.detail.response.url;\n const url = new URL(requestUrlStr);\n if (!cartChangePaths.test(url.pathname)) {\n return;\n }\n const currentCart = await getCurrentCart(config);\n if (!currentCart.changed) {\n return;\n }\n const eventDetail: TCartApi = {\n schema: currentCart.cart.schema as any, // TS union type can't figure out what variant applies here\n content: {\n items: currentCart.cart.content.items as any,\n },\n };\n window.dispatchEvent(new BeamCartChangeEvent(eventDetail));\n // Send cart to Beam to update timestamp, which is used for cart abandonment / ROI calc\n await updateCart(config, currentCart.cart);\n });\n\n // Listen to Beam's own events to integrate Beam data into Shopify order\n let lastNonprofitId: number | null | undefined;\n let lastSelectionId: string | null | undefined;\n window.addEventListener(BeamNonprofitSelectEvent.eventName, async (_event) => {\n const event = _event as BeamNonprofitSelectEvent;\n const { selectedNonprofitId, selectionId } = event.detail;\n const cartId = await getCookieValue(SHOPIFY_CART_COOKIE_NAME); // Shopify cart ID cookie\n const beamCartId = await getCookieValue(BEAM_CART_COOKIE_NAME); // Beam cart ID cookie\n const { chainId, storeId } = config;\n // Skip update if nothing changed (can happen if widget is re-initialized and\n // emits event after cache restoration, i.e., on cart re-render).\n if (lastNonprofitId === selectedNonprofitId && lastSelectionId === selectionId) {\n return;\n }\n await addBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = selectedNonprofitId;\n });\n\n isBeamCartIntegrationRegistered = true;\n\n return true;\n}\n\n/* ***************************************** HELPER FUNCTIONS *****************************************\n These may be used individually to integrate with carts if the registerCartIntegration\n script doesn't work for some reason.\n ****************************************************************************************************/\n\n/**\n * Detects change in cart since last page load,\n * by calling GET /cart.js, and returns cart values.\n * Used for:\n * - Form-based carts where the page refreshes to modify cart instead of using AJAX calls\n * - Hydrogen/GraphQL based carts (needs to be integrated manually)\n */\nasync function getCurrentCart(config: BeamShopifyCartIntegrationConfig): Promise<{\n changed: boolean;\n cart: {\n cartId: string;\n subtotal: number;\n itemCount: number;\n currencyCode: string;\n } & TCart;\n}> {\n const {\n token, // equal to \"cart\" cookie\n total_price, // this is the pretax value, after discounts, and multiplied by 100 (integer from decimal)\n item_count,\n currency,\n items,\n } = await window\n .fetch(SHOPIFY_BASE_URL + \"cart.js\", {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n })\n .then((res) => res.json());\n\n const cart = {\n cartId: token,\n subtotal: total_price / 100,\n itemCount: item_count,\n currencyCode: currency,\n schema: { source: \"generic\" } as const,\n content: {\n // pull out minimal fields from full line items\n items: (items as TCartItems).map(({ sku, final_line_price }) => {\n return { remoteProductIdentifier: sku, localAmount: final_line_price };\n }),\n },\n };\n\n let changed = false;\n\n const localStorage = createScopedLocalStorage(config);\n\n const cachedCart = localStorage.getItemJson(\"cart\");\n\n if (!isEqual(cart, cachedCart)) {\n changed = true;\n }\n\n return { changed, cart };\n}\n\n/**\n * trackCart - Backwards-compatible alias for updateCart\n */\nconst trackCart = updateCart;\n\n/** Sends Beam data to Shopify to integrate with order as custom attributes */\nasync function addBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n}: {\n selectedNonprofitId?: number | null;\n selectionId?: string;\n beamCartId?: string;\n cartId?: string;\n chainId?: number;\n storeId?: number;\n}) {\n const beamCartAttrs = {\n beam: JSON.stringify({\n nonprofit_id: selectedNonprofitId,\n selection_id: selectionId,\n beam_cart_id: beamCartId,\n shopify_cart_id: cartId,\n chain_id: chainId,\n store_id: storeId,\n }),\n };\n\n try {\n await window.fetch(SHOPIFY_BASE_URL + \"cart/update.js\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ attributes: beamCartAttrs }),\n });\n } catch (err) {\n console.error(err); // don't throw, allow later calls to continue\n }\n}\n\nexport { trackCart, getCurrentCart, addBeamAttributesToCart, registerCartIntegration };\n","import \"../../components/post-purchase\";\nimport { postTransaction } from \"../../api-sdk/v3/routes\";\nimport { DEFAULT_BASE_URL } from \"../../api-sdk/constants\";\nimport { LANGUAGES, TUrl } from \"../../api-sdk/types\";\nimport { waitForElement } from \"../../shared/wait-for-element\";\nimport { BeamError } from \"../../shared/beam-errors\";\nimport { getCookieValue } from \"../../shared/cookies\";\nimport { createScopedLocalStorage } from \"../../shared/local-storage\";\nimport { TCart } from \"../../shared/cart-contents\";\n\n// Shopify admin page: admin/settings/checkout\n\nexport type TBeamOrderPageParams = Parameters<typeof postTransaction>[0][\"requestBody\"] & {\n // Either storeId or postalCode + countryCode must be provided\n storeId?: number;\n postalCode?: string;\n countryCode?: string;\n orderId: string;\n email: string;\n cartTotal: number;\n cart: TCart;\n discountCodes: string[];\n currencyCode: string;\n parentSelector: string; // CSS Selector for parent of widget to be inserted into DOM\n apiKey: string;\n baseUrl: TUrl;\n lang: LANGUAGES;\n debug: boolean;\n};\n\nexport async function showBeamOrderPageWidgets({\n parentSelector = \".step__sections\",\n apiKey,\n baseUrl = DEFAULT_BASE_URL,\n storeId,\n postalCode,\n countryCode,\n orderId,\n email,\n cartTotal,\n cart,\n discountCodes,\n currencyCode = \"USD\",\n lang = \"en\",\n debug = false,\n}: TBeamOrderPageParams) {\n const parentElement = document.querySelector(parentSelector) || (await waitForElement(parentSelector));\n if (!parentElement) {\n throw new BeamError(\n `Timed out waiting for selector '${parentSelector}'. Could not render Beam post-purchase widget.`\n );\n }\n\n // If checkout and order page are on different subdomains, we can't access localStorage\n // We can make postTransaction work by copying the cart cookie to the expected localStorage key on the current domain\n const cartId = await getCookieValue(\"cart\"); // Shopify-only cart identifier\n if (cartId) {\n const beamLocalStorage = createScopedLocalStorage({ apiKey });\n const existingValue = beamLocalStorage.getItemJson(\"cart\") || {};\n beamLocalStorage.setItemJson(\"cart\", { ...existingValue, cartId });\n }\n\n // Note: assign properties one by one instead of bulk Object.assign to type check assignments\n const widget = document.createElement(\"beam-post-purchase\");\n widget.apiKey = apiKey;\n widget.baseUrl = baseUrl;\n widget.storeId = storeId;\n widget.postalCode = postalCode;\n widget.countryCode = countryCode;\n widget.orderId = String(orderId);\n widget.email = email;\n widget.cartTotal = cartTotal;\n widget.cart = cart;\n widget.discountCodes = discountCodes;\n widget.currencyCode = currencyCode;\n widget.lang = lang;\n widget.debug = debug;\n\n // Insert widget into DOM\n parentElement.appendChild(widget);\n}\n"],"names":["SHOPIFY_BASE_URL","isBeamCartIntegrationRegistered","SHOPIFY_CART_COOKIE_NAME","registerCartIntegration","config","currentCart","getCurrentCart","updateCart","initNetworkListeners","BeamNetworkCallEvent","_event","event","cartChangePaths","requestUrlStr","url","eventDetail","BeamCartChangeEvent","lastNonprofitId","lastSelectionId","BeamNonprofitSelectEvent","selectedNonprofitId","selectionId","cartId","getCookieValue","beamCartId","BEAM_CART_COOKIE_NAME","chainId","storeId","addBeamAttributesToCart","token","total_price","item_count","currency","items","res","cart","sku","final_line_price","changed","cachedCart","createScopedLocalStorage","isEqual","trackCart","beamCartAttrs","err","showBeamOrderPageWidgets","parentSelector","apiKey","baseUrl","DEFAULT_BASE_URL","postalCode","countryCode","orderId","email","cartTotal","discountCodes","currencyCode","lang","debug","parentElement","waitForElement","BeamError","beamLocalStorage","existingValue","widget"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"order-page-1-A-Yhbv.esm.js","sources":["../../src/integrations/shopify/cart-page.ts","../../src/integrations/shopify/order-page.ts"],"sourcesContent":["/* eslint-disable camelcase */\nimport isEqual from \"lodash-es/isEqual\";\nimport { getCookieValue } from \"../../shared/cookies\";\nimport { initNetworkListeners } from \"../../shared/network-listeners\";\nimport { BeamCartChangeEvent, BeamNetworkCallEvent, BeamNonprofitSelectEvent } from \"../../shared/events\";\nimport { createScopedLocalStorage } from \"../../shared/local-storage\";\nimport { BEAM_CART_COOKIE_NAME, TCart, TCartApi, TCartItems } from \"../../shared/cart-contents\";\nimport { BeamCartAPIConfig, updateCart } from \"../cart\";\n\ntype BeamShopifyCartIntegrationConfig = BeamCartAPIConfig & {\n storeId: number; // will be added to cart custom_attributes, and used in cart API call\n chainId?: number; // will be added to cart custom_attributes\n};\n\nconst SHOPIFY_BASE_URL = window.Shopify?.routes?.root || \"/\"; // see window.d.ts\n\nlet isBeamCartIntegrationRegistered = false; // Skip registering event listeners if already set up\n\nconst SHOPIFY_CART_COOKIE_NAME = \"cart\";\n\n/**\n * @main registerCartIntegration - set up event listeners to integrate Beam with Shopify cart\n * @return {boolean} returns true if NEW listeners were created, false if setup was already done\n */\nasync function registerCartIntegration(config: BeamShopifyCartIntegrationConfig) {\n if (isBeamCartIntegrationRegistered) {\n return false; // Do nothing if listeners are already attached\n }\n\n // Handle full-page load, ie, first-time page load and reloads from form submit events\n // This creates a GET to /cart.js\n const currentCart = await getCurrentCart(config);\n await updateCart(config, currentCart.cart);\n\n // Set up event listeners for AJAX events\n initNetworkListeners();\n\n window.addEventListener(BeamNetworkCallEvent.eventName, async (_event: Event) => {\n const event = _event as BeamNetworkCallEvent;\n const cartChangePaths = /cart\\/(add|change|update|clear)\\.js$/;\n // note: response urls below follow redirects\n const requestUrlStr = event.detail.type === \"xhr\" ? event.detail.xhr.responseURL : event.detail.response.url;\n const url = new URL(requestUrlStr);\n if (!cartChangePaths.test(url.pathname)) {\n return;\n }\n const currentCart = await getCurrentCart(config);\n if (!currentCart.changed) {\n return;\n }\n const eventDetail: TCartApi = {\n schema: currentCart.cart.schema as any, // TS union type can't figure out what variant applies here\n content: {\n items: currentCart.cart.content.items as any,\n },\n };\n window.dispatchEvent(new BeamCartChangeEvent(eventDetail));\n // Send cart to Beam to update timestamp, which is used for cart abandonment / ROI calc\n await updateCart(config, currentCart.cart);\n });\n\n // Listen to Beam's own events to integrate Beam data into Shopify order\n let lastNonprofitId: number | null | undefined;\n let lastSelectionId: string | null | undefined;\n window.addEventListener(BeamNonprofitSelectEvent.eventName, async (_event) => {\n const event = _event as BeamNonprofitSelectEvent;\n const { selectedNonprofitId, selectionId } = event.detail;\n const cartId = await getCookieValue(SHOPIFY_CART_COOKIE_NAME); // Shopify cart ID cookie\n const beamCartId = await getCookieValue(BEAM_CART_COOKIE_NAME); // Beam cart ID cookie\n const { chainId, storeId } = config;\n // Skip update if nothing changed (can happen if widget is re-initialized and\n // emits event after cache restoration, i.e., on cart re-render).\n if (lastNonprofitId === selectedNonprofitId && lastSelectionId === selectionId) {\n return;\n }\n await addBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = selectedNonprofitId;\n });\n\n isBeamCartIntegrationRegistered = true;\n\n return true;\n}\n\n/* ***************************************** HELPER FUNCTIONS *****************************************\n These may be used individually to integrate with carts if the registerCartIntegration\n script doesn't work for some reason.\n ****************************************************************************************************/\n\n/**\n * Detects change in cart since last page load,\n * by calling GET /cart.js, and returns cart values.\n * Used for:\n * - Form-based carts where the page refreshes to modify cart instead of using AJAX calls\n * - Hydrogen/GraphQL based carts (needs to be integrated manually)\n */\nasync function getCurrentCart(config: BeamShopifyCartIntegrationConfig): Promise<{\n changed: boolean;\n cart: {\n cartId: string;\n subtotal: number;\n itemCount: number;\n currencyCode: string;\n } & TCart;\n}> {\n const {\n token, // equal to \"cart\" cookie\n total_price, // this is the pretax value, after discounts, and multiplied by 100 (integer from decimal)\n item_count,\n currency,\n items,\n } = await window\n .fetch(SHOPIFY_BASE_URL + \"cart.js\", {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n })\n .then((res) => res.json());\n\n const cart = {\n cartId: token,\n subtotal: total_price / 100,\n itemCount: item_count,\n currencyCode: currency,\n schema: { source: \"generic\" } as const,\n content: {\n // pull out minimal fields from full line items\n items: (items as TCartItems).map(({ sku, final_line_price }) => {\n return { remoteProductIdentifier: sku, localAmount: final_line_price };\n }),\n },\n };\n\n let changed = false;\n\n const localStorage = createScopedLocalStorage(config);\n\n const cachedCart = localStorage.getItemJson(\"cart\");\n\n if (!isEqual(cart, cachedCart)) {\n changed = true;\n }\n\n return { changed, cart };\n}\n\n/**\n * trackCart - Backwards-compatible alias for updateCart\n */\nconst trackCart = updateCart;\n\n/** Sends Beam data to Shopify to integrate with order as custom attributes */\nasync function addBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n}: {\n selectedNonprofitId?: number | null;\n selectionId?: string;\n beamCartId?: string;\n cartId?: string;\n chainId?: number;\n storeId?: number;\n}) {\n const beamCartAttrs = {\n beam: JSON.stringify({\n nonprofit_id: selectedNonprofitId,\n selection_id: selectionId,\n beam_cart_id: beamCartId,\n shopify_cart_id: cartId,\n chain_id: chainId,\n store_id: storeId,\n }),\n };\n\n try {\n await window.fetch(SHOPIFY_BASE_URL + \"cart/update.js\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ attributes: beamCartAttrs }),\n });\n } catch (err) {\n console.error(err); // don't throw, allow later calls to continue\n }\n}\n\nexport { trackCart, getCurrentCart, addBeamAttributesToCart, registerCartIntegration };\n","import \"../../components/post-purchase\";\nimport { postTransaction } from \"../../api-sdk/v3/routes\";\nimport { DEFAULT_BASE_URL } from \"../../api-sdk/constants\";\nimport { LANGUAGES, TUrl } from \"../../api-sdk/types\";\nimport { waitForElement } from \"../../shared/wait-for-element\";\nimport { BeamError } from \"../../shared/beam-errors\";\nimport { getCookieValue } from \"../../shared/cookies\";\nimport { createScopedLocalStorage } from \"../../shared/local-storage\";\nimport { TCart } from \"../../shared/cart-contents\";\n\n// Shopify admin page: admin/settings/checkout\n\nexport type TBeamOrderPageParams = Parameters<typeof postTransaction>[0][\"requestBody\"] & {\n // Either storeId or postalCode + countryCode must be provided\n storeId?: number;\n postalCode?: string;\n countryCode?: string;\n orderId: string;\n email: string;\n cartTotal: number;\n cart: TCart;\n discountCodes: string[];\n currencyCode: string;\n parentSelector: string; // CSS Selector for parent of widget to be inserted into DOM\n apiKey: string;\n baseUrl: TUrl;\n lang: LANGUAGES;\n debug: boolean;\n};\n\nexport async function showBeamOrderPageWidgets({\n parentSelector = \".step__sections\",\n apiKey,\n baseUrl = DEFAULT_BASE_URL,\n storeId,\n postalCode,\n countryCode,\n orderId,\n email,\n cartTotal,\n cart,\n discountCodes,\n currencyCode = \"USD\",\n lang = \"en\",\n debug = false,\n}: TBeamOrderPageParams) {\n const parentElement = document.querySelector(parentSelector) || (await waitForElement(parentSelector));\n if (!parentElement) {\n throw new BeamError(\n `Timed out waiting for selector '${parentSelector}'. Could not render Beam post-purchase widget.`\n );\n }\n\n // If checkout and order page are on different subdomains, we can't access localStorage\n // We can make postTransaction work by copying the cart cookie to the expected localStorage key on the current domain\n const cartId = await getCookieValue(\"cart\"); // Shopify-only cart identifier\n if (cartId) {\n const beamLocalStorage = createScopedLocalStorage({ apiKey });\n const existingValue = beamLocalStorage.getItemJson(\"cart\") || {};\n beamLocalStorage.setItemJson(\"cart\", { ...existingValue, cartId });\n }\n\n // Note: assign properties one by one instead of bulk Object.assign to type check assignments\n const widget = document.createElement(\"beam-post-purchase\");\n widget.apiKey = apiKey;\n widget.baseUrl = baseUrl;\n widget.storeId = storeId;\n widget.postalCode = postalCode;\n widget.countryCode = countryCode;\n widget.orderId = String(orderId);\n widget.email = email;\n widget.cartTotal = cartTotal;\n widget.cart = cart;\n widget.discountCodes = discountCodes;\n widget.currencyCode = currencyCode;\n widget.lang = lang;\n widget.debug = debug;\n\n // Insert widget into DOM\n parentElement.appendChild(widget);\n}\n"],"names":["SHOPIFY_BASE_URL","isBeamCartIntegrationRegistered","SHOPIFY_CART_COOKIE_NAME","registerCartIntegration","config","currentCart","getCurrentCart","updateCart","initNetworkListeners","BeamNetworkCallEvent","_event","event","cartChangePaths","requestUrlStr","url","eventDetail","BeamCartChangeEvent","lastNonprofitId","lastSelectionId","BeamNonprofitSelectEvent","selectedNonprofitId","selectionId","cartId","getCookieValue","beamCartId","BEAM_CART_COOKIE_NAME","chainId","storeId","addBeamAttributesToCart","token","total_price","item_count","currency","items","res","cart","sku","final_line_price","changed","cachedCart","createScopedLocalStorage","isEqual","trackCart","beamCartAttrs","err","showBeamOrderPageWidgets","parentSelector","apiKey","baseUrl","DEFAULT_BASE_URL","postalCode","countryCode","orderId","email","cartTotal","discountCodes","currencyCode","lang","debug","parentElement","waitForElement","BeamError","beamLocalStorage","existingValue","widget"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as TCart } from './cart-contents-
|
|
2
|
-
import { u as updateCart, B as BeamCartAPIConfig } from './update-cart-
|
|
1
|
+
import { a as TCart } from './cart-contents-P2GzTrNn.esm.js';
|
|
2
|
+
import { u as updateCart, B as BeamCartAPIConfig } from './update-cart-3nc7XKMm.esm.js';
|
|
3
3
|
import '../components/post-purchase.js';
|
|
4
4
|
import { T as TUrl, L as LANGUAGES } from './types-aju0qrRe.esm.js';
|
|
5
5
|
|
|
@@ -146,6 +146,7 @@ declare const postTransaction: ({ headers, baseUrl, apiRoot, pathParams, queryPa
|
|
|
146
146
|
headers?: Record<string, string> | undefined;
|
|
147
147
|
}) => Promise<{
|
|
148
148
|
transactionId: string;
|
|
149
|
+
transactionCreated?: boolean | undefined;
|
|
149
150
|
beamUserId: string;
|
|
150
151
|
chainId: number;
|
|
151
152
|
nonprofitId: number | null;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as
|
|
2
|
-
//# sourceMappingURL=order-page-
|
|
1
|
+
import{i as B}from"./lodash-ZxBiuGue.esm.js";import{a as u}from"./cookies-BnIoXWd0.esm.js";import{i as v,w as L}from"./network-listeners-O5LKv8Yy.esm.js";import{f as T,c as U,b as j}from"./events-wNy5BoJV.esm.js";import{c as C}from"./local-storage-GYvYzZ_j.esm.js";import{B as A}from"./cart-contents-h60geKWa.esm.js";import{L as f}from"./update-cart-TJ7G8Xfl.esm.js";import"../components/post-purchase.esm.js";import{D as O}from"./routes-N9ZmkAD6.esm.js";import{B as k}from"./beam-errors-AMvTvR1C.esm.js";const g=window.Shopify?.routes?.root||"/";let _=!1;const J="cart";async function K(e){if(_)return!1;const i=await w(e);await f(e,i.cart),v(),window.addEventListener(T.eventName,async c=>{const r=c,a=/cart\/(add|change|update|clear)\.js$/,o=r.detail.type==="xhr"?r.detail.xhr.responseURL:r.detail.response.url,m=new URL(o);if(!a.test(m.pathname))return;const n=await w(e);if(!n.changed)return;const l={schema:n.cart.schema,content:{items:n.cart.content.items}};window.dispatchEvent(new U(l)),await f(e,n.cart)});let s,d;return window.addEventListener(j.eventName,async c=>{const r=c,{selectedNonprofitId:a,selectionId:o}=r.detail,m=await u(J),n=await u(A),{chainId:l,storeId:p}=e;s===a&&d===o||(await E({selectedNonprofitId:a,selectionId:o,beamCartId:n,cartId:m,chainId:l,storeId:p}),d=o,s=a)}),_=!0,!0}async function w(e){const{token:i,total_price:s,item_count:d,currency:c,items:r}=await window.fetch(g+"cart.js",{method:"GET",headers:{"Content-Type":"application/json"}}).then(n=>n.json()),a={cartId:i,subtotal:s/100,itemCount:d,currencyCode:c,schema:{source:"generic"},content:{items:r.map(({sku:n,final_line_price:l})=>({remoteProductIdentifier:n,localAmount:l}))}};let o=!1;const m=C(e).getItemJson("cart");return B(a,m)||(o=!0),{changed:o,cart:a}}const R=f;async function E({selectedNonprofitId:e,selectionId:i,beamCartId:s,cartId:d,chainId:c,storeId:r}){const a={beam:JSON.stringify({nonprofit_id:e,selection_id:i,beam_cart_id:s,shopify_cart_id:d,chain_id:c,store_id:r})};try{await window.fetch(g+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:a})})}catch(o){console.error(o)}}async function x({parentSelector:e=".step__sections",apiKey:i,baseUrl:s=O,storeId:d,postalCode:c,countryCode:r,orderId:a,email:o,cartTotal:m,cart:n,discountCodes:l,currencyCode:p="USD",lang:b="en",debug:N=!1}){const h=document.querySelector(e)||await L(e);if(!h)throw new k(`Timed out waiting for selector '${e}'. Could not render Beam post-purchase widget.`);const I=await u("cart");if(I){const y=C({apiKey:i}),S=y.getItemJson("cart")||{};y.setItemJson("cart",{...S,cartId:I})}const t=document.createElement("beam-post-purchase");t.apiKey=i,t.baseUrl=s,t.storeId=d,t.postalCode=c,t.countryCode=r,t.orderId=String(a),t.email=o,t.cartTotal=m,t.cart=n,t.discountCodes=l,t.currencyCode=p,t.lang=b,t.debug=N,h.appendChild(t)}export{K as B,w as C,R as N,E as h,x as s};
|
|
2
|
+
//# sourceMappingURL=order-page-l0phiTZ7.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-page-zS1d11nZ.esm.js","sources":["../../src/integrations/shopify/cart-page.ts","../../src/integrations/shopify/order-page.ts"],"sourcesContent":["/* eslint-disable camelcase */\nimport isEqual from \"lodash-es/isEqual\";\nimport { getCookieValue } from \"../../shared/cookies\";\nimport { initNetworkListeners } from \"../../shared/network-listeners\";\nimport { BeamCartChangeEvent, BeamNetworkCallEvent, BeamNonprofitSelectEvent } from \"../../shared/events\";\nimport { createScopedLocalStorage } from \"../../shared/local-storage\";\nimport { BEAM_CART_COOKIE_NAME, TCart, TCartApi, TCartItems } from \"../../shared/cart-contents\";\nimport { BeamCartAPIConfig, updateCart } from \"../cart\";\n\ntype BeamShopifyCartIntegrationConfig = BeamCartAPIConfig & {\n storeId: number; // will be added to cart custom_attributes, and used in cart API call\n chainId?: number; // will be added to cart custom_attributes\n};\n\nconst SHOPIFY_BASE_URL = window.Shopify?.routes?.root || \"/\"; // see window.d.ts\n\nlet isBeamCartIntegrationRegistered = false; // Skip registering event listeners if already set up\n\nconst SHOPIFY_CART_COOKIE_NAME = \"cart\";\n\n/**\n * @main registerCartIntegration - set up event listeners to integrate Beam with Shopify cart\n * @return {boolean} returns true if NEW listeners were created, false if setup was already done\n */\nasync function registerCartIntegration(config: BeamShopifyCartIntegrationConfig) {\n if (isBeamCartIntegrationRegistered) {\n return false; // Do nothing if listeners are already attached\n }\n\n // Handle full-page load, ie, first-time page load and reloads from form submit events\n // This creates a GET to /cart.js\n const currentCart = await getCurrentCart(config);\n await updateCart(config, currentCart.cart);\n\n // Set up event listeners for AJAX events\n initNetworkListeners();\n\n window.addEventListener(BeamNetworkCallEvent.eventName, async (_event: Event) => {\n const event = _event as BeamNetworkCallEvent;\n const cartChangePaths = /cart\\/(add|change|update|clear)\\.js$/;\n // note: response urls below follow redirects\n const requestUrlStr = event.detail.type === \"xhr\" ? event.detail.xhr.responseURL : event.detail.response.url;\n const url = new URL(requestUrlStr);\n if (!cartChangePaths.test(url.pathname)) {\n return;\n }\n const currentCart = await getCurrentCart(config);\n if (!currentCart.changed) {\n return;\n }\n const eventDetail: TCartApi = {\n schema: currentCart.cart.schema as any, // TS union type can't figure out what variant applies here\n content: {\n items: currentCart.cart.content.items as any,\n },\n };\n window.dispatchEvent(new BeamCartChangeEvent(eventDetail));\n // Send cart to Beam to update timestamp, which is used for cart abandonment / ROI calc\n await updateCart(config, currentCart.cart);\n });\n\n // Listen to Beam's own events to integrate Beam data into Shopify order\n let lastNonprofitId: number | null | undefined;\n let lastSelectionId: string | null | undefined;\n window.addEventListener(BeamNonprofitSelectEvent.eventName, async (_event) => {\n const event = _event as BeamNonprofitSelectEvent;\n const { selectedNonprofitId, selectionId } = event.detail;\n const cartId = await getCookieValue(SHOPIFY_CART_COOKIE_NAME); // Shopify cart ID cookie\n const beamCartId = await getCookieValue(BEAM_CART_COOKIE_NAME); // Beam cart ID cookie\n const { chainId, storeId } = config;\n // Skip update if nothing changed (can happen if widget is re-initialized and\n // emits event after cache restoration, i.e., on cart re-render).\n if (lastNonprofitId === selectedNonprofitId && lastSelectionId === selectionId) {\n return;\n }\n await addBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = selectedNonprofitId;\n });\n\n isBeamCartIntegrationRegistered = true;\n\n return true;\n}\n\n/* ***************************************** HELPER FUNCTIONS *****************************************\n These may be used individually to integrate with carts if the registerCartIntegration\n script doesn't work for some reason.\n ****************************************************************************************************/\n\n/**\n * Detects change in cart since last page load,\n * by calling GET /cart.js, and returns cart values.\n * Used for:\n * - Form-based carts where the page refreshes to modify cart instead of using AJAX calls\n * - Hydrogen/GraphQL based carts (needs to be integrated manually)\n */\nasync function getCurrentCart(config: BeamShopifyCartIntegrationConfig): Promise<{\n changed: boolean;\n cart: {\n cartId: string;\n subtotal: number;\n itemCount: number;\n currencyCode: string;\n } & TCart;\n}> {\n const {\n token, // equal to \"cart\" cookie\n total_price, // this is the pretax value, after discounts, and multiplied by 100 (integer from decimal)\n item_count,\n currency,\n items,\n } = await window\n .fetch(SHOPIFY_BASE_URL + \"cart.js\", {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n })\n .then((res) => res.json());\n\n const cart = {\n cartId: token,\n subtotal: total_price / 100,\n itemCount: item_count,\n currencyCode: currency,\n schema: { source: \"generic\" } as const,\n content: {\n // pull out minimal fields from full line items\n items: (items as TCartItems).map(({ sku, final_line_price }) => {\n return { remoteProductIdentifier: sku, localAmount: final_line_price };\n }),\n },\n };\n\n let changed = false;\n\n const localStorage = createScopedLocalStorage(config);\n\n const cachedCart = localStorage.getItemJson(\"cart\");\n\n if (!isEqual(cart, cachedCart)) {\n changed = true;\n }\n\n return { changed, cart };\n}\n\n/**\n * trackCart - Backwards-compatible alias for updateCart\n */\nconst trackCart = updateCart;\n\n/** Sends Beam data to Shopify to integrate with order as custom attributes */\nasync function addBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n}: {\n selectedNonprofitId?: number | null;\n selectionId?: string;\n beamCartId?: string;\n cartId?: string;\n chainId?: number;\n storeId?: number;\n}) {\n const beamCartAttrs = {\n beam: JSON.stringify({\n nonprofit_id: selectedNonprofitId,\n selection_id: selectionId,\n beam_cart_id: beamCartId,\n shopify_cart_id: cartId,\n chain_id: chainId,\n store_id: storeId,\n }),\n };\n\n try {\n await window.fetch(SHOPIFY_BASE_URL + \"cart/update.js\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ attributes: beamCartAttrs }),\n });\n } catch (err) {\n console.error(err); // don't throw, allow later calls to continue\n }\n}\n\nexport { trackCart, getCurrentCart, addBeamAttributesToCart, registerCartIntegration };\n","import \"../../components/post-purchase\";\nimport { postTransaction } from \"../../api-sdk/v3/routes\";\nimport { DEFAULT_BASE_URL } from \"../../api-sdk/constants\";\nimport { LANGUAGES, TUrl } from \"../../api-sdk/types\";\nimport { waitForElement } from \"../../shared/wait-for-element\";\nimport { BeamError } from \"../../shared/beam-errors\";\nimport { getCookieValue } from \"../../shared/cookies\";\nimport { createScopedLocalStorage } from \"../../shared/local-storage\";\nimport { TCart } from \"../../shared/cart-contents\";\n\n// Shopify admin page: admin/settings/checkout\n\nexport type TBeamOrderPageParams = Parameters<typeof postTransaction>[0][\"requestBody\"] & {\n // Either storeId or postalCode + countryCode must be provided\n storeId?: number;\n postalCode?: string;\n countryCode?: string;\n orderId: string;\n email: string;\n cartTotal: number;\n cart: TCart;\n discountCodes: string[];\n currencyCode: string;\n parentSelector: string; // CSS Selector for parent of widget to be inserted into DOM\n apiKey: string;\n baseUrl: TUrl;\n lang: LANGUAGES;\n debug: boolean;\n};\n\nexport async function showBeamOrderPageWidgets({\n parentSelector = \".step__sections\",\n apiKey,\n baseUrl = DEFAULT_BASE_URL,\n storeId,\n postalCode,\n countryCode,\n orderId,\n email,\n cartTotal,\n cart,\n discountCodes,\n currencyCode = \"USD\",\n lang = \"en\",\n debug = false,\n}: TBeamOrderPageParams) {\n const parentElement = document.querySelector(parentSelector) || (await waitForElement(parentSelector));\n if (!parentElement) {\n throw new BeamError(\n `Timed out waiting for selector '${parentSelector}'. Could not render Beam post-purchase widget.`\n );\n }\n\n // If checkout and order page are on different subdomains, we can't access localStorage\n // We can make postTransaction work by copying the cart cookie to the expected localStorage key on the current domain\n const cartId = await getCookieValue(\"cart\"); // Shopify-only cart identifier\n if (cartId) {\n const beamLocalStorage = createScopedLocalStorage({ apiKey });\n const existingValue = beamLocalStorage.getItemJson(\"cart\") || {};\n beamLocalStorage.setItemJson(\"cart\", { ...existingValue, cartId });\n }\n\n // Note: assign properties one by one instead of bulk Object.assign to type check assignments\n const widget = document.createElement(\"beam-post-purchase\");\n widget.apiKey = apiKey;\n widget.baseUrl = baseUrl;\n widget.storeId = storeId;\n widget.postalCode = postalCode;\n widget.countryCode = countryCode;\n widget.orderId = String(orderId);\n widget.email = email;\n widget.cartTotal = cartTotal;\n widget.cart = cart;\n widget.discountCodes = discountCodes;\n widget.currencyCode = currencyCode;\n widget.lang = lang;\n widget.debug = debug;\n\n // Insert widget into DOM\n parentElement.appendChild(widget);\n}\n"],"names":["SHOPIFY_BASE_URL","isBeamCartIntegrationRegistered","SHOPIFY_CART_COOKIE_NAME","registerCartIntegration","config","currentCart","getCurrentCart","updateCart","initNetworkListeners","BeamNetworkCallEvent","_event","event","cartChangePaths","requestUrlStr","url","eventDetail","BeamCartChangeEvent","lastNonprofitId","lastSelectionId","BeamNonprofitSelectEvent","selectedNonprofitId","selectionId","cartId","getCookieValue","beamCartId","BEAM_CART_COOKIE_NAME","chainId","storeId","addBeamAttributesToCart","token","total_price","item_count","currency","items","res","cart","sku","final_line_price","changed","cachedCart","createScopedLocalStorage","isEqual","trackCart","beamCartAttrs","err","showBeamOrderPageWidgets","parentSelector","apiKey","baseUrl","DEFAULT_BASE_URL","postalCode","countryCode","orderId","email","cartTotal","discountCodes","currencyCode","lang","debug","parentElement","waitForElement","BeamError","beamLocalStorage","existingValue","widget"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"order-page-l0phiTZ7.esm.js","sources":["../../src/integrations/shopify/cart-page.ts","../../src/integrations/shopify/order-page.ts"],"sourcesContent":["/* eslint-disable camelcase */\nimport isEqual from \"lodash-es/isEqual\";\nimport { getCookieValue } from \"../../shared/cookies\";\nimport { initNetworkListeners } from \"../../shared/network-listeners\";\nimport { BeamCartChangeEvent, BeamNetworkCallEvent, BeamNonprofitSelectEvent } from \"../../shared/events\";\nimport { createScopedLocalStorage } from \"../../shared/local-storage\";\nimport { BEAM_CART_COOKIE_NAME, TCart, TCartApi, TCartItems } from \"../../shared/cart-contents\";\nimport { BeamCartAPIConfig, updateCart } from \"../cart\";\n\ntype BeamShopifyCartIntegrationConfig = BeamCartAPIConfig & {\n storeId: number; // will be added to cart custom_attributes, and used in cart API call\n chainId?: number; // will be added to cart custom_attributes\n};\n\nconst SHOPIFY_BASE_URL = window.Shopify?.routes?.root || \"/\"; // see window.d.ts\n\nlet isBeamCartIntegrationRegistered = false; // Skip registering event listeners if already set up\n\nconst SHOPIFY_CART_COOKIE_NAME = \"cart\";\n\n/**\n * @main registerCartIntegration - set up event listeners to integrate Beam with Shopify cart\n * @return {boolean} returns true if NEW listeners were created, false if setup was already done\n */\nasync function registerCartIntegration(config: BeamShopifyCartIntegrationConfig) {\n if (isBeamCartIntegrationRegistered) {\n return false; // Do nothing if listeners are already attached\n }\n\n // Handle full-page load, ie, first-time page load and reloads from form submit events\n // This creates a GET to /cart.js\n const currentCart = await getCurrentCart(config);\n await updateCart(config, currentCart.cart);\n\n // Set up event listeners for AJAX events\n initNetworkListeners();\n\n window.addEventListener(BeamNetworkCallEvent.eventName, async (_event: Event) => {\n const event = _event as BeamNetworkCallEvent;\n const cartChangePaths = /cart\\/(add|change|update|clear)\\.js$/;\n // note: response urls below follow redirects\n const requestUrlStr = event.detail.type === \"xhr\" ? event.detail.xhr.responseURL : event.detail.response.url;\n const url = new URL(requestUrlStr);\n if (!cartChangePaths.test(url.pathname)) {\n return;\n }\n const currentCart = await getCurrentCart(config);\n if (!currentCart.changed) {\n return;\n }\n const eventDetail: TCartApi = {\n schema: currentCart.cart.schema as any, // TS union type can't figure out what variant applies here\n content: {\n items: currentCart.cart.content.items as any,\n },\n };\n window.dispatchEvent(new BeamCartChangeEvent(eventDetail));\n // Send cart to Beam to update timestamp, which is used for cart abandonment / ROI calc\n await updateCart(config, currentCart.cart);\n });\n\n // Listen to Beam's own events to integrate Beam data into Shopify order\n let lastNonprofitId: number | null | undefined;\n let lastSelectionId: string | null | undefined;\n window.addEventListener(BeamNonprofitSelectEvent.eventName, async (_event) => {\n const event = _event as BeamNonprofitSelectEvent;\n const { selectedNonprofitId, selectionId } = event.detail;\n const cartId = await getCookieValue(SHOPIFY_CART_COOKIE_NAME); // Shopify cart ID cookie\n const beamCartId = await getCookieValue(BEAM_CART_COOKIE_NAME); // Beam cart ID cookie\n const { chainId, storeId } = config;\n // Skip update if nothing changed (can happen if widget is re-initialized and\n // emits event after cache restoration, i.e., on cart re-render).\n if (lastNonprofitId === selectedNonprofitId && lastSelectionId === selectionId) {\n return;\n }\n await addBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = selectedNonprofitId;\n });\n\n isBeamCartIntegrationRegistered = true;\n\n return true;\n}\n\n/* ***************************************** HELPER FUNCTIONS *****************************************\n These may be used individually to integrate with carts if the registerCartIntegration\n script doesn't work for some reason.\n ****************************************************************************************************/\n\n/**\n * Detects change in cart since last page load,\n * by calling GET /cart.js, and returns cart values.\n * Used for:\n * - Form-based carts where the page refreshes to modify cart instead of using AJAX calls\n * - Hydrogen/GraphQL based carts (needs to be integrated manually)\n */\nasync function getCurrentCart(config: BeamShopifyCartIntegrationConfig): Promise<{\n changed: boolean;\n cart: {\n cartId: string;\n subtotal: number;\n itemCount: number;\n currencyCode: string;\n } & TCart;\n}> {\n const {\n token, // equal to \"cart\" cookie\n total_price, // this is the pretax value, after discounts, and multiplied by 100 (integer from decimal)\n item_count,\n currency,\n items,\n } = await window\n .fetch(SHOPIFY_BASE_URL + \"cart.js\", {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n })\n .then((res) => res.json());\n\n const cart = {\n cartId: token,\n subtotal: total_price / 100,\n itemCount: item_count,\n currencyCode: currency,\n schema: { source: \"generic\" } as const,\n content: {\n // pull out minimal fields from full line items\n items: (items as TCartItems).map(({ sku, final_line_price }) => {\n return { remoteProductIdentifier: sku, localAmount: final_line_price };\n }),\n },\n };\n\n let changed = false;\n\n const localStorage = createScopedLocalStorage(config);\n\n const cachedCart = localStorage.getItemJson(\"cart\");\n\n if (!isEqual(cart, cachedCart)) {\n changed = true;\n }\n\n return { changed, cart };\n}\n\n/**\n * trackCart - Backwards-compatible alias for updateCart\n */\nconst trackCart = updateCart;\n\n/** Sends Beam data to Shopify to integrate with order as custom attributes */\nasync function addBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n}: {\n selectedNonprofitId?: number | null;\n selectionId?: string;\n beamCartId?: string;\n cartId?: string;\n chainId?: number;\n storeId?: number;\n}) {\n const beamCartAttrs = {\n beam: JSON.stringify({\n nonprofit_id: selectedNonprofitId,\n selection_id: selectionId,\n beam_cart_id: beamCartId,\n shopify_cart_id: cartId,\n chain_id: chainId,\n store_id: storeId,\n }),\n };\n\n try {\n await window.fetch(SHOPIFY_BASE_URL + \"cart/update.js\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ attributes: beamCartAttrs }),\n });\n } catch (err) {\n console.error(err); // don't throw, allow later calls to continue\n }\n}\n\nexport { trackCart, getCurrentCart, addBeamAttributesToCart, registerCartIntegration };\n","import \"../../components/post-purchase\";\nimport { postTransaction } from \"../../api-sdk/v3/routes\";\nimport { DEFAULT_BASE_URL } from \"../../api-sdk/constants\";\nimport { LANGUAGES, TUrl } from \"../../api-sdk/types\";\nimport { waitForElement } from \"../../shared/wait-for-element\";\nimport { BeamError } from \"../../shared/beam-errors\";\nimport { getCookieValue } from \"../../shared/cookies\";\nimport { createScopedLocalStorage } from \"../../shared/local-storage\";\nimport { TCart } from \"../../shared/cart-contents\";\n\n// Shopify admin page: admin/settings/checkout\n\nexport type TBeamOrderPageParams = Parameters<typeof postTransaction>[0][\"requestBody\"] & {\n // Either storeId or postalCode + countryCode must be provided\n storeId?: number;\n postalCode?: string;\n countryCode?: string;\n orderId: string;\n email: string;\n cartTotal: number;\n cart: TCart;\n discountCodes: string[];\n currencyCode: string;\n parentSelector: string; // CSS Selector for parent of widget to be inserted into DOM\n apiKey: string;\n baseUrl: TUrl;\n lang: LANGUAGES;\n debug: boolean;\n};\n\nexport async function showBeamOrderPageWidgets({\n parentSelector = \".step__sections\",\n apiKey,\n baseUrl = DEFAULT_BASE_URL,\n storeId,\n postalCode,\n countryCode,\n orderId,\n email,\n cartTotal,\n cart,\n discountCodes,\n currencyCode = \"USD\",\n lang = \"en\",\n debug = false,\n}: TBeamOrderPageParams) {\n const parentElement = document.querySelector(parentSelector) || (await waitForElement(parentSelector));\n if (!parentElement) {\n throw new BeamError(\n `Timed out waiting for selector '${parentSelector}'. Could not render Beam post-purchase widget.`\n );\n }\n\n // If checkout and order page are on different subdomains, we can't access localStorage\n // We can make postTransaction work by copying the cart cookie to the expected localStorage key on the current domain\n const cartId = await getCookieValue(\"cart\"); // Shopify-only cart identifier\n if (cartId) {\n const beamLocalStorage = createScopedLocalStorage({ apiKey });\n const existingValue = beamLocalStorage.getItemJson(\"cart\") || {};\n beamLocalStorage.setItemJson(\"cart\", { ...existingValue, cartId });\n }\n\n // Note: assign properties one by one instead of bulk Object.assign to type check assignments\n const widget = document.createElement(\"beam-post-purchase\");\n widget.apiKey = apiKey;\n widget.baseUrl = baseUrl;\n widget.storeId = storeId;\n widget.postalCode = postalCode;\n widget.countryCode = countryCode;\n widget.orderId = String(orderId);\n widget.email = email;\n widget.cartTotal = cartTotal;\n widget.cart = cart;\n widget.discountCodes = discountCodes;\n widget.currencyCode = currencyCode;\n widget.lang = lang;\n widget.debug = debug;\n\n // Insert widget into DOM\n parentElement.appendChild(widget);\n}\n"],"names":["SHOPIFY_BASE_URL","isBeamCartIntegrationRegistered","SHOPIFY_CART_COOKIE_NAME","registerCartIntegration","config","currentCart","getCurrentCart","updateCart","initNetworkListeners","BeamNetworkCallEvent","_event","event","cartChangePaths","requestUrlStr","url","eventDetail","BeamCartChangeEvent","lastNonprofitId","lastSelectionId","BeamNonprofitSelectEvent","selectedNonprofitId","selectionId","cartId","getCookieValue","beamCartId","BEAM_CART_COOKIE_NAME","chainId","storeId","addBeamAttributesToCart","token","total_price","item_count","currency","items","res","cart","sku","final_line_price","changed","cachedCart","createScopedLocalStorage","isEqual","trackCart","beamCartAttrs","err","showBeamOrderPageWidgets","parentSelector","apiKey","baseUrl","DEFAULT_BASE_URL","postalCode","countryCode","orderId","email","cartTotal","discountCodes","currencyCode","lang","debug","parentElement","waitForElement","BeamError","beamLocalStorage","existingValue","widget"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as o}from"./local-storage-
|
|
2
|
-
//# sourceMappingURL=remote-session-
|
|
1
|
+
import{c as o}from"./local-storage-GYvYzZ_j.esm.js";const t="remote_session_id";function a({remoteSessionId:e,apiKey:s=""}){o({apiKey:s}).setItem(t,e)}function i({apiKey:e=""}){return o({apiKey:e}).getItem(t)}export{i as g,a as s};
|
|
2
|
+
//# sourceMappingURL=remote-session-V4YG-mcS.esm.js.map
|
package/dist/chunks/{remote-session-mmQFfNd6.esm.js.map → remote-session-V4YG-mcS.esm.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-session-
|
|
1
|
+
{"version":3,"file":"remote-session-V4YG-mcS.esm.js","sources":["../../src/shared/remote-session.ts"],"sourcesContent":["import { createScopedLocalStorage } from \"./local-storage\";\n\nconst REMOTE_SESSION_ID_KEY = \"remote_session_id\";\n\nexport function saveRemoteSession({ remoteSessionId, apiKey = \"\" }: { remoteSessionId: string; apiKey?: string }) {\n const beamLocalStorage = createScopedLocalStorage({\n apiKey,\n });\n beamLocalStorage.setItem(REMOTE_SESSION_ID_KEY, remoteSessionId);\n}\n\nexport function getRemoteSession({ apiKey = \"\" }: { apiKey?: string }) {\n const beamLocalStorage = createScopedLocalStorage({\n apiKey,\n });\n return beamLocalStorage.getItem(REMOTE_SESSION_ID_KEY);\n}\n"],"names":["REMOTE_SESSION_ID_KEY","saveRemoteSession","remoteSessionId","apiKey","createScopedLocalStorage","getRemoteSession"],"mappings":"oDAEA,MAAMA,EAAwB,oBAEvB,SAASC,EAAkB,CAAE,gBAAAC,EAAiB,OAAAC,EAAS,EAAG,EAAiD,CACvFC,EAAyB,CAChD,OAAAD,CACF,CAAC,EACgB,QAAQH,EAAuBE,CAAe,CACjE,CAEO,SAASG,EAAiB,CAAE,OAAAF,EAAS,EAAG,EAAwB,CAIrE,OAHyBC,EAAyB,CAChD,OAAAD,CACF,CAAC,EACuB,QAAQH,CAAqB,CACvD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{B as E,N as h}from"./beam-errors-AMvTvR1C.esm.js";const c="\u{1F308} Beam:",p={error:(...e)=>console.error(c,...e),log:(...e)=>console.log(c,...e),warn:(...e)=>console.warn(c,...e),debug:(...e)=>console.debug(c,...e)};var C="1.31.1",O={"@lit/react":"1.0.0","@lukeed/uuid":"2.0.0","@shoelace-style/shoelace":"2.11.2",lit:"2.6.1","lodash-es":"4.17.21","lucide-static":"0.292.0"};async function v(e,s){const l={method:"GET",...s,headers:{"Content-Type":"application/json",Accept:"application/json","X-Beam-Client":"WebSDK","X-Beam-Client-Version":C,...s?.headers},preflightContinue:!0,mode:s?.mode||"cors",body:s?.body!=null?s.body:void 0};let r;try{r=await fetch(e,l)}catch(t){const o=new E(`Network call failed (${l?.method.toUpperCase()} ${e})`);throw o.cause=t,p.error(o,e),o}let n,i;try{i=await r.text(),i&&(n=JSON.parse(i))}catch(t){let o=t;throw t instanceof SyntaxError&&(o=new h(r,n,`Response invalid. Expected JSON. Received: "${i}"`),o.cause=t),p.error(o),o}if(!r.ok){const t=new h(r,n,"Response was not OK");throw p.error(t),t}return n}const m="https://production-central-backend-ne.beamimpact.com",U="https://production.beamimpactlogs.com",L={en:"en",fr:"fr",de:"de",es:"es",it:"it",pl:"pl"},a=(e,s,l)=>({[e]:async function({headers:r={},baseUrl:n=m,apiRoot:i="/api/v3",pathParams:t={},queryParams:o={},requestBody:u}){const f=Object.entries(t).reduce((b,[w,N])=>b.replace(`{${w}}`,N),e),g=JSON.parse(JSON.stringify(o)),d=new URLSearchParams(g).toString(),y=n+i+f+(d&&`?${d}`),S={headers:r,method:s,body:JSON.stringify(u)};return v(y,S)}})[e],R=a("/chain/{chainId}/nonprofits","get"),T=a("/impact","get"),k=a("/chain/{chainId}/cumulativeImpact","get"),A=a("/selectNonprofit","post"),B=a("/transaction","post"),x=a("/transaction/{transactionId}","put"),I=a("/cart","post"),J=a("/chain/findEligibleNonprofitsForCart","post"),D=a("/logs","post"),F=a("/experimentSession","post");export{m as D,L as S,I as a,U as b,D as c,B as d,T as e,J as f,R as g,A as h,x as i,k as j,O as k,p as l,F as p};
|
|
2
|
+
//# sourceMappingURL=routes-N9ZmkAD6.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes-N9ZmkAD6.esm.js","sources":["../../src/shared/logger.ts","../../src/api-sdk/fetch-json.ts","../../src/api-sdk/constants.ts","../../src/api-sdk/v3/make-openapi-method.ts","../../src/api-sdk/v3/routes.ts"],"sourcesContent":["const LOG_PREFIX = \"🌈 Beam:\";\n\n// This may eventually log output to Beam servers, control log verbosity, etc.\n// For now it is an alias of the default JS console\nexport const logger = {\n error: (...args: any[]) => console.error(LOG_PREFIX, ...args),\n log: (...args: any[]) => console.log(LOG_PREFIX, ...args),\n warn: (...args: any[]) => console.warn(LOG_PREFIX, ...args),\n debug: (...args: any[]) => console.debug(LOG_PREFIX, ...args),\n};\n","/**\n * Wrapper over window.fetch that expects/returns JSON\n */\nimport { BeamError, NetworkError } from \"../shared/beam-errors\";\nimport { logger } from \"../shared/logger\";\nimport { version as pkgVersion } from \"../../package.json\";\n\nexport async function fetchJson<T = unknown>(url: RequestInfo, options?: RequestInit): Promise<T> {\n const fetchOptions = {\n method: \"GET\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"X-Beam-Client\": \"WebSDK\",\n \"X-Beam-Client-Version\": pkgVersion,\n ...options?.headers,\n },\n preflightContinue: true,\n mode: options?.mode || \"cors\",\n body: options?.body != null ? options.body : undefined,\n };\n\n let response;\n try {\n response = await fetch(url, fetchOptions);\n // fetch can throw a TypeError if the server can't be reached, catch and log below\n } catch (err) {\n const error = new BeamError(`Network call failed (${fetchOptions?.method.toUpperCase()} ${url})`);\n error.cause = err;\n logger.error(error, url);\n throw error;\n }\n let body;\n let text;\n // This can throw a SyntaxError if response payload is malformed JSON\n try {\n text = await response.text();\n if (text) {\n // (response can be empty)\n body = JSON.parse(text);\n }\n } catch (err) {\n let error = err as Error;\n if (err instanceof SyntaxError) {\n error = new NetworkError(response, body, `Response invalid. Expected JSON. Received: \"${text}\"`);\n error.cause = err;\n }\n logger.error(error);\n throw error;\n }\n // Translate 4xx, 5xx status to runtime error\n if (!response.ok) {\n const error = new NetworkError(response, body, \"Response was not OK\");\n logger.error(error);\n throw error;\n }\n\n return body;\n}\n","import { LANGUAGES, TUrl } from \"./types\";\n\nexport const DEFAULT_BASE_URL: TUrl = \"https://production-central-backend-ne.beamimpact.com\";\n\nexport const DEFAULT_LOG_URL = \"https://production.beamimpactlogs.com\";\n\nexport const SUPPORTED_LANGUAGES: Record<string, LANGUAGES> = {\n en: \"en\",\n fr: \"fr\",\n de: \"de\",\n es: \"es\",\n it: \"it\",\n pl: \"pl\",\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { fetchJson } from \"../fetch-json\";\nimport { DEFAULT_BASE_URL } from \"../constants\";\nimport { THttpMethod } from \"../types\";\nimport { paths } from \"./openapi-spec\";\n\nexport const makeOpenApiMethod = <\n TPathName extends keyof paths,\n TMethod extends keyof paths[TPathName],\n TStatusCode extends paths[TPathName][TMethod] extends { responses: any }\n ? keyof paths[TPathName][TMethod][\"responses\"]\n : never\n>(\n pathName: TPathName,\n method: TMethod,\n okHttpStatus: TStatusCode\n) => {\n type TRouteSpec = paths[typeof pathName];\n type TRouteMethod = TRouteSpec[typeof method];\n type TParams = \"parameters\" extends keyof TRouteMethod ? TRouteMethod[\"parameters\"] : never;\n type TPathParams = TParams extends { path: any } ? TParams[\"path\"] : Record<string, never>;\n type TQueryParams = TParams extends { query: any } ? TParams[\"query\"] : Record<string, never>;\n type TRequestBody = TRouteMethod extends { requestBody: { content: { \"application/json\": any } } }\n ? TRouteMethod[\"requestBody\"][\"content\"][\"application/json\"]\n : never;\n type TAllResponses = TRouteMethod extends { responses: any } ? TRouteMethod[\"responses\"] : never;\n type TOkResponse = TAllResponses[typeof okHttpStatus] extends { content: { \"application/json\": any } }\n ? TAllResponses[typeof okHttpStatus][\"content\"][\"application/json\"]\n : never;\n const openApi = {\n [pathName]: async function ({\n headers = {},\n baseUrl = DEFAULT_BASE_URL,\n apiRoot = \"/api/v3\",\n pathParams = {},\n queryParams = {},\n requestBody,\n }: {\n baseUrl?: string;\n apiRoot?: string;\n pathParams?: TPathParams;\n queryParams?: TQueryParams;\n requestBody?: TRequestBody;\n headers?: Record<string, string>;\n }) {\n const pathWithParams: string = Object.entries(pathParams).reduce((newPath: string, [k, v]) => {\n return newPath.replace(`{${k}}`, v as string);\n }, pathName as string);\n const cleanQueryParams = JSON.parse(JSON.stringify(queryParams));\n const search = new URLSearchParams(cleanQueryParams as unknown as Record<string, string>).toString();\n const url = baseUrl + apiRoot + pathWithParams + (search && `?${search}`);\n const options = { headers, method: method as THttpMethod, body: JSON.stringify(requestBody) };\n\n return fetchJson<TOkResponse>(url, options);\n },\n };\n\n // Use object to create function with dynamic name, for better stacktraces\n return openApi[pathName];\n};\n","import { makeOpenApiMethod } from \"./make-openapi-method\";\n\nexport const getChainNonprofits = makeOpenApiMethod(\"/chain/{chainId}/nonprofits\", \"get\", 200);\n\nexport const getImpact = makeOpenApiMethod(\"/impact\", \"get\", 200);\n\nexport const getCumulativeImpact = makeOpenApiMethod(\"/chain/{chainId}/cumulativeImpact\", \"get\", 200);\n\nexport const postSelectNonprofit = makeOpenApiMethod(\"/selectNonprofit\", \"post\", 201);\n\nexport const postTransaction = makeOpenApiMethod(\"/transaction\", \"post\", 201);\n\nexport const putTransaction = makeOpenApiMethod(\"/transaction/{transactionId}\", \"put\", 204);\n\nexport const postCart = makeOpenApiMethod(\"/cart\", \"post\", 200);\n\nexport const postChainEligibleNonprofitsForCart = makeOpenApiMethod(\n \"/chain/findEligibleNonprofitsForCart\",\n \"post\",\n 200\n);\n\nexport const postLogs = makeOpenApiMethod(\"/logs\", \"post\", 200);\n\nexport const postExperimentSession = makeOpenApiMethod(\"/experimentSession\", \"post\", 200);\n"],"names":["LOG_PREFIX","logger","args","fetchJson","url","options","fetchOptions","pkgVersion","response","err","error","BeamError","body","text","NetworkError","DEFAULT_BASE_URL","DEFAULT_LOG_URL","SUPPORTED_LANGUAGES","makeOpenApiMethod","pathName","method","okHttpStatus","headers","baseUrl","apiRoot","pathParams","queryParams","requestBody","pathWithParams","newPath","k","v","cleanQueryParams","search","getChainNonprofits","getImpact","getCumulativeImpact","postSelectNonprofit","postTransaction","putTransaction","postCart","postChainEligibleNonprofitsForCart","postLogs","postExperimentSession"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Number ID */
|
|
2
|
+
type TNumericId = number;
|
|
3
|
+
/** String ID */
|
|
4
|
+
type TId = string;
|
|
5
|
+
/** Beam API key format (prefix.uuid) */
|
|
6
|
+
type TApiKey = string;
|
|
7
|
+
/** Full URL without trailing slash */
|
|
8
|
+
type TUrl = string;
|
|
9
|
+
|
|
10
|
+
export type { TApiKey as T, TUrl as a, TNumericId as b, TId as c };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as y}from"./lodash-ZxBiuGue.esm.js";import{D as B,a as E}from"./routes-N9ZmkAD6.esm.js";import{B as g}from"./beam-errors-AMvTvR1C.esm.js";import{B as l}from"./cart-contents-h60geKWa.esm.js";import{a as A,s as v}from"./cookies-BnIoXWd0.esm.js";import{c as K,B as S}from"./events-wNy5BoJV.esm.js";import{c as _}from"./local-storage-GYvYzZ_j.esm.js";import{g as L}from"./remote-session-V4YG-mcS.esm.js";async function U(e,c){try{const t=_({apiKey:e.apiKey}),w=e.baseUrl??B,a=t.getItemJson("cart"),o=await A(l)??null,b=L(e)??void 0,{cartId:r,subtotal:s,itemCount:i,currencyCode:n,content:{items:d=[]}={},schema:u={source:"generic"}}=c,C={cartId:r,subtotal:s,itemCount:i,currencyCode:n,content:{items:d},schema:u,beamCartId:o};if(y(C,{...a,cartId:a?.cartId})||c.itemCount===0&&(!o||a?.itemCount===0))return;const f=await E({baseUrl:w,headers:{authorization:`Api-Key ${e.apiKey}`},requestBody:{beamCartId:o,storeId:e.storeId,remoteSessionId:b,cartId:r,subtotal:s,itemCount:i,currencyCode:n}}),{beamCartId:m,expiresAt:p,beamCartCreated:h}=f;m&&p&&await v({name:l,domain:e.domain,value:m,path:"/",expires:new Date(p).getTime()}),t.setItemJson("cart",{...C,beamCartId:m});const I={schema:u,content:{items:d},subtotal:s,itemCount:i,currencyCode:n,cartId:r};window.dispatchEvent(new K(I)),h&&window.dispatchEvent(new S(I))}catch(t){throw new g("Could not update cart in Beam",{cause:t})}}export{U as L};
|
|
2
|
+
//# sourceMappingURL=update-cart-TJ7G8Xfl.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-cart-TJ7G8Xfl.esm.js","sources":["../../src/integrations/cart/update-cart.ts"],"sourcesContent":["import isEqual from \"lodash-es/isEqual\";\nimport { DEFAULT_BASE_URL } from \"../../api-sdk/constants\";\nimport { BeamBaseAPIConfig } from \"../../api-sdk/types\";\nimport { postCart } from \"../../api-sdk/v3/routes\";\nimport { BeamError } from \"../../shared/beam-errors\";\nimport { BEAM_CART_COOKIE_NAME, TBeamCartLocalStorage, TCartApi } from \"../../shared/cart-contents\";\nimport { getCookieValue, setCookieValue } from \"../../shared/cookies\";\nimport { BeamCartChangeEvent, BeamCartCreatedEvent } from \"../../shared/events\";\nimport { createScopedLocalStorage } from \"../../shared/local-storage\";\nimport { getRemoteSession } from \"../../shared/remote-session\";\n\nexport type BeamCartAPIConfig = BeamBaseAPIConfig & {\n storeId: number;\n domain?: string; // Domain to set cookies on\n};\n\nexport type BeamCartValues = {\n cartId?: string; // External (partner) cart ID\n itemCount?: number;\n subtotal?: number;\n currencyCode?: string;\n} & Partial<TCartApi>;\n\n/**\n * Sends cart information to Beam\n * @side-effects Sets beam_cart cookie, set cart data in localstorage\n * @example\n * const BeamConfig = { apiKey: 'abc-123' }\n * const { beamCartId } = await updateCart(BeamConfig, { beamCartId, itemCount, subtotal, currencyCode })\n * */\nasync function updateCart(config: BeamCartAPIConfig, cartValues: BeamCartValues) {\n try {\n const localStorage = createScopedLocalStorage({ apiKey: config.apiKey });\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n // The cart cache is used to detect changes after page refreshes / across tabs\n const cachedCart: TBeamCartLocalStorage | null = localStorage.getItemJson(\"cart\");\n // The Beam cart cookie is used to identify the cart across subdomains\n // Use explicit null if empty because API requires it\n const beamCartId: string | null = (await getCookieValue(BEAM_CART_COOKIE_NAME)) ?? null;\n // Remote session ID (ie, device ID from an A/B testing tool) will be linked to the cart\n const remoteSessionId: string | undefined = getRemoteSession(config) ?? undefined;\n\n const {\n cartId,\n subtotal,\n itemCount,\n currencyCode,\n content: { items = [] } = {},\n schema = { source: \"generic\" },\n } = cartValues;\n\n const cartWithDefaults = {\n cartId,\n subtotal,\n itemCount,\n currencyCode,\n content: { items },\n schema,\n beamCartId,\n };\n\n // Early return conditions. Skip sending cart to Beam if any apply:\n // 1. The cart has not changed\n // 2. Cart is empty, unless the cart was not empty before\n if (\n isEqual(cartWithDefaults, {\n ...cachedCart,\n cartId: cachedCart?.cartId /* make sure optional key is defined even if empty */,\n }) || // cart has not\n // changed, OR\n (cartValues.itemCount === 0 && // nothing in current cart, AND\n (!beamCartId || cachedCart?.itemCount === 0)) // no/expired prev cart or prev cart was empty\n ) {\n return;\n }\n\n const response = await postCart({\n baseUrl,\n headers: {\n authorization: `Api-Key ${config.apiKey}`,\n },\n requestBody: {\n beamCartId, // backwards compat: explicitly sending null here is required to get initial beamCartId\n storeId: config.storeId,\n remoteSessionId,\n cartId,\n subtotal,\n itemCount,\n currencyCode,\n },\n });\n\n // Response will contain a new beamCartId if one was not provided, or old one expired\n const { beamCartId: newBeamCartId, expiresAt, beamCartCreated } = response;\n\n if (newBeamCartId && expiresAt) {\n await setCookieValue({\n name: BEAM_CART_COOKIE_NAME,\n domain: config.domain,\n value: newBeamCartId,\n path: \"/\",\n // If we don't set an expiration, the cookie will be cleared when the tab is closed\n expires: new Date(expiresAt).getTime(),\n });\n }\n\n localStorage.setItemJson(\"cart\", {\n ...cartWithDefaults,\n beamCartId: newBeamCartId,\n });\n\n const eventDetail = {\n schema: schema as any, // TS union type can't figure out what variant applies here\n content: {\n items: items as any,\n },\n subtotal,\n itemCount,\n currencyCode,\n cartId,\n };\n\n // emit change event on any create/update/delete of cart items\n window.dispatchEvent(new BeamCartChangeEvent(eventDetail));\n\n // emit created event only when the cart is new according to Beam\n if (beamCartCreated) {\n window.dispatchEvent(new BeamCartCreatedEvent(eventDetail));\n }\n } catch (err) {\n throw new BeamError(\"Could not update cart in Beam\", { cause: err });\n }\n}\n\nexport { updateCart };\n"],"names":["updateCart","config","cartValues","localStorage","createScopedLocalStorage","baseUrl","DEFAULT_BASE_URL","cachedCart","beamCartId","getCookieValue","BEAM_CART_COOKIE_NAME","remoteSessionId","getRemoteSession","cartId","subtotal","itemCount","currencyCode","items","schema","cartWithDefaults","isEqual","response","postCart","newBeamCartId","expiresAt","beamCartCreated","setCookieValue","eventDetail","BeamCartChangeEvent","BeamCartCreatedEvent","err","BeamError"],"mappings":"yZA8BA,eAAeA,EAAWC,EAA2BC,EAA4B,CAC/E,GAAI,CACF,MAAMC,EAAeC,EAAyB,CAAE,OAAQH,EAAO,MAAO,CAAC,EACjEI,EAAUJ,EAAO,SAAWK,EAG5BC,EAA2CJ,EAAa,YAAY,MAAM,EAG1EK,EAA6B,MAAMC,EAAeC,CAAqB,GAAM,KAE7EC,EAAsCC,EAAiBX,CAAM,GAAK,OAElE,CACJ,OAAAY,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,EACA,QAAS,CAAE,MAAAC,EAAQ,EAAG,EAAI,GAC1B,OAAAC,EAAS,CAAE,OAAQ,SAAU,CAC/B,EAAIhB,EAEEiB,EAAmB,CACvB,OAAAN,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,EACA,QAAS,CAAE,MAAAC,CAAM,EACjB,OAAAC,EACA,WAAAV,CACF,EAKA,GACEY,EAAQD,EAAkB,CACxB,GAAGZ,EACH,OAAQA,GAAY,MACtB,CAAC,GAEAL,EAAW,YAAc,IACvB,CAACM,GAAcD,GAAY,YAAc,GAE5C,OAGF,MAAMc,EAAW,MAAMC,EAAS,CAC9B,QAAAjB,EACA,QAAS,CACP,cAAe,WAAWJ,EAAO,MAAM,EACzC,EACA,YAAa,CACX,WAAAO,EACA,QAASP,EAAO,QAChB,gBAAAU,EACA,OAAAE,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,CACF,CACF,CAAC,EAGK,CAAE,WAAYO,EAAe,UAAAC,EAAW,gBAAAC,CAAgB,EAAIJ,EAE9DE,GAAiBC,GACnB,MAAME,EAAe,CACnB,KAAMhB,EACN,OAAQT,EAAO,OACf,MAAOsB,EACP,KAAM,IAEN,QAAS,IAAI,KAAKC,CAAS,EAAE,QAC/B,CAAA,CAAC,EAGHrB,EAAa,YAAY,OAAQ,CAC/B,GAAGgB,EACH,WAAYI,CACd,CAAC,EAED,MAAMI,EAAc,CAClB,OAAQT,EACR,QAAS,CACP,MAAOD,CACT,EACA,SAAAH,EACA,UAAAC,EACA,aAAAC,EACA,OAAAH,CACF,EAGA,OAAO,cAAc,IAAIe,EAAoBD,CAAW,CAAC,EAGrDF,GACF,OAAO,cAAc,IAAII,EAAqBF,CAAW,CAAC,CAE9D,OAASG,EAAK,CACZ,MAAM,IAAIC,EAAU,gCAAiC,CAAE,MAAOD,CAAI,CAAC,CACrE,CACF"}
|
|
@@ -3,7 +3,7 @@ import { LitElement } from 'lit';
|
|
|
3
3
|
import * as lit_html from 'lit-html';
|
|
4
4
|
import '../chunks/progress-bar-0VS_AmEf.esm.js';
|
|
5
5
|
import './beam-partner-logos.js';
|
|
6
|
-
import {
|
|
6
|
+
import { b as TNumericId } from '../chunks/types-7kSi85Gv.esm.js';
|
|
7
7
|
import { L as LANGUAGES } from '../chunks/types-aju0qrRe.esm.js';
|
|
8
8
|
|
|
9
9
|
type RequiredConfig = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{h as x,f as g,t as I,g as v,y as p,k as b,m as u}from"../chunks/lit-h1W25hjN.esm.js";import{p as $}from"../chunks/progress-bar-w3yfrrxD.esm.js";import{partnerLogosConfigDefaults as T}from"./beam-partner-logos.esm.js";import{c as k,u as n,d as w,e as S,A,i as c,a as L,_ as C,b as m,f as z}from"../chunks/localize-
|
|
1
|
+
import{h as x,f as g,t as I,g as v,y as p,k as b,m as u}from"../chunks/lit-h1W25hjN.esm.js";import{p as $}from"../chunks/progress-bar-w3yfrrxD.esm.js";import{partnerLogosConfigDefaults as T}from"./beam-partner-logos.esm.js";import{c as k,u as n,d as w,e as S,A,i as c,a as L,_ as C,b as m,f as z}from"../chunks/localize-kPkHxPNe.esm.js";import{D as F,e as D,S as M}from"../chunks/routes-N9ZmkAD6.esm.js";import{B as U}from"../chunks/beam-errors-AMvTvR1C.esm.js";import{c as f}from"../chunks/css-card-grid-RRkoiUTl.esm.js";const y={en:{fundedTimes:({times:i=0})=>`Funded <b>${i}</b> ${i>1?"times":"time"} so far`,learnMore:()=>"Learn more",seeAll:()=>"See All"},fr:{fundedTimes:({times:i=0})=>`Financ\xE9 <b>${i}</b> fois pour l'instant`,learnMore:()=>"En savoir plus",seeAll:()=>"Voir tout"},de:{fundedTimes:({times:i=0})=>`<b>${i}</b> Mal finanziert`,learnMore:()=>"Mehr erfahren",seeAll:()=>"Alle anzeigen"},es:{fundedTimes:({times:i=0})=>`Financiado <b>${i}</b> ${i>1?"vez":"veces"}`,learnMore:()=>"Saber m\xE1s",seeAll:()=>"Ver Todo"},it:{fundedTimes:({times:i=0})=>`Finanziato <b>${i}</b> ${i>1?"volta":"volte"}`,learnMore:()=>"Scopri di pi\xF9",seeAll:()=>"Vedi Tutto"},pl:{fundedTimes:({times:i=0})=>`Udzielono wsparcia <b>${i}</b> ${i>1?"razy":"raz"}`,learnMore:()=>"Dowiedz si\u0119 wi\u0119cej",seeAll:()=>"Zobacz wszystko"}};var E=Object.defineProperty,P=Object.getOwnPropertyDescriptor,d=(i,a,t,r)=>{for(var o=r>1?void 0:r?P(a,t):a,e=i.length-1,l;e>=0;e--)(l=i[e])&&(o=(r?l(a,t,o):l(o))||o);return r&&o&&E(a,t,o),o};class s extends v{constructor(){super(...arguments),this.baseUrl=F,this.cardStyle="image",this.lang="en",this.debug=!1,this.selectedFilter=null,this.getImpactData=async()=>(S(["apiKey","chainId"],this),D({baseUrl:this.baseUrl,headers:{authorization:`Api-Key ${this.apiKey}`},queryParams:{chainId:this.chainId,personalImpactLimit:0,widgetName:"community-impact",version:"1.0.0",lang:this.configLang}})),this.impactDataController=new A(this,this.getImpactData),this.renderImageCard=a=>p`
|
|
2
2
|
<div class="image-card" part="nonprofit-card" style="display: flex; flex-direction: column;">
|
|
3
3
|
<div class="image-card-image-box" style="background-image: url('${a.imageUrl}');">
|
|
4
4
|
<p class="image-card-cause">${c(this.configLang,a.nonprofit?.cause||"")}</p>
|