@beamimpact/web-sdk 1.55.5 → 1.55.7

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.
Files changed (161) hide show
  1. package/dist/chunks/{_share-dialog-dependencies-o8GVV6gC.esm.js → _share-dialog-dependencies-BVNp0oLJ.esm.js} +2 -2
  2. package/dist/chunks/{_share-dialog-dependencies-o8GVV6gC.esm.js.map → _share-dialog-dependencies-BVNp0oLJ.esm.js.map} +1 -1
  3. package/dist/chunks/{_share-dialog-dependencies-BVseSHLF.esm.js → _share-dialog-dependencies-D4i8Nvve.esm.js} +2 -2
  4. package/dist/chunks/{_share-dialog-dependencies-BVseSHLF.esm.js.map → _share-dialog-dependencies-D4i8Nvve.esm.js.map} +1 -1
  5. package/dist/chunks/{events-D-3N9lQA.esm.d.ts → events-B7l6VPsF.esm.d.ts} +2 -0
  6. package/dist/chunks/events-Dki0ka4F.esm.js.map +1 -1
  7. package/dist/chunks/{index-DiNDMv3P.esm.js → index-BAgWh5OK.esm.js} +2 -2
  8. package/dist/chunks/index-BAgWh5OK.esm.js.map +1 -0
  9. package/dist/chunks/{index-CoYyg3fw.esm.d.ts → index-Bliur1O3.esm.d.ts} +1 -1
  10. package/dist/chunks/index-C0J0SqUr.esm.js +2 -0
  11. package/dist/chunks/index-C0J0SqUr.esm.js.map +1 -0
  12. package/dist/chunks/{index-MoK57RXU.esm.js → index-CG2AhvV9.esm.js} +2 -2
  13. package/dist/chunks/index-CG2AhvV9.esm.js.map +1 -0
  14. package/dist/chunks/index-CLNjLpMX.esm.js +2 -0
  15. package/dist/chunks/index-CLNjLpMX.esm.js.map +1 -0
  16. package/dist/chunks/{index-BNHAn1OG.esm.js → index-CWnHkgy3.esm.js} +2 -2
  17. package/dist/chunks/{index-BNHAn1OG.esm.js.map → index-CWnHkgy3.esm.js.map} +1 -1
  18. package/dist/chunks/{index-cxEi49sX.esm.d.ts → index-DEoMwStx.esm.d.ts} +1 -1
  19. package/dist/chunks/index-DFGxZmsj.esm.js +2 -0
  20. package/dist/chunks/index-DFGxZmsj.esm.js.map +1 -0
  21. package/dist/chunks/{index-DbT2CExl.esm.d.ts → index-DHK-p5LV.esm.d.ts} +1 -1
  22. package/dist/chunks/{index-D1Pso4Mx.esm.js → index-DKAZRTl5.esm.js} +2 -2
  23. package/dist/chunks/{index-D1Pso4Mx.esm.js.map → index-DKAZRTl5.esm.js.map} +1 -1
  24. package/dist/chunks/{index-BWtaQiQa.esm.js → index-DPptZHfR.esm.js} +3 -3
  25. package/dist/chunks/index-DPptZHfR.esm.js.map +1 -0
  26. package/dist/chunks/{index-CIQxph2z.esm.js → index-DjrWwYdg.esm.js} +2 -2
  27. package/dist/chunks/index-DjrWwYdg.esm.js.map +1 -0
  28. package/dist/chunks/{index-CVNcspb0.esm.js → index-DmUEFwoM.esm.js} +2 -2
  29. package/dist/chunks/index-DmUEFwoM.esm.js.map +1 -0
  30. package/dist/chunks/{index-IAa5EO-6.esm.js → index-DvhxjeiK.esm.js} +3 -3
  31. package/dist/chunks/index-DvhxjeiK.esm.js.map +1 -0
  32. package/dist/chunks/index-NHPT4c0V.esm.js +2 -0
  33. package/dist/chunks/index-NHPT4c0V.esm.js.map +1 -0
  34. package/dist/chunks/{order-page-C41TBLoV.esm.js → order-page-C3b348k0.esm.js} +2 -2
  35. package/dist/chunks/{order-page-C41TBLoV.esm.js.map → order-page-C3b348k0.esm.js.map} +1 -1
  36. package/dist/chunks/{order-page-Brrq-LAx.esm.js → order-page-CuL1s6HR.esm.js} +2 -2
  37. package/dist/chunks/{order-page-Brrq-LAx.esm.js.map → order-page-CuL1s6HR.esm.js.map} +1 -1
  38. package/dist/chunks/{promo-pill-label-BESRGLn7.esm.js → promo-pill-label-BihVdXIv.esm.js} +2 -2
  39. package/dist/chunks/{promo-pill-label-BESRGLn7.esm.js.map → promo-pill-label-BihVdXIv.esm.js.map} +1 -1
  40. package/dist/chunks/{promo-pill-label-YOC47M3t.esm.js → promo-pill-label-CD0lWdsv.esm.js} +2 -2
  41. package/dist/chunks/{promo-pill-label-YOC47M3t.esm.js.map → promo-pill-label-CD0lWdsv.esm.js.map} +1 -1
  42. package/dist/chunks/{routes-BGx3ADhY.esm.js → routes-BHChxaFQ.esm.js} +2 -2
  43. package/dist/chunks/{routes-BGx3ADhY.esm.js.map → routes-BHChxaFQ.esm.js.map} +1 -1
  44. package/dist/chunks/{routes-D0_9umO_.esm.js → routes-E1gMJl6d.esm.js} +2 -2
  45. package/dist/chunks/{routes-D0_9umO_.esm.js.map → routes-E1gMJl6d.esm.js.map} +1 -1
  46. package/dist/chunks/{share-button-CV5FZFS9.esm.js → share-button-BJ8T-uYK.esm.js} +2 -2
  47. package/dist/chunks/{share-button-CV5FZFS9.esm.js.map → share-button-BJ8T-uYK.esm.js.map} +1 -1
  48. package/dist/chunks/{share-button-BmoEHT-C.esm.js → share-button-BnNOZHBt.esm.js} +2 -2
  49. package/dist/chunks/{share-button-BmoEHT-C.esm.js.map → share-button-BnNOZHBt.esm.js.map} +1 -1
  50. package/dist/chunks/{share-button-DcaL0AYo.esm.js → share-button-BzmG48J9.esm.js} +2 -2
  51. package/dist/chunks/{share-button-DcaL0AYo.esm.js.map → share-button-BzmG48J9.esm.js.map} +1 -1
  52. package/dist/chunks/{share-button-D-c9M84d.esm.js → share-button-VEIdBFu3.esm.js} +2 -2
  53. package/dist/chunks/{share-button-D-c9M84d.esm.js.map → share-button-VEIdBFu3.esm.js.map} +1 -1
  54. package/dist/chunks/{update-cart-CFB8JVgq.esm.js → update-cart-C6BdmBt1.esm.js} +2 -2
  55. package/dist/chunks/{update-cart-CFB8JVgq.esm.js.map → update-cart-C6BdmBt1.esm.js.map} +1 -1
  56. package/dist/chunks/{update-cart-Dsu0mPtW.esm.js → update-cart-HlVGSYR7.esm.js} +2 -2
  57. package/dist/chunks/{update-cart-Dsu0mPtW.esm.js.map → update-cart-HlVGSYR7.esm.js.map} +1 -1
  58. package/dist/components/community-impact.esm.js +1 -1
  59. package/dist/components/community-impact.js +1 -1
  60. package/dist/components/cumulative-impact.esm.js +1 -1
  61. package/dist/components/cumulative-impact.js +1 -1
  62. package/dist/components/impact-overview.esm.js +1 -1
  63. package/dist/components/impact-overview.js +1 -1
  64. package/dist/components/index.esm.js +1 -1
  65. package/dist/components/index.js +1 -1
  66. package/dist/components/post-purchase.d.ts +1 -1
  67. package/dist/components/post-purchase.esm.js +1 -1
  68. package/dist/components/post-purchase.js +1 -1
  69. package/dist/components/product-details-page.d.ts +1 -1
  70. package/dist/components/product-details-page.esm.js +4 -4
  71. package/dist/components/product-details-page.esm.js.map +1 -1
  72. package/dist/components/product-details-page.js +4 -4
  73. package/dist/components/product-details-page.js.map +1 -1
  74. package/dist/components/redeem-transaction.d.ts +1 -1
  75. package/dist/components/redeem-transaction.esm.js +1 -1
  76. package/dist/components/redeem-transaction.js +1 -1
  77. package/dist/components/select-nonprofit.d.ts +2 -1
  78. package/dist/components/select-nonprofit.esm.js +15 -15
  79. package/dist/components/select-nonprofit.esm.js.map +1 -1
  80. package/dist/components/select-nonprofit.js +15 -15
  81. package/dist/components/select-nonprofit.js.map +1 -1
  82. package/dist/components/select-subscription-nonprofit.d.ts +1 -1
  83. package/dist/components/select-subscription-nonprofit.esm.js +2 -2
  84. package/dist/components/select-subscription-nonprofit.esm.js.map +1 -1
  85. package/dist/components/select-subscription-nonprofit.js +2 -2
  86. package/dist/components/select-subscription-nonprofit.js.map +1 -1
  87. package/dist/components/shopify.d.ts +1 -1
  88. package/dist/components/shopify.esm.js +1 -1
  89. package/dist/components/shopify.js +1 -1
  90. package/dist/components/social-share.esm.js +1 -1
  91. package/dist/components/social-share.js +1 -1
  92. package/dist/components/subscription-impact.d.ts +1 -1
  93. package/dist/components/subscription-impact.esm.js +1 -1
  94. package/dist/components/subscription-impact.js +1 -1
  95. package/dist/components/subscription-management.d.ts +1 -1
  96. package/dist/components/subscription-management.esm.js +1 -1
  97. package/dist/components/subscription-management.esm.js.map +1 -1
  98. package/dist/components/subscription-management.js +1 -1
  99. package/dist/components/subscription-management.js.map +1 -1
  100. package/dist/index.d.ts +4 -4
  101. package/dist/index.esm.js +1 -1
  102. package/dist/index.js +1 -1
  103. package/dist/integrations/beam.esm.js +1 -1
  104. package/dist/integrations/beam.js +1 -1
  105. package/dist/integrations/cart.esm.js +1 -1
  106. package/dist/integrations/cart.js +1 -1
  107. package/dist/integrations/index.d.ts +2 -2
  108. package/dist/integrations/index.esm.js +1 -1
  109. package/dist/integrations/index.js +1 -1
  110. package/dist/integrations/logs.esm.js +1 -1
  111. package/dist/integrations/logs.js +1 -1
  112. package/dist/integrations/shopify.esm.js +1 -1
  113. package/dist/integrations/shopify.js +1 -1
  114. package/dist/integrations/statsig.esm.js +1 -1
  115. package/dist/integrations/statsig.js +1 -1
  116. package/dist/integrations/utils.d.ts +1 -1
  117. package/dist/react/community-impact.esm.js +1 -1
  118. package/dist/react/community-impact.js +1 -1
  119. package/dist/react/cumulative-impact.esm.js +1 -1
  120. package/dist/react/cumulative-impact.js +1 -1
  121. package/dist/react/impact-overview.esm.js +1 -1
  122. package/dist/react/impact-overview.js +1 -1
  123. package/dist/react/index.d.ts +1 -1
  124. package/dist/react/index.esm.js +1 -1
  125. package/dist/react/index.js +1 -1
  126. package/dist/react/post-purchase.esm.js +1 -1
  127. package/dist/react/post-purchase.js +1 -1
  128. package/dist/react/product-details-page.esm.js +1 -1
  129. package/dist/react/product-details-page.js +1 -1
  130. package/dist/react/redeem-transaction.d.ts +1 -1
  131. package/dist/react/redeem-transaction.esm.js +1 -1
  132. package/dist/react/redeem-transaction.js +1 -1
  133. package/dist/react/select-nonprofit.d.ts +1 -1
  134. package/dist/react/select-nonprofit.esm.js +1 -1
  135. package/dist/react/select-nonprofit.js +1 -1
  136. package/dist/react/select-subscription-nonprofit.d.ts +1 -1
  137. package/dist/react/select-subscription-nonprofit.esm.js +1 -1
  138. package/dist/react/select-subscription-nonprofit.js +1 -1
  139. package/dist/react/social-share.esm.js +1 -1
  140. package/dist/react/social-share.js +1 -1
  141. package/dist/react/subscription-impact.esm.js +1 -1
  142. package/dist/react/subscription-impact.js +1 -1
  143. package/dist/react/subscription-management.esm.js +1 -1
  144. package/dist/react/subscription-management.js +1 -1
  145. package/dist/utils/events.d.ts +1 -1
  146. package/dist/utils/index.d.ts +1 -1
  147. package/package.json +1 -1
  148. package/dist/chunks/index-BWtaQiQa.esm.js.map +0 -1
  149. package/dist/chunks/index-CIQxph2z.esm.js.map +0 -1
  150. package/dist/chunks/index-CM59QOJP.esm.js +0 -2
  151. package/dist/chunks/index-CM59QOJP.esm.js.map +0 -1
  152. package/dist/chunks/index-CVNcspb0.esm.js.map +0 -1
  153. package/dist/chunks/index-CYxuuwlv.esm.js +0 -2
  154. package/dist/chunks/index-CYxuuwlv.esm.js.map +0 -1
  155. package/dist/chunks/index-DiNDMv3P.esm.js.map +0 -1
  156. package/dist/chunks/index-Dji1l8sT.esm.js +0 -2
  157. package/dist/chunks/index-Dji1l8sT.esm.js.map +0 -1
  158. package/dist/chunks/index-DsvbqqAd.esm.js +0 -2
  159. package/dist/chunks/index-DsvbqqAd.esm.js.map +0 -1
  160. package/dist/chunks/index-IAa5EO-6.esm.js.map +0 -1
  161. package/dist/chunks/index-MoK57RXU.esm.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import{m as $,y as i,f as P,g as c,t as v,h as D,q as C,k as z,u as E}from"./lit-WqMxC_PA.esm.js";import{d as I}from"./lodash-D3TLHRR_.esm.js";import{u as g,A as B,d as h,a as N,i as m,_ as x}from"./localize-Btu9xYcE.esm.js";import{m as R,D as L,d as M,W as y,S as A}from"./routes-D0_9umO_.esm.js";import{p as F}from"./progress-bar-DF7UuuHb.esm.js";import{p as U}from"./promo-pill-label-YOC47M3t.esm.js";import{partnerLogosConfigDefaults as W}from"../components/beam-partner-logos.esm.js";import{c as O,d as j,e as w,a as _}from"./enforce-config-CZ3ToOgr.esm.js";import{_ as K}from"./loading-template-DG4lkIIc.esm.js";import{M as V,B as H}from"./beam-errors-Ci0d3926.esm.js";import{createScopedLocalStorage as q}from"../utils/local-storage.esm.js";import{c as G}from"./css-card-grid-CvoGpsJH.esm.js";import{c as J}from"./events-Dki0ka4F.esm.js";const Q=R("/v4/transaction","post"),X=R("/v4/transaction/redeem/{transactionId}","put"),Y=({height:t="1em",width:e="1em"}={})=>i`
1
+ import{m as $,y as i,f as P,g as c,t as v,h as D,q as C,k as z,u as E}from"./lit-WqMxC_PA.esm.js";import{d as I}from"./lodash-D3TLHRR_.esm.js";import{u as g,A as B,d as h,a as N,i as m,_ as x}from"./localize-Btu9xYcE.esm.js";import{m as R,D as L,d as M,W as y,S as A}from"./routes-E1gMJl6d.esm.js";import{p as F}from"./progress-bar-DF7UuuHb.esm.js";import{p as U}from"./promo-pill-label-CD0lWdsv.esm.js";import{partnerLogosConfigDefaults as W}from"../components/beam-partner-logos.esm.js";import{c as O,d as j,e as w,a as _}from"./enforce-config-CZ3ToOgr.esm.js";import{_ as K}from"./loading-template-DG4lkIIc.esm.js";import{M as V,B as H}from"./beam-errors-Ci0d3926.esm.js";import{createScopedLocalStorage as q}from"../utils/local-storage.esm.js";import{c as G}from"./css-card-grid-CvoGpsJH.esm.js";import{c as J}from"./events-Dki0ka4F.esm.js";const Q=R("/v4/transaction","post"),X=R("/v4/transaction/redeem/{transactionId}","put"),Y=({height:t="1em",width:e="1em"}={})=>i`
2
2
  <svg
3
3
  style="${$({height:t,width:e,position:"relative",bottom:"0"})}"
4
4
  xmlns="http://www.w3.org/2000/svg"
@@ -7,7 +7,7 @@ import{m as $,y as i,f as P,g as c,t as v,h as D,q as C,k as z,u as E}from"./lit
7
7
  <!-- Filled Circle -->
8
8
  <circle cx="12" cy="12" r="10" fill="currentColor" />
9
9
  </svg>
10
- `,b={en:{beamAttribution:()=>"Powered by Beam",ctaTitle:()=>"Choose your impact",ctaPromoPrefixMessage:()=>"At no extra cost,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`select a nonprofit and ${t}% will be donated there for you.`,ctaMessage:({donationPercentage:t="1"}={})=>`At no extra cost, select a nonprofit and ${t}% will be donated there for you.`,submitButtonText:()=>"Confirm",submitButtonTextCompleted:()=>"Confirmed!",chooseButtonText:()=>"Choose a nonprofit"},fr:{beamAttribution:()=>"Optimis\xE9 par Beam",ctaTitle:()=>"Choisissez votre cause",ctaPromoPrefixMessage:()=>"Sans frais suppl\xE9mentaires,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`s\xE9lectionnez une association et ${t} % sera revers\xE9 en votre nom.`,ctaMessage:({donationPercentage:t="1"}={})=>`Sans frais suppl\xE9mentaires, choisissez une association et ${t} % de votre commande lui sera revers\xE9 en votre nom.`,submitButtonText:()=>"Confirmer",submitButtonTextCompleted:()=>"Confirm\xE9 !",chooseButtonText:()=>"Choisir une association"},de:{beamAttribution:()=>"Unterst\xFCtzt von Beam",ctaTitle:()=>"W\xE4hle deine Wirkung",ctaPromoPrefixMessage:()=>"Ohne zus\xE4tzliche Kosten,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`w\xE4hle eine gemeinn\xFCtzige Organisation und ${t}% werden in deinem Namen gespendet.`,ctaMessage:({donationPercentage:t="1"}={})=>`Ohne zus\xE4tzliche Kosten kannst du eine Organisation ausw\xE4hlen, und ${t}% deiner Bestellung werden gespendet.`,submitButtonText:()=>"Best\xE4tigen",submitButtonTextCompleted:()=>"Best\xE4tigt!",chooseButtonText:()=>"W\xE4hle eine Organisation"},es:{beamAttribution:()=>"Ofrecido por Beam",ctaTitle:()=>"Elige tu impacto",ctaPromoPrefixMessage:()=>"Sin coste adicional,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`elige una organizaci\xF3n y donaremos el ${t}% en tu nombre.`,ctaMessage:({donationPercentage:t="1"}={})=>`Sin coste adicional, elige una organizaci\xF3n sin \xE1nimo de lucro y donaremos el ${t}% de tu compra en tu nombre.`,submitButtonText:()=>"Confirmar",submitButtonTextCompleted:()=>"\xA1Confirmado!",chooseButtonText:()=>"Elige una organizaci\xF3n"},it:{beamAttribution:()=>"Promosso da Beam",ctaTitle:()=>"Scegli il tuo impatto",ctaPromoPrefixMessage:()=>"Senza costi aggiuntivi,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`scegli un'organizzazione e doneremo l\u2019${t}% per te.`,ctaMessage:({donationPercentage:t="1"}={})=>`Senza costi aggiuntivi, scegli un'organizzazione no profit e doneremo l\u2019${t}% del tuo acquisto a suo favore.`,submitButtonText:()=>"Conferma",submitButtonTextCompleted:()=>"Confermato!",chooseButtonText:()=>"Scegli un'organizzazione"},pl:{beamAttribution:()=>"Obs\u0142ugiwane przez Beam",ctaTitle:()=>"Wybierz sw\xF3j wp\u0142yw",ctaPromoPrefixMessage:()=>"Bez dodatkowych koszt\xF3w,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`wybierz organizacj\u0119, a ${t}% zostanie przekazane w Twoim imieniu.`,ctaMessage:({donationPercentage:t="1"}={})=>`Bez dodatkowych koszt\xF3w mo\u017Cesz wybra\u0107 organizacj\u0119, kt\xF3rej przeka\u017Cemy ${t}% warto\u015Bci Twojego zam\xF3wienia w Twoim imieniu.`,submitButtonText:()=>"Potwierd\u017A",submitButtonTextCompleted:()=>"Potwierdzono!",chooseButtonText:()=>"Wybierz organizacj\u0119"},ja:{beamAttribution:()=>"Powered by Beam",ctaTitle:()=>"\u5BC4\u4ED8\u5148\u3092\u304A\u9078\u3073\u304F\u3060\u3055\u3044\u3002",ctaPromoPrefixMessage:()=>"\u8FFD\u52A0\u8CBB\u7528\u306A\u3057\u3067\u3001",ctaPromoMessage:({donationPercentage:t="1"}={})=>`\u975E\u55B6\u5229\u56E3\u4F53\u3092\u9078\u3076\u3068\u3001${t}%\u304C\u305D\u306E\u56E3\u4F53\u306B\u5BC4\u4ED8\u3055\u308C\u307E\u3059\u3002`,ctaMessage:({donationPercentage:t="1"}={})=>`\u8FFD\u52A0\u8CBB\u7528\u306A\u3057\u3067\u975E\u55B6\u5229\u56E3\u4F53\u3092\u304A\u9078\u3073\u3044\u305F\u3060\u304F\u3068\u3001\u3054\u8CFC\u5165\u91D1\u984D\u306E${t}%\u304C\u5BC4\u4ED8\u3055\u308C\u307E\u3059\u3002`,submitButtonText:()=>"\u78BA\u8A8D\u3059\u308B",submitButtonTextCompleted:()=>"\u78BA\u8A8D\u6E08\u307F",chooseButtonText:()=>"\u975E\u55B6\u5229\u56E3\u4F53\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"}};var Z=Object.defineProperty,d=(t,e,o,a)=>{for(var n=void 0,u=t.length-1,l;u>=0;u--)(l=t[u])&&(n=l(e,o,n)||n);return n&&Z(e,o,n),n};class r extends D{constructor(){super(...arguments),this.baseUrl=L,this.lang="en",this.debug=!1,this.draftConfig=!1,this.isMobile=window.innerWidth<768,this.didUserExpandNonprofits=!1,this.shouldUsePromoUI=!1,this.getChainNonprofits=async()=>{if(!this.hasCorrectTransactionConfig)throw new V;const e=await M({baseUrl:this.baseUrl,headers:{authorization:`Api-Key ${this.apiKey}`},requestBody:{storeId:this.storeId,postalCode:this.postalCode,countryCode:this.countryCode,transactionId:String(this.transactionId),cart:this.cart??void 0,widgetName:y.redeem_transaction,options:{config:{draftConfig:this.draftConfig}},version:"2.0.0",lang:this.configLang}});return e.store?.id&&e.store.id!==this.storeId&&(this.storeId=e.store.id),this.localStorage.setItemJson("chainNonprofits",{createdAt:new Date,data:e}),e},this.updateNonprofitIdForRecord=async({selectedNonprofitId:e})=>this.transactionId?this.putTransaction({selectedNonprofitId:e}):null,this.putTransaction=async({selectedNonprofitId:e})=>(w(["apiKey","transactionId"],this),X({baseUrl:this.baseUrl,apiRoot:"/api",headers:{authorization:`Api-Key ${this.apiKey}`},pathParams:{transactionId:this.transactionId},requestBody:{nonprofitId:e}})),this.nonprofitListDataController=new B(this,this.getChainNonprofits),this.selectionDataController=new B(this,this.updateNonprofitIdForRecord),this.localStorage=q(this),this.makeHandleSelect=(e,o,a)=>async n=>{if(!this.allowChange)return;const u=this.selectedNonprofitId;if(n instanceof KeyboardEvent){let l=null;switch(n.key){case"ArrowUp":case"ArrowLeft":o===0?l=a[a.length-1]:l=a[o-1],n.preventDefault();break;case"ArrowRight":case"ArrowDown":o===a.length-1?l=a[0]:l=a[o+1],n.preventDefault();break;case"Enter":case" ":n.preventDefault();break;default:return}if(l){const p=this.renderRoot.querySelector(`[data-value="${l.nonprofit.id}"]`);p!==null&&(p.tabIndex=0,p.focus());return}}if(n.currentTarget instanceof HTMLElement){if(u===e)return;this.selectedNonprofitId=e}},this.handleSubmit=async()=>{const{selectedNonprofitId:e}=this;if(!this.allowSubmit||e==null)return;await this.selectionDataController.exec({selectedNonprofitId:e}),this.localStorage.setItem("nonprofit",e),this.localStorage.setItem("nonprofit_selected_at",new Date().toISOString());const o=this.nonprofitListDataController?.data?.nonprofits.find(a=>a.nonprofit.id===e);this.dispatchEvent(new J({selectedNonprofitId:e,nonprofitName:o?.nonprofit.name,source:y.redeem_transaction}))},this.evaluateBreakPoints=I(()=>{this.isMobile=window.innerWidth<768},50,{maxWait:50,leading:!0})}get configLang(){return A[this.lang]||"en"}get hasCorrectTransactionConfig(){return _(["apiKey","transactionId"],this)}connectedCallback(){super.connectedCallback(),window.addEventListener("resize",this.evaluateBreakPoints)}async firstUpdated(e){await this.restoreStateFromCache()}async updated(e){const o=["baseUrl","storeId","apiKey","countryCode","postalCode","lang"];for(const a of o)if(e.has(a)){await this.nonprofitListDataController.exec();break}}disconnectedCallback(){super.disconnectedCallback()}restoreStateFromCache(){w(["apiKey"],this),this.selectedNonprofitId=parseInt(this.localStorage.getItem("nonprofit")||"")||void 0;try{const{createdAt:e=0,data:o}=this.localStorage.getItemJson("chainNonprofits")||{},a=2*60*60*1e3;new Date(e).valueOf()+a>new Date().valueOf()&&(this.nonprofitListDataController.data=o,this.nonprofitListDataController.loading=!1)}catch{}}get allowChange(){return this.selectionDataController.data==null&&!this.selectionDataController.loading}get allowSubmit(){return!!(this.selectedNonprofitId&&this.allowChange)}get cssVariables(){const e={"--beam-fontFamily":"inherit","--beam-fontStyle":"inherit","--beam-fontSize":"inherit","--beam-textColor":"inherit","--beam-backgroundColor":"inherit",...h("--beam-RedeemTransaction-title",{fontSize:"1.25em",fontWeight:"bold"}),...h("--beam-RedeemTransaction-description",{marginTop:"0.5em",lineHeight:"normal"}),...W,...F,"--beam-RedeemTransaction-maxWidth":"1000px","--beam-RedeemTransaction-submitButton-fontSize":"14px","--beam-RedeemTransaction-submitButton-fontWeight":"inherit","--beam-RedeemTransaction-submitButton-fontFamily":"inherit","--beam-RedeemTransaction-submitButton-textTransform":"uppercase","--beam-RedeemTransaction-submitButton-color":"#fff","--beam-RedeemTransaction-submitButton-backgroundColor":"#000000","--beam-RedeemTransaction-submitButton-borderRadius":"0px","--beam-RedeemTransaction-submitButton-borderColor":"#000000","--beam-RedeemTransaction-submitButton-padding":"16px 0px","--beam-RedeemTransaction-submitButton-width":"100%","--beam-RedeemTransaction-submitButton-marginTop":"10px","--beam-RedeemTransaction-submitButton-marginBottom":"10px","--beam-RedeemTransaction-submitButtonContainer-display":"flex","--beam-RedeemTransaction-submitButtonContainer-backgroundColor":"#fff","--beam-RedeemTransaction-submitButton-hover-backgroundColor":"#000000","--beam-RedeemTransaction-submitButton-hover-borderColor":"#000000","--beam-RedeemTransaction-submitButton-hover-color":"#fff","--beam-RedeemTransaction-submitButton-disabled-borderColor":"#767676","--beam-RedeemTransaction-submitButton-disabled-backgroundColor":"#767676","--beam-RedeemTransaction-submitButton-disabled-color":"#fff","--beam-RedeemTransaction-radioButton-color":"transparent","--beam-RedeemTransaction-radioButton-borderColor":"#707070","--beam-RedeemTransaction-radioButton-backgroundColor":"#fff","--beam-RedeemTransaction-radioButton-hover-color":"#fff","--beam-RedeemTransaction-radioButton-hover-backgroundColor":"#000","--beam-RedeemTransaction-radioButton-hover-borderColor":"#000","--beam-RedeemTransaction-radioButton-selected-borderColor":"#000","--beam-RedeemTransaction-radioButton-selected-backgroundColor":"#000","--beam-RedeemTransaction-radioButton-selected-color":"#fff","--beam-RedeemTransaction-options-minWidth":"0px","--beam-RedeemTransaction-options-columnCount":"1","--beam-RedeemTransaction-options-borderWidth":"1px","--beam-RedeemTransaction-options-image-borderRadius":"8px","--beam-RedeemTransaction-options-image-height":"70px","--beam-RedeemTransaction-options-image-height-mobile":"75px","--beam-RedeemTransaction-options-borderColor":"#d9d9d9","--beam-RedeemTransaction-options-backgroundColor":"transparent","--beam-RedeemTransaction-options-marginTop":"15px","--beam-RedeemTransaction-options-hover-backgroundColor":"#f1f1f1","--beam-RedeemTransaction-options-hover-borderWidth":".5px","--beam-RedeemTransaction-options-hover-borderColor":"#000000","--beam-RedeemTransaction-options-selected-borderColor":"#000000","--beam-RedeemTransaction-options-selected-borderWidth":".5px","--beam-RedeemTransaction-options-selected-backgroundColor":"#eee",...h("--beam-RedeemTransaction-options-details",{fontSize:"0.85em",marginTop:"0px",lineHeight:"normal",letterSpacing:"-0.45px"}),...h("--beam-RedeemTransaction-options-details-cause",{fontSize:"1em",fontWeight:"bold"}),"--beam-RedeemTransaction-options-details-nonprofitName-fontWeight":"normal","--beam-RedeemTransaction-options-details-nonprofitName-fontStyle":"inherit","--beam-RedeemTransaction-options-details-fundingProgress-marginTop":"3px",...h("--beam-RedeemTransaction-options-details-fundingProgressLabel",{fontSize:"0.85em",textTransform:"capitalize"}),"--beam-RedeemTransaction-cardStyle":"'image'","--beam-RedeemTransaction-options-icon-padding":"0px","--beam-RedeemTransaction-options-icon-backgroundColor":"#F3F3F3","--beam-RedeemTransaction-options-collapseNonprofits-mobile":"false","--beam-RedeemTransaction-options-collapseNonprofits-desktop":"false","--beam-RedeemTransaction-image-width":"13%","--beam-RedeemTransaction-image-height":"50%","--beam-RedeemTransaction-image-width-mobile":"16%",...U},o=this.nonprofitListDataController?.data?.config?.web?.theme||{},a={...e,...o};return Object.assign(Object.create({toCSS(){return N(this)}}),a)}handleChooseClick(){this.didUserExpandNonprofits=!0}get shouldCollapse(){const e=this.cssVariables["--beam-RedeemTransaction-options-collapseNonprofits-mobile"],o=this.cssVariables["--beam-RedeemTransaction-options-collapseNonprofits-desktop"],a=e?.toLowerCase()==="true",n=o?.toLowerCase()==="true";return this.isMobile&&a||!this.isMobile&&n}renderSubmitButton(e){return i`
10
+ `,b={en:{beamAttribution:()=>"Powered by Beam",ctaTitle:()=>"Choose your impact",ctaPromoPrefixMessage:()=>"At no extra cost,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`select a nonprofit and ${t}% will be donated there for you.`,ctaMessage:({donationPercentage:t="1"}={})=>`At no extra cost, select a nonprofit and ${t}% will be donated there for you.`,submitButtonText:()=>"Confirm",submitButtonTextCompleted:()=>"Confirmed!",chooseButtonText:()=>"Choose a nonprofit"},fr:{beamAttribution:()=>"Optimis\xE9 par Beam",ctaTitle:()=>"Choisissez votre cause",ctaPromoPrefixMessage:()=>"Sans frais suppl\xE9mentaires,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`s\xE9lectionnez une association et ${t} % sera revers\xE9 en votre nom.`,ctaMessage:({donationPercentage:t="1"}={})=>`Sans frais suppl\xE9mentaires, choisissez une association et ${t} % de votre commande lui sera revers\xE9 en votre nom.`,submitButtonText:()=>"Confirmer",submitButtonTextCompleted:()=>"Confirm\xE9 !",chooseButtonText:()=>"Choisir une association"},de:{beamAttribution:()=>"Unterst\xFCtzt von Beam",ctaTitle:()=>"W\xE4hle deine Wirkung",ctaPromoPrefixMessage:()=>"Ohne zus\xE4tzliche Kosten,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`w\xE4hle eine gemeinn\xFCtzige Organisation und ${t}% werden in deinem Namen gespendet.`,ctaMessage:({donationPercentage:t="1"}={})=>`Ohne zus\xE4tzliche Kosten kannst du eine Organisation ausw\xE4hlen, und ${t}% deiner Bestellung werden gespendet.`,submitButtonText:()=>"Best\xE4tigen",submitButtonTextCompleted:()=>"Best\xE4tigt!",chooseButtonText:()=>"W\xE4hle eine Organisation"},es:{beamAttribution:()=>"Ofrecido por Beam",ctaTitle:()=>"Elige tu impacto",ctaPromoPrefixMessage:()=>"Sin coste adicional,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`elige una organizaci\xF3n y donaremos el ${t}% en tu nombre.`,ctaMessage:({donationPercentage:t="1"}={})=>`Sin coste adicional, elige una organizaci\xF3n sin \xE1nimo de lucro y donaremos el ${t}% de tu compra en tu nombre.`,submitButtonText:()=>"Confirmar",submitButtonTextCompleted:()=>"\xA1Confirmado!",chooseButtonText:()=>"Elige una organizaci\xF3n"},it:{beamAttribution:()=>"Promosso da Beam",ctaTitle:()=>"Scegli il tuo impatto",ctaPromoPrefixMessage:()=>"Senza costi aggiuntivi,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`scegli un'organizzazione e doneremo l\u2019${t}% per te.`,ctaMessage:({donationPercentage:t="1"}={})=>`Senza costi aggiuntivi, scegli un'organizzazione no profit e doneremo l\u2019${t}% del tuo acquisto a suo favore.`,submitButtonText:()=>"Conferma",submitButtonTextCompleted:()=>"Confermato!",chooseButtonText:()=>"Scegli un'organizzazione"},pl:{beamAttribution:()=>"Obs\u0142ugiwane przez Beam",ctaTitle:()=>"Wybierz sw\xF3j wp\u0142yw",ctaPromoPrefixMessage:()=>"Bez dodatkowych koszt\xF3w,",ctaPromoMessage:({donationPercentage:t="1"}={})=>`wybierz organizacj\u0119, a ${t}% zostanie przekazane w Twoim imieniu.`,ctaMessage:({donationPercentage:t="1"}={})=>`Bez dodatkowych koszt\xF3w mo\u017Cesz wybra\u0107 organizacj\u0119, kt\xF3rej przeka\u017Cemy ${t}% warto\u015Bci Twojego zam\xF3wienia w Twoim imieniu.`,submitButtonText:()=>"Potwierd\u017A",submitButtonTextCompleted:()=>"Potwierdzono!",chooseButtonText:()=>"Wybierz organizacj\u0119"},ja:{beamAttribution:()=>"Powered by Beam",ctaTitle:()=>"\u5BC4\u4ED8\u5148\u3092\u304A\u9078\u3073\u304F\u3060\u3055\u3044\u3002",ctaPromoPrefixMessage:()=>"\u8FFD\u52A0\u8CBB\u7528\u306A\u3057\u3067\u3001",ctaPromoMessage:({donationPercentage:t="1"}={})=>`\u975E\u55B6\u5229\u56E3\u4F53\u3092\u9078\u3076\u3068\u3001${t}%\u304C\u305D\u306E\u56E3\u4F53\u306B\u5BC4\u4ED8\u3055\u308C\u307E\u3059\u3002`,ctaMessage:({donationPercentage:t="1"}={})=>`\u8FFD\u52A0\u8CBB\u7528\u306A\u3057\u3067\u975E\u55B6\u5229\u56E3\u4F53\u3092\u304A\u9078\u3073\u3044\u305F\u3060\u304F\u3068\u3001\u3054\u8CFC\u5165\u91D1\u984D\u306E${t}%\u304C\u5BC4\u4ED8\u3055\u308C\u307E\u3059\u3002`,submitButtonText:()=>"\u78BA\u8A8D\u3059\u308B",submitButtonTextCompleted:()=>"\u78BA\u8A8D\u6E08\u307F",chooseButtonText:()=>"\u975E\u55B6\u5229\u56E3\u4F53\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044"}};var Z=Object.defineProperty,d=(t,e,o,a)=>{for(var n=void 0,u=t.length-1,l;u>=0;u--)(l=t[u])&&(n=l(e,o,n)||n);return n&&Z(e,o,n),n};class r extends D{constructor(){super(...arguments),this.baseUrl=L,this.lang="en",this.debug=!1,this.draftConfig=!1,this.isMobile=window.innerWidth<768,this.didUserExpandNonprofits=!1,this.shouldUsePromoUI=!1,this.getChainNonprofits=async()=>{if(!this.hasCorrectTransactionConfig)throw new V;const e=await M({baseUrl:this.baseUrl,headers:{authorization:`Api-Key ${this.apiKey}`},requestBody:{storeId:this.storeId,postalCode:this.postalCode,countryCode:this.countryCode,transactionId:String(this.transactionId),cart:this.cart??void 0,widgetName:y.redeem_transaction,options:{config:{draftConfig:this.draftConfig}},version:"2.0.0",lang:this.configLang}});return e.store?.id&&e.store.id!==this.storeId&&(this.storeId=e.store.id),this.localStorage.setItemJson("chainNonprofits",{createdAt:new Date,data:e}),e},this.updateNonprofitIdForRecord=async({selectedNonprofitId:e})=>this.transactionId?this.putTransaction({selectedNonprofitId:e}):null,this.putTransaction=async({selectedNonprofitId:e})=>(w(["apiKey","transactionId"],this),X({baseUrl:this.baseUrl,apiRoot:"/api",headers:{authorization:`Api-Key ${this.apiKey}`},pathParams:{transactionId:this.transactionId},requestBody:{nonprofitId:e}})),this.nonprofitListDataController=new B(this,this.getChainNonprofits),this.selectionDataController=new B(this,this.updateNonprofitIdForRecord),this.localStorage=q(this),this.makeHandleSelect=(e,o,a)=>async n=>{if(!this.allowChange)return;const u=this.selectedNonprofitId;if(n instanceof KeyboardEvent){let l=null;switch(n.key){case"ArrowUp":case"ArrowLeft":o===0?l=a[a.length-1]:l=a[o-1],n.preventDefault();break;case"ArrowRight":case"ArrowDown":o===a.length-1?l=a[0]:l=a[o+1],n.preventDefault();break;case"Enter":case" ":n.preventDefault();break;default:return}if(l){const p=this.renderRoot.querySelector(`[data-value="${l.nonprofit.id}"]`);p!==null&&(p.tabIndex=0,p.focus());return}}if(n.currentTarget instanceof HTMLElement){if(u===e)return;this.selectedNonprofitId=e}},this.handleSubmit=async()=>{const{selectedNonprofitId:e}=this;if(!this.allowSubmit||e==null)return;await this.selectionDataController.exec({selectedNonprofitId:e}),this.localStorage.setItem("nonprofit",e),this.localStorage.setItem("nonprofit_selected_at",new Date().toISOString());const o=this.nonprofitListDataController?.data?.nonprofits.find(a=>a.nonprofit.id===e);this.dispatchEvent(new J({selectedNonprofitId:e,nonprofitName:o?.nonprofit.name,source:y.redeem_transaction,timestamp:new Date}))},this.evaluateBreakPoints=I(()=>{this.isMobile=window.innerWidth<768},50,{maxWait:50,leading:!0})}get configLang(){return A[this.lang]||"en"}get hasCorrectTransactionConfig(){return _(["apiKey","transactionId"],this)}connectedCallback(){super.connectedCallback(),window.addEventListener("resize",this.evaluateBreakPoints)}async firstUpdated(e){await this.restoreStateFromCache()}async updated(e){const o=["baseUrl","storeId","apiKey","countryCode","postalCode","lang"];for(const a of o)if(e.has(a)){await this.nonprofitListDataController.exec();break}}disconnectedCallback(){super.disconnectedCallback()}restoreStateFromCache(){w(["apiKey"],this),this.selectedNonprofitId=parseInt(this.localStorage.getItem("nonprofit")||"")||void 0;try{const{createdAt:e=0,data:o}=this.localStorage.getItemJson("chainNonprofits")||{},a=2*60*60*1e3;new Date(e).valueOf()+a>new Date().valueOf()&&(this.nonprofitListDataController.data=o,this.nonprofitListDataController.loading=!1)}catch{}}get allowChange(){return this.selectionDataController.data==null&&!this.selectionDataController.loading}get allowSubmit(){return!!(this.selectedNonprofitId&&this.allowChange)}get cssVariables(){const e={"--beam-fontFamily":"inherit","--beam-fontStyle":"inherit","--beam-fontSize":"inherit","--beam-textColor":"inherit","--beam-backgroundColor":"inherit",...h("--beam-RedeemTransaction-title",{fontSize:"1.25em",fontWeight:"bold"}),...h("--beam-RedeemTransaction-description",{marginTop:"0.5em",lineHeight:"normal"}),...W,...F,"--beam-RedeemTransaction-maxWidth":"1000px","--beam-RedeemTransaction-submitButton-fontSize":"14px","--beam-RedeemTransaction-submitButton-fontWeight":"inherit","--beam-RedeemTransaction-submitButton-fontFamily":"inherit","--beam-RedeemTransaction-submitButton-textTransform":"uppercase","--beam-RedeemTransaction-submitButton-color":"#fff","--beam-RedeemTransaction-submitButton-backgroundColor":"#000000","--beam-RedeemTransaction-submitButton-borderRadius":"0px","--beam-RedeemTransaction-submitButton-borderColor":"#000000","--beam-RedeemTransaction-submitButton-padding":"16px 0px","--beam-RedeemTransaction-submitButton-width":"100%","--beam-RedeemTransaction-submitButton-marginTop":"10px","--beam-RedeemTransaction-submitButton-marginBottom":"10px","--beam-RedeemTransaction-submitButtonContainer-display":"flex","--beam-RedeemTransaction-submitButtonContainer-backgroundColor":"#fff","--beam-RedeemTransaction-submitButton-hover-backgroundColor":"#000000","--beam-RedeemTransaction-submitButton-hover-borderColor":"#000000","--beam-RedeemTransaction-submitButton-hover-color":"#fff","--beam-RedeemTransaction-submitButton-disabled-borderColor":"#767676","--beam-RedeemTransaction-submitButton-disabled-backgroundColor":"#767676","--beam-RedeemTransaction-submitButton-disabled-color":"#fff","--beam-RedeemTransaction-radioButton-color":"transparent","--beam-RedeemTransaction-radioButton-borderColor":"#707070","--beam-RedeemTransaction-radioButton-backgroundColor":"#fff","--beam-RedeemTransaction-radioButton-hover-color":"#fff","--beam-RedeemTransaction-radioButton-hover-backgroundColor":"#000","--beam-RedeemTransaction-radioButton-hover-borderColor":"#000","--beam-RedeemTransaction-radioButton-selected-borderColor":"#000","--beam-RedeemTransaction-radioButton-selected-backgroundColor":"#000","--beam-RedeemTransaction-radioButton-selected-color":"#fff","--beam-RedeemTransaction-options-minWidth":"0px","--beam-RedeemTransaction-options-columnCount":"1","--beam-RedeemTransaction-options-borderWidth":"1px","--beam-RedeemTransaction-options-image-borderRadius":"8px","--beam-RedeemTransaction-options-image-height":"70px","--beam-RedeemTransaction-options-image-height-mobile":"75px","--beam-RedeemTransaction-options-borderColor":"#d9d9d9","--beam-RedeemTransaction-options-backgroundColor":"transparent","--beam-RedeemTransaction-options-marginTop":"15px","--beam-RedeemTransaction-options-hover-backgroundColor":"#f1f1f1","--beam-RedeemTransaction-options-hover-borderWidth":".5px","--beam-RedeemTransaction-options-hover-borderColor":"#000000","--beam-RedeemTransaction-options-selected-borderColor":"#000000","--beam-RedeemTransaction-options-selected-borderWidth":".5px","--beam-RedeemTransaction-options-selected-backgroundColor":"#eee",...h("--beam-RedeemTransaction-options-details",{fontSize:"0.85em",marginTop:"0px",lineHeight:"normal",letterSpacing:"-0.45px"}),...h("--beam-RedeemTransaction-options-details-cause",{fontSize:"1em",fontWeight:"bold"}),"--beam-RedeemTransaction-options-details-nonprofitName-fontWeight":"normal","--beam-RedeemTransaction-options-details-nonprofitName-fontStyle":"inherit","--beam-RedeemTransaction-options-details-fundingProgress-marginTop":"3px",...h("--beam-RedeemTransaction-options-details-fundingProgressLabel",{fontSize:"0.85em",textTransform:"capitalize"}),"--beam-RedeemTransaction-cardStyle":"'image'","--beam-RedeemTransaction-options-icon-padding":"0px","--beam-RedeemTransaction-options-icon-backgroundColor":"#F3F3F3","--beam-RedeemTransaction-options-collapseNonprofits-mobile":"false","--beam-RedeemTransaction-options-collapseNonprofits-desktop":"false","--beam-RedeemTransaction-image-width":"13%","--beam-RedeemTransaction-image-height":"50%","--beam-RedeemTransaction-image-width-mobile":"16%",...U},o=this.nonprofitListDataController?.data?.config?.web?.theme||{},a={...e,...o};return Object.assign(Object.create({toCSS(){return N(this)}}),a)}handleChooseClick(){this.didUserExpandNonprofits=!0}get shouldCollapse(){const e=this.cssVariables["--beam-RedeemTransaction-options-collapseNonprofits-mobile"],o=this.cssVariables["--beam-RedeemTransaction-options-collapseNonprofits-desktop"],a=e?.toLowerCase()==="true",n=o?.toLowerCase()==="true";return this.isMobile&&a||!this.isMobile&&n}renderSubmitButton(e){return i`
11
11
  ${this.didUserExpandNonprofits||!this.shouldCollapse?i` <button
12
12
  type="button"
13
13
  ?aria-disabled=${!this.allowSubmit}
@@ -386,4 +386,4 @@ import{m as $,y as i,f as P,g as c,t as v,h as D,q as C,k as z,u as E}from"./lit
386
386
  align-items: center;
387
387
  }
388
388
  `,G({gap:"0px",itemMinWidth:"var(--beam-RedeemTransaction-options-minWidth, 0px)",columnCount:"var(--beam-RedeemTransaction-options-columnCount, 1)"})],d([c({type:String})],r.prototype,"baseUrl"),d([c({type:String})],r.prototype,"apiKey"),d([c({type:Number})],r.prototype,"transactionId"),d([c({type:Number})],r.prototype,"storeId"),d([c({type:String})],r.prototype,"countryCode"),d([c({type:String})],r.prototype,"postalCode"),d([c({type:Object})],r.prototype,"cart"),d([c({type:Number,reflect:!0})],r.prototype,"selectedNonprofitId"),d([c({type:String})],r.prototype,"lang"),d([c({type:Boolean})],r.prototype,"debug"),d([c({type:Boolean})],r.prototype,"draftConfig"),d([v()],r.prototype,"isMobile"),d([v()],r.prototype,"didUserExpandNonprofits"),d([v()],r.prototype,"shouldUsePromoUI"),j(r);export{r as B,Q as p};
389
- //# sourceMappingURL=index-IAa5EO-6.esm.js.map
389
+ //# sourceMappingURL=index-DvhxjeiK.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DvhxjeiK.esm.js","sources":["../../src/api-sdk/v4/routes.ts","../../src/shared/fragments/radioButton.ts","../../src/components/redeem-transaction/strings.ts","../../src/components/redeem-transaction/index.ts"],"sourcesContent":["import { makeOpenApiMethod } from \"../make-openapi-method\";\n\nexport const postTransaction = makeOpenApiMethod(\"/v4/transaction\", \"post\", 201);\n\nexport const putTransaction = makeOpenApiMethod(\"/v4/transaction/redeem/{transactionId}\", \"put\", 200);\n","import { html } from \"lit\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nexport const _radioButton = ({ height = \"1em\", width = \"1em\" } = {}) =>\n html`\n <svg\n style=\"${styleMap({ height, width, position: \"relative\", bottom: \"0\" })}\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n >\n <!-- Filled Circle -->\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"currentColor\" />\n </svg>\n `;\n","export const strings = {\n en: {\n beamAttribution: () => `Powered by Beam`,\n ctaTitle: () => `Choose your impact`,\n ctaPromoPrefixMessage: () => `At no extra cost,`,\n ctaPromoMessage: ({ donationPercentage = \"1\" } = {}) =>\n `select a nonprofit and ${donationPercentage}% will be donated there for you.`,\n ctaMessage: ({ donationPercentage = \"1\" } = {}) =>\n `At no extra cost, select a nonprofit and ${donationPercentage}% will be donated there for you.`,\n submitButtonText: () => `Confirm`,\n submitButtonTextCompleted: () => `Confirmed!`,\n chooseButtonText: () => `Choose a nonprofit`,\n },\n fr: {\n beamAttribution: () => `Optimisé par Beam`,\n ctaTitle: () => `Choisissez votre cause`,\n ctaPromoPrefixMessage: () => `Sans frais supplémentaires,`,\n ctaPromoMessage: ({ donationPercentage = \"1\" } = {}) =>\n `sélectionnez une association et ${donationPercentage} % sera reversé en votre nom.`,\n ctaMessage: ({ donationPercentage = \"1\" } = {}) =>\n `Sans frais supplémentaires, choisissez une association et ${donationPercentage} % de votre commande lui sera reversé en votre nom.`,\n submitButtonText: () => `Confirmer`,\n submitButtonTextCompleted: () => `Confirmé !`,\n chooseButtonText: () => `Choisir une association`,\n },\n de: {\n beamAttribution: () => `Unterstützt von Beam`,\n ctaTitle: () => `Wähle deine Wirkung`,\n ctaPromoPrefixMessage: () => `Ohne zusätzliche Kosten,`,\n ctaPromoMessage: ({ donationPercentage = \"1\" } = {}) =>\n `wähle eine gemeinnützige Organisation und ${donationPercentage}% werden in deinem Namen gespendet.`,\n ctaMessage: ({ donationPercentage = \"1\" } = {}) =>\n `Ohne zusätzliche Kosten kannst du eine Organisation auswählen, und ${donationPercentage}% deiner Bestellung werden gespendet.`,\n submitButtonText: () => `Bestätigen`,\n submitButtonTextCompleted: () => `Bestätigt!`,\n chooseButtonText: () => `Wähle eine Organisation`,\n },\n es: {\n beamAttribution: () => `Ofrecido por Beam`,\n ctaTitle: () => `Elige tu impacto`,\n ctaPromoPrefixMessage: () => `Sin coste adicional,`,\n ctaPromoMessage: ({ donationPercentage = \"1\" } = {}) =>\n `elige una organización y donaremos el ${donationPercentage}% en tu nombre.`,\n ctaMessage: ({ donationPercentage = \"1\" } = {}) =>\n `Sin coste adicional, elige una organización sin ánimo de lucro y donaremos el ${donationPercentage}% de tu compra en tu nombre.`,\n submitButtonText: () => `Confirmar`,\n submitButtonTextCompleted: () => `¡Confirmado!`,\n chooseButtonText: () => `Elige una organización`,\n },\n it: {\n beamAttribution: () => `Promosso da Beam`,\n ctaTitle: () => `Scegli il tuo impatto`,\n ctaPromoPrefixMessage: () => `Senza costi aggiuntivi,`,\n ctaPromoMessage: ({ donationPercentage = \"1\" } = {}) =>\n `scegli un'organizzazione e doneremo l’${donationPercentage}% per te.`,\n ctaMessage: ({ donationPercentage = \"1\" } = {}) =>\n `Senza costi aggiuntivi, scegli un'organizzazione no profit e doneremo l’${donationPercentage}% del tuo acquisto a suo favore.`,\n submitButtonText: () => `Conferma`,\n submitButtonTextCompleted: () => `Confermato!`,\n chooseButtonText: () => `Scegli un'organizzazione`,\n },\n pl: {\n beamAttribution: () => `Obsługiwane przez Beam`,\n ctaTitle: () => `Wybierz swój wpływ`,\n ctaPromoPrefixMessage: () => `Bez dodatkowych kosztów,`,\n ctaPromoMessage: ({ donationPercentage = \"1\" } = {}) =>\n `wybierz organizację, a ${donationPercentage}% zostanie przekazane w Twoim imieniu.`,\n ctaMessage: ({ donationPercentage = \"1\" } = {}) =>\n `Bez dodatkowych kosztów możesz wybrać organizację, której przekażemy ${donationPercentage}% wartości Twojego zamówienia w Twoim imieniu.`,\n submitButtonText: () => `Potwierdź`,\n submitButtonTextCompleted: () => `Potwierdzono!`,\n chooseButtonText: () => `Wybierz organizację`,\n },\n ja: {\n beamAttribution: () => `Powered by Beam`,\n ctaTitle: () => `寄付先をお選びください。`,\n ctaPromoPrefixMessage: () => `追加費用なしで、`,\n ctaPromoMessage: ({ donationPercentage = \"1\" } = {}) =>\n `非営利団体を選ぶと、${donationPercentage}%がその団体に寄付されます。`,\n ctaMessage: ({ donationPercentage = \"1\" } = {}) =>\n `追加費用なしで非営利団体をお選びいただくと、ご購入金額の${donationPercentage}%が寄付されます。`,\n submitButtonText: () => `確認する`,\n submitButtonTextCompleted: () => `確認済み`,\n chooseButtonText: () => `非営利団体を選択してください`,\n },\n};\n","import { css, html, LitElement, PropertyValues } from \"lit\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { property } from \"lit/decorators/property.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { state } from \"lit/decorators/state.js\";\nimport debounce from \"lodash-es/debounce\";\nimport { AsyncController } from \"../../shared/controllers/async-controller\";\nimport { DEFAULT_BASE_URL, SUPPORTED_LANGUAGES, WIDGET_NAMES } from \"../../api-sdk/constants\";\nimport \"../../shared/components/progress-bar\";\nimport \"../../shared/components/promo-pill-label\";\nimport \"../beam-partner-logos\";\nimport { defineCustomElement } from \"../../shared/defineCustomElement\";\nimport { _loading } from \"../../shared/fragments/loading-template\";\nimport { _errorMessage } from \"../../shared/fragments/error-message-template\";\nimport { defineCustomText, useCustomText } from \"../../shared/fragments/custom-text\";\nimport { cssReset } from \"../../shared/css-reset\";\nimport { _cssVariableMap } from \"../../shared/fragments/css-variable-map\";\nimport { enforceConfig, areRequiredKeysDefined } from \"../../shared/enforce-config\";\nimport { BeamError, MissingConfig } from \"../../utils/beam-errors\";\nimport { TId, TNumericId } from \"../../shared/types\";\nimport { TCart } from \"../../shared/cart-contents\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { cssCardGrid } from \"../../shared/fragments/css-card-grid\";\nimport { postChainEligibleNonprofitsForCart } from \"../../api-sdk/v3/routes\";\nimport { putTransaction } from \"../../api-sdk/v4/routes\";\nimport { LANGUAGES } from \"../../api-sdk/types\";\nimport { BeamNonprofitSelectEvent } from \"../../utils/events\";\nimport { localizeUserString } from \"../../shared/localize\";\nimport { progressBarConfigDefaults } from \"../../shared/components/progress-bar\";\nimport { partnerLogosConfigDefaults } from \"../beam-partner-logos\";\nimport { promoPillLabelConfigDefaults } from \"../../shared/components/promo-pill-label\";\nimport { _radioButton } from \"../../shared/fragments/radioButton\";\nimport { strings } from \"./strings\";\n\ninterface TRequiredConfig {\n apiKey: string;\n transactionId: TId;\n}\n\ntype TIAPIV3GetChainNonprofits = Awaited<ReturnType<typeof import(\"../../api-sdk/v3/routes\").getChainNonprofits>>;\ntype TIAPIV3EligibleNonprofits = Awaited<\n ReturnType<typeof import(\"../../api-sdk/v3/routes\").getChainNonprofits>\n>[\"nonprofits\"];\ntype TIAPIV3Nonprofit = TIAPIV3EligibleNonprofits[number];\nexport class BeamRedeemTransaction extends LitElement {\n static tagName = \"beam-redeem-transaction\";\n\n @property({ type: String }) public baseUrl: string = DEFAULT_BASE_URL;\n\n @property({ type: String }) public apiKey?: TRequiredConfig[\"apiKey\"];\n\n @property({ type: Number }) public transactionId?: TRequiredConfig[\"transactionId\"];\n\n @property({ type: Number }) public storeId?: TNumericId;\n\n @property({ type: String }) public countryCode?: string;\n\n @property({ type: String }) public postalCode?: string;\n\n @property({ type: Object }) public cart?: TCart;\n\n @property({ type: Number, reflect: true })\n public selectedNonprofitId?: TNumericId;\n\n @property({ type: String }) public lang: LANGUAGES = \"en\";\n\n @property({ type: Boolean }) public debug = false;\n\n @property({ type: Boolean }) public draftConfig = false;\n\n @state() private isMobile = window.innerWidth < 768;\n\n @state() private didUserExpandNonprofits = false;\n\n @state() private shouldUsePromoUI = false;\n\n get configLang() {\n return SUPPORTED_LANGUAGES[this.lang] || \"en\";\n }\n\n private get hasCorrectTransactionConfig(): boolean {\n const requiredKeys: (keyof TRequiredConfig)[] = [\"apiKey\", \"transactionId\"];\n const isTransactionConfigCorrect = areRequiredKeysDefined(requiredKeys, this);\n return isTransactionConfigCorrect;\n }\n\n private getChainNonprofits = async () => {\n if (!this.hasCorrectTransactionConfig) {\n throw new MissingConfig();\n }\n\n const res = await postChainEligibleNonprofitsForCart({\n baseUrl: this.baseUrl,\n headers: { authorization: `Api-Key ${this.apiKey}` },\n requestBody: {\n storeId: this.storeId,\n postalCode: this.postalCode,\n countryCode: this.countryCode,\n transactionId: String(this.transactionId),\n cart: this.cart ?? undefined,\n widgetName: WIDGET_NAMES.redeem_transaction,\n options: {\n config: {\n draftConfig: this.draftConfig,\n },\n },\n version: \"2.0.0\",\n lang: this.configLang,\n },\n });\n\n // If store ID was not provided, get the store ID from response here\n if (res.store?.id && res.store.id !== this.storeId) {\n this.storeId = res.store.id;\n }\n\n this.localStorage.setItemJson(\"chainNonprofits\", {\n createdAt: new Date(),\n data: res,\n });\n\n return res;\n };\n\n private updateNonprofitIdForRecord = async ({ selectedNonprofitId }: { selectedNonprofitId: TNumericId }) => {\n if (this.transactionId) {\n return this.putTransaction({ selectedNonprofitId });\n }\n return null;\n };\n private putTransaction = async ({ selectedNonprofitId }: { selectedNonprofitId: TNumericId }) => {\n if (!enforceConfig<TRequiredConfig>([\"apiKey\", \"transactionId\"], this)) {\n throw new MissingConfig();\n }\n return putTransaction({\n baseUrl: this.baseUrl,\n apiRoot: \"/api\",\n headers: {\n authorization: `Api-Key ${this.apiKey}`,\n },\n pathParams: {\n transactionId: this.transactionId,\n },\n requestBody: {\n nonprofitId: selectedNonprofitId,\n },\n });\n };\n\n private nonprofitListDataController = new AsyncController<typeof this.getChainNonprofits>(\n this,\n this.getChainNonprofits\n );\n\n private selectionDataController = new AsyncController<typeof this.updateNonprofitIdForRecord>(\n this,\n this.updateNonprofitIdForRecord\n );\n\n private localStorage = createScopedLocalStorage(this as LitElement & TRequiredConfig);\n\n connectedCallback() {\n super.connectedCallback();\n window.addEventListener(\"resize\", this.evaluateBreakPoints);\n }\n\n async firstUpdated(_changedProperties: PropertyValues) {\n await this.restoreStateFromCache();\n }\n\n async updated(previousPropertyValues: PropertyValues) {\n // Reload nonprofit list on change of any of these props:\n // Also fires on first load as props go from undefined => value\n const requireNewDataProps = [\"baseUrl\", \"storeId\", \"apiKey\", \"countryCode\", \"postalCode\", \"lang\"];\n for (const prop of requireNewDataProps) {\n if (previousPropertyValues.has(prop)) {\n await this.nonprofitListDataController.exec();\n break;\n }\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n }\n\n private restoreStateFromCache() {\n if (!enforceConfig<TRequiredConfig>([\"apiKey\"], this)) throw new MissingConfig();\n\n this.selectedNonprofitId = parseInt(this.localStorage.getItem(\"nonprofit\") || \"\") || undefined;\n try {\n // try to restore nonprofit list if we have data and it's not too old\n // list will continue to refresh async and replace this data when ready\n const { createdAt = 0, data } =\n this.localStorage.getItemJson<{ createdAt: string; data: any }>(\"chainNonprofits\") || {};\n const cacheTtl = 2 * 60 * 60 * 1000;\n if (new Date(createdAt).valueOf() + cacheTtl > new Date().valueOf()) {\n this.nonprofitListDataController.data = data;\n this.nonprofitListDataController.loading = false;\n }\n } catch (err) {\n // ignore cache retrieval error and continue to fetch data\n }\n }\n\n /**\n * Factory for selection event handler\n *\n * Nonprofit selector implements radio-button semantics:\n * * If nothing is selected, tabbing into selector selects first card\n * * Arrow keys changes focus between cards, but doesn't select\n * * Enter/Space sets selection\n * * If a nonprofit is selected, arrow keys change focus AND selection\n * * Click sets selection\n * @param {number} id\n * @param {number} index\n * @param {{id: number}[]} nonprofits\n * @returns {(evt: Event) => void}\n */\n private makeHandleSelect =\n (id: number, index: number, nonprofits: { nonprofit: { id: number } }[]): ((event: Event) => void) =>\n async (event: Event) => {\n if (!this.allowChange) return;\n const currentId = this.selectedNonprofitId;\n if (event instanceof KeyboardEvent) {\n let nextFocus = null;\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowLeft\":\n if (index === 0) {\n nextFocus = nonprofits[nonprofits.length - 1];\n } else {\n nextFocus = nonprofits[index - 1];\n }\n event.preventDefault();\n break;\n case \"ArrowRight\":\n case \"ArrowDown\":\n if (index === nonprofits.length - 1) {\n nextFocus = nonprofits[0];\n } else {\n nextFocus = nonprofits[index + 1];\n }\n event.preventDefault();\n break;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n break; // continue to toggle-selection block below\n default:\n return;\n }\n if (nextFocus) {\n const focusTarget = this.renderRoot.querySelector(`[data-value=\"${nextFocus.nonprofit.id}\"]`) as HTMLElement;\n if (focusTarget !== null) {\n focusTarget.tabIndex = 0;\n focusTarget.focus();\n }\n return;\n }\n }\n // Handle selection with click or Enter/Space key\n const targetEl = event.currentTarget;\n if (targetEl instanceof HTMLElement) {\n if (currentId === id) {\n // this[\"selected-nonprofit-id\"] = undefined; // unset (not supported)\n return; // no API call or localStorage change needed\n } else {\n this.selectedNonprofitId = id;\n }\n }\n };\n\n get allowChange() {\n // Disallow change if already submitted\n return this.selectionDataController.data == null && !this.selectionDataController.loading;\n }\n\n get allowSubmit() {\n // Disabled if no nonprofit has been selected yet or if submission was already received\n return Boolean(this.selectedNonprofitId && this.allowChange);\n }\n\n handleSubmit = async () => {\n const { selectedNonprofitId } = this;\n if (!this.allowSubmit || selectedNonprofitId == null) return;\n await this.selectionDataController.exec({ selectedNonprofitId });\n\n this.localStorage.setItem(\"nonprofit\", selectedNonprofitId);\n this.localStorage.setItem(\"nonprofit_selected_at\", new Date().toISOString());\n\n const selectedNonprofit = this.nonprofitListDataController?.data?.nonprofits.find(\n (np) => np.nonprofit.id === selectedNonprofitId\n );\n\n this.dispatchEvent(\n new BeamNonprofitSelectEvent({\n selectedNonprofitId,\n nonprofitName: selectedNonprofit?.nonprofit.name,\n source: WIDGET_NAMES.redeem_transaction,\n timestamp: new Date(),\n })\n );\n };\n\n evaluateBreakPoints = debounce(\n () => {\n this.isMobile = window.innerWidth < 768;\n },\n 50,\n { maxWait: 50, leading: true }\n );\n\n public get cssVariables() {\n const defaults = {\n \"--beam-fontFamily\": \"inherit\",\n \"--beam-fontStyle\": \"inherit\",\n \"--beam-fontSize\": \"inherit\",\n \"--beam-textColor\": \"inherit\",\n \"--beam-backgroundColor\": \"inherit\",\n ...defineCustomText(\"--beam-RedeemTransaction-title\", {\n fontSize: \"1.25em\",\n fontWeight: \"bold\",\n }),\n ...defineCustomText(\"--beam-RedeemTransaction-description\", {\n marginTop: \"0.5em\",\n lineHeight: \"normal\",\n }),\n ...partnerLogosConfigDefaults,\n ...progressBarConfigDefaults,\n \"--beam-RedeemTransaction-maxWidth\": \"1000px\",\n \"--beam-RedeemTransaction-submitButton-fontSize\": \"14px\",\n \"--beam-RedeemTransaction-submitButton-fontWeight\": \"inherit\",\n \"--beam-RedeemTransaction-submitButton-fontFamily\": \"inherit\",\n \"--beam-RedeemTransaction-submitButton-textTransform\": \"uppercase\",\n \"--beam-RedeemTransaction-submitButton-color\": \"#fff\",\n \"--beam-RedeemTransaction-submitButton-backgroundColor\": \"#000000\",\n \"--beam-RedeemTransaction-submitButton-borderRadius\": \"0px\",\n \"--beam-RedeemTransaction-submitButton-borderColor\": \"#000000\",\n \"--beam-RedeemTransaction-submitButton-padding\": \"16px 0px\",\n \"--beam-RedeemTransaction-submitButton-width\": \"100%\",\n \"--beam-RedeemTransaction-submitButton-marginTop\": \"10px\",\n \"--beam-RedeemTransaction-submitButton-marginBottom\": \"10px\",\n \"--beam-RedeemTransaction-submitButtonContainer-display\": \"flex\",\n \"--beam-RedeemTransaction-submitButtonContainer-backgroundColor\": \"#fff\",\n \"--beam-RedeemTransaction-submitButton-hover-backgroundColor\": \"#000000\",\n \"--beam-RedeemTransaction-submitButton-hover-borderColor\": \"#000000\",\n \"--beam-RedeemTransaction-submitButton-hover-color\": \"#fff\",\n \"--beam-RedeemTransaction-submitButton-disabled-borderColor\": \"#767676\",\n \"--beam-RedeemTransaction-submitButton-disabled-backgroundColor\": \"#767676\",\n \"--beam-RedeemTransaction-submitButton-disabled-color\": \"#fff\",\n \"--beam-RedeemTransaction-radioButton-color\": \"transparent\",\n \"--beam-RedeemTransaction-radioButton-borderColor\": \"#707070\",\n \"--beam-RedeemTransaction-radioButton-backgroundColor\": \"#fff\",\n \"--beam-RedeemTransaction-radioButton-hover-color\": \"#fff\",\n \"--beam-RedeemTransaction-radioButton-hover-backgroundColor\": \"#000\",\n \"--beam-RedeemTransaction-radioButton-hover-borderColor\": \"#000\",\n \"--beam-RedeemTransaction-radioButton-selected-borderColor\": \"#000\",\n \"--beam-RedeemTransaction-radioButton-selected-backgroundColor\": \"#000\",\n \"--beam-RedeemTransaction-radioButton-selected-color\": \"#fff\",\n \"--beam-RedeemTransaction-options-minWidth\": \"0px\",\n \"--beam-RedeemTransaction-options-columnCount\": \"1\",\n \"--beam-RedeemTransaction-options-borderWidth\": \"1px\",\n \"--beam-RedeemTransaction-options-image-borderRadius\": \"8px\",\n \"--beam-RedeemTransaction-options-image-height\": \"70px\",\n \"--beam-RedeemTransaction-options-image-height-mobile\": \"75px\",\n \"--beam-RedeemTransaction-options-borderColor\": \"#d9d9d9\",\n \"--beam-RedeemTransaction-options-backgroundColor\": \"transparent\",\n \"--beam-RedeemTransaction-options-marginTop\": \"15px\",\n \"--beam-RedeemTransaction-options-hover-backgroundColor\": \"#f1f1f1\",\n \"--beam-RedeemTransaction-options-hover-borderWidth\": \".5px\",\n \"--beam-RedeemTransaction-options-hover-borderColor\": \"#000000\",\n \"--beam-RedeemTransaction-options-selected-borderColor\": \"#000000\",\n \"--beam-RedeemTransaction-options-selected-borderWidth\": \".5px\",\n \"--beam-RedeemTransaction-options-selected-backgroundColor\": \"#eee\",\n ...defineCustomText(\"--beam-RedeemTransaction-options-details\", {\n fontSize: \"0.85em\",\n marginTop: \"0px\",\n lineHeight: \"normal\",\n letterSpacing: \"-0.45px\",\n }),\n ...defineCustomText(\"--beam-RedeemTransaction-options-details-cause\", {\n fontSize: \"1em\",\n fontWeight: \"bold\",\n }),\n \"--beam-RedeemTransaction-options-details-nonprofitName-fontWeight\": \"normal\",\n \"--beam-RedeemTransaction-options-details-nonprofitName-fontStyle\": \"inherit\",\n \"--beam-RedeemTransaction-options-details-fundingProgress-marginTop\": \"3px\", // update after class name addition\n ...defineCustomText(\"--beam-RedeemTransaction-options-details-fundingProgressLabel\", {\n fontSize: \"0.85em\",\n textTransform: \"capitalize\",\n }),\n \"--beam-RedeemTransaction-cardStyle\": \"'image'\", // icon, selected_icon, image\n \"--beam-RedeemTransaction-options-icon-padding\": \"0px\",\n \"--beam-RedeemTransaction-options-icon-backgroundColor\": \"#F3F3F3\",\n \"--beam-RedeemTransaction-options-collapseNonprofits-mobile\": \"false\",\n \"--beam-RedeemTransaction-options-collapseNonprofits-desktop\": \"false\",\n \"--beam-RedeemTransaction-image-width\": \"13%\",\n \"--beam-RedeemTransaction-image-height\": \"50%\",\n \"--beam-RedeemTransaction-image-width-mobile\": \"16%\",\n ...promoPillLabelConfigDefaults,\n };\n\n const remoteConfig = this.nonprofitListDataController?.data?.config?.web?.theme || {};\n\n const config = { ...defaults, ...remoteConfig };\n\n const serializable = Object.create({\n toCSS() {\n return _cssVariableMap(this as Record<string, string>);\n },\n });\n\n return Object.assign(serializable, config);\n }\n\n static styles = [\n cssReset,\n css`\n :host {\n display: block;\n max-width: var(--beam-RedeemTransaction-maxWidth);\n font-family: var(--beam-fontFamily);\n font-style: var(--beam-fontStyle);\n font-size: var(--beam-fontSize);\n background-color: var(--beam-backgroundColor);\n color: var(--beam-textColor);\n word-break: normal;\n }\n\n .headerContainer {\n align-items: flex-start;\n justify-content: space-between;\n display: flex;\n order: 2;\n }\n\n .submitButtonContainer {\n margin-top: var(--beam-RedeemTransaction-submitButton-marginTop);\n margin-bottom: var(--beam-RedeemTransaction-submitButton-marginBottom);\n background-color: var(--beam-RedeemTransaction-submitButtonContainer-backgroundColor);\n display: var(--beam-RedeemTransaction-submitButtonContainer-display);\n }\n\n .submitButton {\n color: var(--beam-RedeemTransaction-submitButton-color);\n background-color: var(--beam-RedeemTransaction-submitButton-backgroundColor);\n border: 1px solid var(--beam-RedeemTransaction-submitButton-borderColor);\n font-size: var(--beam-RedeemTransaction-submitButton-fontSize);\n font-weight: var(--beam-RedeemTransaction-submitButton-fontWeight);\n font-family: var(--beam-RedeemTransaction-submitButton-fontFamily);\n text-transform: var(--beam-RedeemTransaction-submitButton-textTransform);\n border-radius: var(--beam-RedeemTransaction-submitButton-borderRadius);\n padding: var(--beam-RedeemTransaction-submitButton-padding);\n width: var(--beam-RedeemTransaction-submitButton-width);\n transition: background-color 0.2s, border-color 0.2s, color 0.2s;\n cursor: pointer;\n }\n\n .submitButton:not(.isDisabled):focus-visible,\n .submitButton:not(.isDisabled):hover {\n background-color: var(--beam-RedeemTransaction-submitButton-hover-backgroundColor);\n border-color: var(--beam-RedeemTransaction-submitButton-hover-borderColor);\n color: var(--beam-RedeemTransaction-submitButton-hover-color);\n }\n\n .submitButton.isDisabled {\n color: var(--beam-RedeemTransaction-submitButton-disabled-color);\n background-color: var(--beam-RedeemTransaction-submitButton-disabled-backgroundColor);\n border-color: var(--beam-RedeemTransaction-submitButton-disabled-borderColor);\n cursor: not-allowed;\n }\n\n .options {\n margin-top: var(--beam-RedeemTransaction-options-marginTop);\n order: 3;\n flex-grow: 1;\n }\n\n .options.isHidden {\n display: none;\n }\n\n .option {\n border: var(--beam-RedeemTransaction-options-borderWidth) solid\n var(--beam-RedeemTransaction-options-borderColor);\n border-bottom: none;\n background-color: var(--beam-RedeemTransaction-options-backgroundColor);\n cursor: pointer;\n transition: border-color 0.2s, background-color 0.2s, outline 0.2s;\n }\n\n .option:first-child {\n border-radius: 8px 8px 0 0; /* Top corners rounded */\n }\n\n .option:last-child {\n border-bottom: var(--beam-RedeemTransaction-options-borderWidth) solid\n var(--beam-RedeemTransaction-options-borderColor);\n border-radius: 0 0 8px 8px; /* Bottom corners rounded */\n }\n\n .option:not(.isDisabled):not(:last-child):focus-visible,\n .option:not(.isDisabled):not(:last-child):hover,\n .option:not(.isSelected):not(:last-child):focus-visible,\n .option:not(.isSelected):not(:last-child):hover {\n background-color: var(--beam-RedeemTransaction-options-hover-backgroundColor);\n outline: var(--beam-RedeemTransaction-options-hover-borderWidth) solid\n var(--beam-RedeemTransaction-options-hover-borderColor);\n border-bottom: var(--beam-RedeemTransaction-options-hover-borderWidth) solid\n var(--beam-RedeemTransaction-options-hover-borderColor);\n }\n\n .option:not(.isDisabled):focus-visible,\n .option:not(.isDisabled):hover,\n .option:not(.isSelected):focus-visible,\n .option:not(.isSelected):hover {\n background-color: var(--beam-RedeemTransaction-options-hover-backgroundColor);\n outline: var(--beam-RedeemTransaction-options-hover-borderWidth) solid\n var(--beam-RedeemTransaction-options-hover-borderColor);\n }\n\n .option.isDisabled {\n cursor: not-allowed;\n }\n\n .option.isSelected {\n outline: var(--beam-RedeemTransaction-options-selected-borderWidth) solid\n var(--beam-RedeemTransaction-options-selected-borderColor);\n background-color: var(--beam-RedeemTransaction-options-selected-backgroundColor);\n border-bottom: var(--beam-RedeemTransaction-options-selected-borderWidth) solid\n var(--beam-RedeemTransaction-options-selected-borderColor);\n }\n\n .option.isSelected:focus-visible,\n .option.isSelected:hover {\n outline: var(--beam-RedeemTransaction-options-selected-borderWidth) solid\n var(--beam-RedeemTransaction-options-selected-borderColor);\n border-bottom: var(--beam-RedeemTransaction-options-selected-borderWidth) solid\n var(--beam-RedeemTransaction-options-selected-borderColor);\n }\n\n .option .radioButton {\n border-width: 1px;\n border-style: solid;\n transition: background-color 0.2s, color 0.2s, border-color 0.2s;\n color: var(--beam-RedeemTransaction-radioButton-color);\n background-color: var(--beam-RedeemTransaction-radioButton-backgroundColor);\n border-color: var(--beam-RedeemTransaction-radioButton-borderColor);\n }\n\n .option.isSelected .radioButton,\n .option.isSelected:focus-visible .radioButton,\n .option.isSelected:hover .radioButton {\n color: var(--beam-RedeemTransaction-radioButton-selected-color);\n background-color: var(--beam-RedeemTransaction-radioButton-selected-backgroundColor);\n border-color: var(--beam-RedeemTransaction-radioButton-selected-borderColor);\n }\n\n .option:not(.isSelected):focus-visible .radioButton,\n .option:not(.isSelected):hover .radioButton {\n color: var(--beam-RedeemTransaction-radioButton-hover-color);\n background-color: var(--beam-RedeemTransaction-radioButton-hover-backgroundColor);\n border-color: var(--beam-RedeemTransaction-radioButton-hover-borderColor);\n }\n\n .detailsDescription {\n ${useCustomText(\"--beam-RedeemTransaction-options-details\")}\n }\n\n .detailsDescription .nonprofitName {\n font-weight: var(--beam-RedeemTransaction-options-details-nonprofitName-fontWeight);\n font-style: var(--beam-RedeemTransaction-options-details-nonprofitName-fontStyle);\n }\n\n .radioButtonContainer {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n }\n\n .radioButton {\n padding: 5px;\n border-radius: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .imageContainer {\n flex: 1 0 var(--beam-RedeemTransaction-image-width);\n display: flex;\n flex-direction: column;\n }\n\n .progressBarContainer {\n display: flex;\n align-items: center;\n }\n\n .details-progressBarLabel {\n ${useCustomText(\"--beam-RedeemTransaction-options-details-fundingProgressLabel\")}\n white-space: nowrap;\n text-align: right;\n margin-left: 15px;\n }\n\n .details {\n flex: 1 1 100%;\n display: flex;\n flex-direction: column;\n gap: 5px;\n }\n\n .root {\n display: flex;\n flex-direction: column;\n }\n\n .submitButtonContainer {\n order: 4;\n position: sticky;\n bottom: 0;\n z-index: 999;\n }\n\n .icon-background {\n width: 50px;\n height: 50px;\n border-radius: 50%;\n overflow: hidden;\n background: var(--beam-RedeemTransaction-options-icon-backgroundColor);\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .icon {\n height: var(--beam-RedeemTransaction-image-height);\n }\n\n .icon-container {\n display: flex;\n justify-content: center;\n align-items: center;\n }\n `,\n cssCardGrid({\n gap: \"0px\",\n itemMinWidth: \"var(--beam-RedeemTransaction-options-minWidth, 0px)\",\n columnCount: \"var(--beam-RedeemTransaction-options-columnCount, 1)\",\n }),\n ];\n\n private handleChooseClick() {\n this.didUserExpandNonprofits = true;\n }\n\n get shouldCollapse() {\n const enableMobileCollapse = this.cssVariables[\"--beam-RedeemTransaction-options-collapseNonprofits-mobile\"];\n const enableDesktopCollapse = this.cssVariables[\"--beam-RedeemTransaction-options-collapseNonprofits-desktop\"];\n const isMobileCollapseEnabled = enableMobileCollapse?.toLowerCase() === \"true\";\n const isDesktopCollapseEnabled = enableDesktopCollapse?.toLowerCase() === \"true\";\n\n return (this.isMobile && isMobileCollapseEnabled) || (!this.isMobile && isDesktopCollapseEnabled);\n }\n\n private renderSubmitButton(data: TIAPIV3GetChainNonprofits) {\n return html`\n ${this.didUserExpandNonprofits || !this.shouldCollapse\n ? html` <button\n type=\"button\"\n ?aria-disabled=${!this.allowSubmit}\n @click=\"${this.handleSubmit}\"\n class=\"${classMap({\n isDisabled: !this.allowSubmit,\n submitButton: true,\n })}\"\n part=\"submitButton\"\n >\n ${this.selectionDataController.data !== null\n ? localizeUserString(\n this.configLang,\n data?.config?.web?.confirmedButton || strings[this.configLang].submitButtonTextCompleted()\n )\n : localizeUserString(\n this.configLang,\n data?.config?.web?.confirmButton || strings[this.configLang].submitButtonText()\n )}\n </button>`\n : html`\n <button type=\"button\" @click=\"${this.handleChooseClick}\" class=\"submitButton\" part=\"submitButton\">\n ${localizeUserString(\n this.configLang,\n data?.config?.web?.collapsedButton || strings[this.configLang].chooseButtonText()\n )}\n </button>\n `}\n `;\n }\n\n private renderRadioButton() {\n return html`\n <div class=\"radioButtonContainer\">\n <span part=\"radioButton\" class=\"radioButton\">\n <span style=\"line-height: 0;\"> ${_radioButton({ height: \"7px\", width: \"7px\" })} </span>\n </span>\n </div>\n `;\n }\n\n private renderNonprofitImage(np: TIAPIV3Nonprofit, displayIcon: boolean) {\n const cardStyle = this.cssVariables[\"--beam-RedeemTransaction-cardStyle\"];\n\n const imageUrl = displayIcon\n ? cardStyle === \"'icon'\"\n ? np.nonprofit.causeIconUrl\n : cardStyle === \"'selected_icon'\"\n ? np.nonprofit.causeIconSelectedUrl\n : np.imageUrl\n : np.imageUrl;\n\n return html`\n ${displayIcon\n ? html` <div class=\"icon-container\">\n <div class=\"icon-background\">\n <img src=\"${imageUrl}\" alt=\"\" role=\"presentation\" class=\"icon\" />\n </div>\n </div>`\n : html` <div\n class=\"image-container\"\n style=\"${this.isMobile\n ? \"flex: 1 0 var(--beam-RedeemTransaction-image-width-mobile)\"\n : \"flex: 1 0 var(--beam-RedeemTransaction-image-width)\"}\"\n >\n <img\n src=\"${imageUrl}\"\n alt=\"\"\n role=\"presentation\"\n class=\"image\"\n style=\"\n width: 100%;\n height: ${this.isMobile\n ? \"var(--beam-RedeemTransaction-options-image-height-mobile)\"\n : \"var(--beam-RedeemTransaction-options-image-height)\"};\n object-fit: cover;\n border-radius: var(--beam-RedeemTransaction-options-image-borderRadius);}\n \"\n />\n </div>`}\n `;\n }\n\n private renderOptionDetail(np: TIAPIV3Nonprofit) {\n return html`\n <div class=\"detailsCause\" style=\"${useCustomText(\"--beam-RedeemTransaction-options-details-cause\")}\">\n ${localizeUserString(this.configLang, np.nonprofit.cause || \"\")}\n </div>\n <p class=\"detailsDescription\">${unsafeHTML(localizeUserString(this.configLang, np.impact.description || \"\"))}</p>\n `;\n }\n\n private renderProgressBar(np: TIAPIV3Nonprofit) {\n return html`\n <div class=\"progressBarContainer\">\n <beam-progress-bar value=\"${np.impact.goalProgressPercentage}\" style=\"flex: 1;\"></beam-progress-bar>\n <span class=\"details-progressBarLabel\">\n ${localizeUserString(this.configLang, np.impact.goalProgressText)}\n </span>\n </div>\n `;\n }\n\n private renderNonprofitDetails(\n np: TIAPIV3Nonprofit,\n hasNonprofitWithInactivePromo: boolean,\n data: TIAPIV3GetChainNonprofits\n ) {\n return html`\n <div class=\"details\" part=\"details\">\n ${this.renderOptionDetail(np)} ${this.renderPromoPill(np, hasNonprofitWithInactivePromo, data)}\n </div>\n `;\n }\n\n private renderPromoPill(\n np: TIAPIV3Nonprofit,\n hasNonprofitWithInactivePromo: boolean,\n data: TIAPIV3GetChainNonprofits\n ) {\n return html`\n ${np.promo?.isActive && this.shouldUsePromoUI && hasNonprofitWithInactivePromo\n ? html`<beam-promo-info-pill .promo=${data?.config?.web?.promo} shortVersion></beam-promo-info-pill>`\n : html``}\n `;\n }\n\n protected render() {\n const { selectedNonprofitId } = this;\n const { data, loading } = this.nonprofitListDataController;\n\n if (loading && !data) {\n return _loading();\n }\n if (this.nonprofitListDataController.error) {\n if (this.debug) {\n return _errorMessage({ error: this.nonprofitListDataController.error });\n }\n return \"\";\n }\n if (this.selectionDataController.error) {\n if (this.debug) {\n return _errorMessage({ error: this.selectionDataController.error });\n }\n // do not show error screen for interactive errors by default\n }\n if (data == null) {\n if (this.debug) {\n return _errorMessage({ error: new BeamError(\"No data\") });\n }\n return \"\";\n }\n const nonprofits = data?.nonprofits || [];\n const selectedNonprofit = nonprofits.find((np) => np.nonprofit.id === selectedNonprofitId) || null;\n // changes images in widget to icons\n const displayIcon =\n this.cssVariables[\"--beam-RedeemTransaction-cardStyle\"] === \"'icon'\" ||\n this.cssVariables[\"--beam-RedeemTransaction-cardStyle\"] === \"'selected_icon'\";\n const livePromo = data?.config?.web?.promo;\n this.shouldUsePromoUI = livePromo ? true : false; // new promo UI\n const hasNonprofitWithInactivePromo = nonprofits.some((nonprofit) => !nonprofit.promo || !nonprofit.promo.isActive);\n\n return html`\n <style>\n :host {\n ${this.cssVariables.toCSS()}\n }\n </style>\n <!-- Custom flex order fixes tab cycling so submit button is after content -->\n <div style=\"display: flex; flex-direction: column;\" class=\"root\">\n <div\n style=\"order: 3;\"\n tabindex=\"-1\"\n class=\"options cardGrid ${classMap({ isHidden: !this.didUserExpandNonprofits && this.shouldCollapse })}\"\n part=\"options\"\n role=\"radiogroup\"\n aria-labelledby=\"beam-RedeemTransaction-title\"\n ?aria-disabled=${!this.allowChange}\n >\n ${repeat(\n nonprofits,\n (i) => i.nonprofit.id,\n (np, index) => {\n const isSelected = selectedNonprofitId === np.nonprofit.id;\n const isFocusable = isSelected || (selectedNonprofit == null && index === 0);\n return html`\n <div\n class=\"option ${classMap({\n isSelected: isSelected,\n isDisabled: !this.allowChange,\n })}\"\n part=\"option\"\n role=\"radio\"\n tabindex=\"${isFocusable ? 0 : -1}\"\n data-value=${np.nonprofit.id}\n ?aria-checked=${isSelected}\n @click=${this.makeHandleSelect(np.nonprofit.id, index, nonprofits)}\n @keydown=${this.makeHandleSelect(np.nonprofit.id, index, nonprofits)}\n aria-label=\"${localizeUserString(this.configLang, np.nonprofit.cause || \"\")}\"\n style=\"display: flex; flex-direction: column; padding: 11px; justify-content:center;\"\n >\n <div class=\"optionContainer\" style=\"display: flex; align-items: flex-start; gap: 8px;\">\n ${this.renderRadioButton()}\n <div\n class=\"nonprofitInfoContainer\"\n style=\"flex: 1; display: flex; flex-direction: column; gap: 5px;\"\n >\n <div class=\"imageDetailContainer\" style=\"display: flex; gap: 8px;\">\n ${this.renderNonprofitImage(np, displayIcon)}\n ${this.renderNonprofitDetails(np, hasNonprofitWithInactivePromo, data)}\n </div>\n ${this.renderProgressBar(np)}\n </div>\n </div>\n </div>\n `;\n }\n )}\n </div>\n\n <div class=\"submitButtonContainer\" part=\"submit-button-container\">${this.renderSubmitButton(data)}</div>\n\n <div class=\"headerContainer\" part=\"header-container\">\n <div>\n <div\n class=\"header-promo-pill-container\"\n style=\"display: flex; ${this.isMobile && \"flex-direction: column; align-items: flex-start;\"}\"\n >\n <h3\n class=\"title\"\n part=\"title\"\n id=\"beam-RedeemTransaction-title\"\n style=\"${useCustomText(\"--beam-RedeemTransaction-title\")}; margin-right: 8px;\"\n >\n ${localizeUserString(this.configLang, data?.config?.web?.title) || strings[this.configLang].ctaTitle()}\n </h3>\n ${this.shouldUsePromoUI\n ? html`<beam-promo-info-pill\n .promo=${livePromo}\n style=\"${this.isMobile && \"order: -1; margin-bottom:10px;\"}\"\n ></beam-promo-info-pill>`\n : html``}\n </div>\n <p class=\"description\" part=\"description\" style=\"${useCustomText(\"--beam-RedeemTransaction-description\")}\">\n ${this.shouldUsePromoUI\n ? html`<span style=\"font-weight:bold\">\n ${localizeUserString(this.configLang, data?.config?.web?.promoDescriptionPrefix || \"\") ||\n strings[this.configLang].ctaPromoPrefixMessage()}\n </span>\n <span>\n ${localizeUserString(this.configLang, data?.config?.web?.promoDescription || \"\") ||\n strings[this.configLang].ctaPromoMessage()}\n </span>`\n : html`<span\n >${localizeUserString(this.configLang, data?.config?.web?.description || \"\") ||\n strings[this.configLang].ctaMessage()}\n </span>`}\n </p>\n </div>\n </div>\n\n <beam-partner-logos\n partnerName=\"${data.chain.name}\"\n partnerLogoUrl=\"${data.chain.logoUrl}\"\n style=\"order: 1\"\n part=\"logos\"\n ></beam-partner-logos>\n </div>\n `;\n }\n}\n\ndefineCustomElement(BeamRedeemTransaction);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"beam-redeem-transaction\": BeamRedeemTransaction;\n }\n}\n"],"names":["postTransaction","makeOpenApiMethod","putTransaction","_radioButton","height","width","html","styleMap","strings","donationPercentage","BeamRedeemTransaction","LitElement","DEFAULT_BASE_URL","MissingConfig","res","postChainEligibleNonprofitsForCart","WIDGET_NAMES","selectedNonprofitId","enforceConfig","AsyncController","createScopedLocalStorage","id","index","nonprofits","event","currentId","nextFocus","focusTarget","selectedNonprofit","np","BeamNonprofitSelectEvent","debounce","SUPPORTED_LANGUAGES","areRequiredKeysDefined","_changedProperties","previousPropertyValues","requireNewDataProps","prop","createdAt","data","cacheTtl","defaults","defineCustomText","partnerLogosConfigDefaults","progressBarConfigDefaults","promoPillLabelConfigDefaults","remoteConfig","config","_cssVariableMap","enableMobileCollapse","enableDesktopCollapse","isMobileCollapseEnabled","isDesktopCollapseEnabled","classMap","localizeUserString","displayIcon","cardStyle","imageUrl","useCustomText","unsafeHTML","hasNonprofitWithInactivePromo","loading","_loading","_errorMessage","BeamError","livePromo","nonprofit","repeat","i","isSelected","isFocusable","cssReset","css","cssCardGrid","__decorateClass","property","state","defineCustomElement"],"mappings":"60BAEO,MAAMA,EAAkBC,EAAkB,kBAAmB,MAAW,EAElEC,EAAiBD,EAAkB,yCAA0C,KAAU,ECDvFE,EAAe,CAAC,CAAE,OAAAC,EAAS,MAAO,MAAAC,EAAQ,KAAM,EAAI,CAAA,IAC/DC;AAAAA;AAAAA,eAEaC,EAAS,CAAE,OAAAH,EAAQ,MAAAC,EAAO,SAAU,WAAY,OAAQ,GAAI,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ICNhEG,EAAU,CACrB,GAAI,CACF,gBAAiB,IAAM,kBACvB,SAAU,IAAM,qBAChB,sBAAuB,IAAM,oBAC7B,gBAAiB,CAAC,CAAE,mBAAAC,EAAqB,GAAI,EAAI,CAAA,IAC/C,0BAA0BA,CAAkB,mCAC9C,WAAY,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAAA,IAC1C,4CAA4CA,CAAkB,mCAChE,iBAAkB,IAAM,UACxB,0BAA2B,IAAM,aACjC,iBAAkB,IAAM,oBAC1B,EACA,GAAI,CACF,gBAAiB,IAAM,uBACvB,SAAU,IAAM,yBAChB,sBAAuB,IAAM,iCAC7B,gBAAiB,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAC/C,IAAA,sCAAmCA,CAAkB,mCACvD,WAAY,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,KAC1C,gEAA6DA,CAAkB,yDACjF,iBAAkB,IAAM,YACxB,0BAA2B,IAAM,gBACjC,iBAAkB,IAAM,yBAC1B,EACA,GAAI,CACF,gBAAiB,IAAM,0BACvB,SAAU,IAAM,yBAChB,sBAAuB,IAAM,8BAC7B,gBAAiB,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAC/C,IAAA,mDAA6CA,CAAkB,sCACjE,WAAY,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAC1C,IAAA,4EAAsEA,CAAkB,wCAC1F,iBAAkB,IAAM,gBACxB,0BAA2B,IAAM,gBACjC,iBAAkB,IAAM,4BAC1B,EACA,GAAI,CACF,gBAAiB,IAAM,oBACvB,SAAU,IAAM,mBAChB,sBAAuB,IAAM,uBAC7B,gBAAiB,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAC/C,IAAA,4CAAyCA,CAAkB,kBAC7D,WAAY,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAC1C,IAAA,uFAAiFA,CAAkB,+BACrG,iBAAkB,IAAM,YACxB,0BAA2B,IAAM,kBACjC,iBAAkB,IAAM,2BAC1B,EACA,GAAI,CACF,gBAAiB,IAAM,mBACvB,SAAU,IAAM,wBAChB,sBAAuB,IAAM,0BAC7B,gBAAiB,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAC/C,IAAA,8CAAyCA,CAAkB,YAC7D,WAAY,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAAA,IAC1C,gFAA2EA,CAAkB,mCAC/F,iBAAkB,IAAM,WACxB,0BAA2B,IAAM,cACjC,iBAAkB,IAAM,0BAC1B,EACA,GAAI,CACF,gBAAiB,IAAM,8BACvB,SAAU,IAAM,6BAChB,sBAAuB,IAAM,8BAC7B,gBAAiB,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAAA,IAC/C,+BAA0BA,CAAkB,yCAC9C,WAAY,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAAA,IAC1C,kGAAwEA,CAAkB,yDAC5F,iBAAkB,IAAM,iBACxB,0BAA2B,IAAM,gBACjC,iBAAkB,IAAM,0BAC1B,EACA,GAAI,CACF,gBAAiB,IAAM,kBACvB,SAAU,IAAM,2EAChB,sBAAuB,IAAM,mDAC7B,gBAAiB,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAAA,IAC/C,+DAAaA,CAAkB,kFACjC,WAAY,CAAC,CAAE,mBAAAA,EAAqB,GAAI,EAAI,CAAA,IAC1C,2KAA+BA,CAAkB,oDACnD,iBAAkB,IAAM,2BACxB,0BAA2B,IAAM,2BACjC,iBAAkB,IAAM,sFAC1B,CACF,qICxCO,MAAMC,UAA8BC,CAAW,CAA/C,aAAA,CAAA,MAAA,GAAA,SAAA,EAGuB,KAAO,QAAkBC,EAiBzB,KAAO,KAAkB,KAExB,KAAO,MAAQ,GAEf,KAAO,YAAc,GAEzC,KAAQ,SAAW,OAAO,WAAa,IAEvC,KAAQ,wBAA0B,GAElC,KAAQ,iBAAmB,GAYpC,KAAQ,mBAAqB,SAAY,CACvC,GAAI,CAAC,KAAK,4BACR,MAAM,IAAIC,EAGZ,MAAMC,EAAM,MAAMC,EAAmC,CACnD,QAAS,KAAK,QACd,QAAS,CAAE,cAAe,WAAW,KAAK,MAAM,EAAG,EACnD,YAAa,CACX,QAAS,KAAK,QACd,WAAY,KAAK,WACjB,YAAa,KAAK,YAClB,cAAe,OAAO,KAAK,aAAa,EACxC,KAAM,KAAK,MAAQ,OACnB,WAAYC,EAAa,mBACzB,QAAS,CACP,OAAQ,CACN,YAAa,KAAK,WACpB,CACF,EACA,QAAS,QACT,KAAM,KAAK,UACb,CACF,CAAC,EAGD,OAAIF,EAAI,OAAO,IAAMA,EAAI,MAAM,KAAO,KAAK,UACzC,KAAK,QAAUA,EAAI,MAAM,IAG3B,KAAK,aAAa,YAAY,kBAAmB,CAC/C,UAAW,IAAI,KACf,KAAMA,CACR,CAAC,EAEMA,CACT,EAEA,KAAQ,2BAA6B,MAAO,CAAE,oBAAAG,CAAoB,IAC5D,KAAK,cACA,KAAK,eAAe,CAAE,oBAAAA,CAAoB,CAAC,EAE7C,KAET,KAAQ,eAAiB,MAAO,CAAE,oBAAAA,CAAoB,KAC/CC,EAA+B,CAAC,SAAU,eAAe,EAAG,IAAI,EAG9DhB,EAAe,CACpB,QAAS,KAAK,QACd,QAAS,OACT,QAAS,CACP,cAAe,WAAW,KAAK,MAAM,EACvC,EACA,WAAY,CACV,cAAe,KAAK,aACtB,EACA,YAAa,CACX,YAAae,CACf,CACF,CAAC,GAGH,KAAQ,4BAA8B,IAAIE,EACxC,KACA,KAAK,kBACP,EAEA,KAAQ,wBAA0B,IAAIA,EACpC,KACA,KAAK,0BACP,EAEA,KAAQ,aAAeC,EAAyB,IAAoC,EA4DpF,KAAQ,iBACN,CAACC,EAAYC,EAAeC,IAC5B,MAAOC,GAAiB,CACtB,GAAI,CAAC,KAAK,YAAa,OACvB,MAAMC,EAAY,KAAK,oBACvB,GAAID,aAAiB,cAAe,CAClC,IAAIE,EAAY,KAChB,OAAQF,EAAM,KACZ,IAAK,UACL,IAAK,YACCF,IAAU,EACZI,EAAYH,EAAWA,EAAW,OAAS,CAAC,EAE5CG,EAAYH,EAAWD,EAAQ,CAAC,EAElCE,EAAM,eAAe,EACrB,MACF,IAAK,aACL,IAAK,YACCF,IAAUC,EAAW,OAAS,EAChCG,EAAYH,EAAW,CAAC,EAExBG,EAAYH,EAAWD,EAAQ,CAAC,EAElCE,EAAM,eAAe,EACrB,MACF,IAAK,QACL,IAAK,IACHA,EAAM,eAAe,EACrB,MACF,QACE,MACJ,CACA,GAAIE,EAAW,CACb,MAAMC,EAAc,KAAK,WAAW,cAAc,gBAAgBD,EAAU,UAAU,EAAE,IAAI,EACxFC,IAAgB,OAClBA,EAAY,SAAW,EACvBA,EAAY,SAEd,MACF,CACF,CAGA,GADiBH,EAAM,yBACC,YAAa,CACnC,GAAIC,IAAcJ,EAEhB,OAEA,KAAK,oBAAsBA,CAE/B,CACF,EAYF,KAAe,aAAA,SAAY,CACzB,KAAM,CAAE,oBAAAJ,CAAoB,EAAI,KAChC,GAAI,CAAC,KAAK,aAAeA,GAAuB,KAAM,OACtD,MAAM,KAAK,wBAAwB,KAAK,CAAE,oBAAAA,CAAoB,CAAC,EAE/D,KAAK,aAAa,QAAQ,YAAaA,CAAmB,EAC1D,KAAK,aAAa,QAAQ,wBAAyB,IAAI,KAAA,EAAO,YAAA,CAAa,EAE3E,MAAMW,EAAoB,KAAK,6BAA6B,MAAM,WAAW,KAC1EC,GAAOA,EAAG,UAAU,KAAOZ,CAC9B,EAEA,KAAK,cACH,IAAIa,EAAyB,CAC3B,oBAAAb,EACA,cAAeW,GAAmB,UAAU,KAC5C,OAAQZ,EAAa,mBACrB,UAAW,IAAI,IACjB,CAAC,CACH,CACF,EAEA,KAAA,oBAAsBe,EACpB,IAAM,CACJ,KAAK,SAAW,OAAO,WAAa,GACtC,EACA,GACA,CAAE,QAAS,GAAI,QAAS,EAAK,CAC/B,CA3OA,CAAA,IAAI,YAAa,CACf,OAAOC,EAAoB,KAAK,IAAI,GAAK,IAC3C,CAEA,IAAY,6BAAuC,CAGjD,OADmCC,EADa,CAAC,SAAU,eAAe,EACF,IAAI,CAE9E,CA6EA,mBAAoB,CAClB,MAAM,kBAAA,EACN,OAAO,iBAAiB,SAAU,KAAK,mBAAmB,CAC5D,CAEA,MAAM,aAAaC,EAAoC,CACrD,MAAM,KAAK,sBACb,CAAA,CAEA,MAAM,QAAQC,EAAwC,CAGpD,MAAMC,EAAsB,CAAC,UAAW,UAAW,SAAU,cAAe,aAAc,MAAM,EAChG,UAAWC,KAAQD,EACjB,GAAID,EAAuB,IAAIE,CAAI,EAAG,CACpC,MAAM,KAAK,4BAA4B,KAAA,EACvC,KACF,CAEJ,CAEA,sBAAuB,CACrB,MAAM,qBACR,CAAA,CAEQ,uBAAwB,CACzBnB,EAA+B,CAAC,QAAQ,EAAG,IAAI,EAEpD,KAAK,oBAAsB,SAAS,KAAK,aAAa,QAAQ,WAAW,GAAK,EAAE,GAAK,OACrF,GAAI,CAGF,KAAM,CAAE,UAAAoB,EAAY,EAAG,KAAAC,CAAK,EAC1B,KAAK,aAAa,YAA8C,iBAAiB,GAAK,CAAC,EACnFC,EAAW,EAAI,GAAK,GAAK,IAC3B,IAAI,KAAKF,CAAS,EAAE,QAAQ,EAAIE,EAAW,IAAI,KAAK,EAAE,QAAQ,IAChE,KAAK,4BAA4B,KAAOD,EACxC,KAAK,4BAA4B,QAAU,GAE/C,MAAc,CAAA,CAGhB,CAsEA,IAAI,aAAc,CAEhB,OAAO,KAAK,wBAAwB,MAAQ,MAAQ,CAAC,KAAK,wBAAwB,OACpF,CAEA,IAAI,aAAc,CAEhB,MAAO,CAAA,EAAQ,KAAK,qBAAuB,KAAK,YAClD,CAgCA,IAAW,cAAe,CACxB,MAAME,EAAW,CACf,oBAAqB,UACrB,mBAAoB,UACpB,kBAAmB,UACnB,mBAAoB,UACpB,yBAA0B,UAC1B,GAAGC,EAAiB,iCAAkC,CACpD,SAAU,SACV,WAAY,MACd,CAAC,EACD,GAAGA,EAAiB,uCAAwC,CAC1D,UAAW,QACX,WAAY,QACd,CAAC,EACD,GAAGC,EACH,GAAGC,EACH,oCAAqC,SACrC,iDAAkD,OAClD,mDAAoD,UACpD,mDAAoD,UACpD,sDAAuD,YACvD,8CAA+C,OAC/C,wDAAyD,UACzD,qDAAsD,MACtD,oDAAqD,UACrD,gDAAiD,WACjD,8CAA+C,OAC/C,kDAAmD,OACnD,qDAAsD,OACtD,yDAA0D,OAC1D,iEAAkE,OAClE,8DAA+D,UAC/D,0DAA2D,UAC3D,oDAAqD,OACrD,6DAA8D,UAC9D,iEAAkE,UAClE,uDAAwD,OACxD,6CAA8C,cAC9C,mDAAoD,UACpD,uDAAwD,OACxD,mDAAoD,OACpD,6DAA8D,OAC9D,yDAA0D,OAC1D,4DAA6D,OAC7D,gEAAiE,OACjE,sDAAuD,OACvD,4CAA6C,MAC7C,+CAAgD,IAChD,+CAAgD,MAChD,sDAAuD,MACvD,gDAAiD,OACjD,uDAAwD,OACxD,+CAAgD,UAChD,mDAAoD,cACpD,6CAA8C,OAC9C,yDAA0D,UAC1D,qDAAsD,OACtD,qDAAsD,UACtD,wDAAyD,UACzD,wDAAyD,OACzD,4DAA6D,OAC7D,GAAGF,EAAiB,2CAA4C,CAC9D,SAAU,SACV,UAAW,MACX,WAAY,SACZ,cAAe,SACjB,CAAC,EACD,GAAGA,EAAiB,iDAAkD,CACpE,SAAU,MACV,WAAY,MACd,CAAC,EACD,oEAAqE,SACrE,mEAAoE,UACpE,qEAAsE,MACtE,GAAGA,EAAiB,gEAAiE,CACnF,SAAU,SACV,cAAe,YACjB,CAAC,EACD,qCAAsC,UACtC,gDAAiD,MACjD,wDAAyD,UACzD,6DAA8D,QAC9D,8DAA+D,QAC/D,uCAAwC,MACxC,wCAAyC,MACzC,8CAA+C,MAC/C,GAAGG,CACL,EAEMC,EAAe,KAAK,6BAA6B,MAAM,QAAQ,KAAK,OAAS,GAE7EC,EAAS,CAAE,GAAGN,EAAU,GAAGK,CAAa,EAQ9C,OAAO,OAAO,OANO,OAAO,OAAO,CACjC,OAAQ,CACN,OAAOE,EAAgB,IAA8B,CACvD,CACF,CAAC,EAEkCD,CAAM,CAC3C,CAkPQ,mBAAoB,CAC1B,KAAK,wBAA0B,EACjC,CAEA,IAAI,gBAAiB,CACnB,MAAME,EAAuB,KAAK,aAAa,4DAA4D,EACrGC,EAAwB,KAAK,aAAa,6DAA6D,EACvGC,EAA0BF,GAAsB,YAAY,IAAM,OAClEG,EAA2BF,GAAuB,YAAA,IAAkB,OAE1E,OAAQ,KAAK,UAAYC,GAA6B,CAAC,KAAK,UAAYC,CAC1E,CAEQ,mBAAmBb,EAAiC,CAC1D,OAAOjC;AAAAA,QACH,KAAK,yBAA2B,CAAC,KAAK,eACpCA;AAAAA;AAAAA,6BAEmB,CAAC,KAAK,WAAW;AAAA,sBACxB,KAAK,YAAY;AAAA,qBAClB+C,EAAS,CAChB,WAAY,CAAC,KAAK,YAClB,aAAc,EAChB,CAAC,CAAC;AAAA;AAAA;AAAA,cAGA,KAAK,wBAAwB,OAAS,KACpCC,EACE,KAAK,WACLf,GAAM,QAAQ,KAAK,iBAAmB/B,EAAQ,KAAK,UAAU,EAAE,0BACjE,CAAA,EACA8C,EACE,KAAK,WACLf,GAAM,QAAQ,KAAK,eAAiB/B,EAAQ,KAAK,UAAU,EAAE,iBAAA,CAC/D,CAAC;AAAA,qBAEPF;AAAAA,4CACkC,KAAK,iBAAiB;AAAA,gBAClDgD,EACA,KAAK,WACLf,GAAM,QAAQ,KAAK,iBAAmB/B,EAAQ,KAAK,UAAU,EAAE,iBAAA,CACjE,CAAC;AAAA;AAAA,WAEJ;AAAA,KAET,CAEQ,mBAAoB,CAC1B,OAAOF;AAAAA;AAAAA;AAAAA,2CAGgCH,EAAa,CAAE,OAAQ,MAAO,MAAO,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA,KAItF,CAEQ,qBAAqB0B,EAAsB0B,EAAsB,CACvE,MAAMC,EAAY,KAAK,aAAa,oCAAoC,EAElEC,EAAWF,EACbC,IAAc,SACZ3B,EAAG,UAAU,aACb2B,IAAc,kBACd3B,EAAG,UAAU,qBACbA,EAAG,SACLA,EAAG,SAEP,OAAOvB;AAAAA,QACHiD,EACEjD;AAAAA;AAAAA,0BAEgBmD,CAAQ;AAAA;AAAA,kBAGxBnD;AAAAA;AAAAA,qBAEW,KAAK,SACV,6DACA,qDAAqD;AAAA;AAAA;AAAA,qBAGhDmD,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAMP,KAAK,SACT,4DACA,oDAAoD;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKrD;AAAA,KAEf,CAEQ,mBAAmB5B,EAAsB,CAC/C,OAAOvB;AAAAA,yCAC8BoD,EAAc,gDAAgD,CAAC;AAAA,UAC9FJ,EAAmB,KAAK,WAAYzB,EAAG,UAAU,OAAS,EAAE,CAAC;AAAA;AAAA,sCAEjC8B,EAAWL,EAAmB,KAAK,WAAYzB,EAAG,OAAO,aAAe,EAAE,CAAC,CAAC;AAAA,KAEhH,CAEQ,kBAAkBA,EAAsB,CAC9C,OAAOvB;AAAAA;AAAAA,oCAEyBuB,EAAG,OAAO,sBAAsB;AAAA;AAAA,YAExDyB,EAAmB,KAAK,WAAYzB,EAAG,OAAO,gBAAgB,CAAC;AAAA;AAAA;AAAA,KAIzE,CAEQ,uBACNA,EACA+B,EACArB,EACA,CACA,OAAOjC;AAAAA;AAAAA,UAED,KAAK,mBAAmBuB,CAAE,CAAC,IAAI,KAAK,gBAAgBA,EAAI+B,EAA+BrB,CAAI,CAAC;AAAA;AAAA,KAGpG,CAEQ,gBACNV,EACA+B,EACArB,EACA,CACA,OAAOjC;AAAAA,QACHuB,EAAG,OAAO,UAAY,KAAK,kBAAoB+B,EAC7CtD,iCAAoCiC,GAAM,QAAQ,KAAK,KAAK,wCAC5DjC,GAAM;AAAA,KAEd,CAEU,QAAS,CACjB,KAAM,CAAE,oBAAAW,CAAoB,EAAI,KAC1B,CAAE,KAAAsB,EAAM,QAAAsB,CAAQ,EAAI,KAAK,4BAE/B,GAAIA,GAAW,CAACtB,EACd,OAAOuB,EAAAA,EAET,GAAI,KAAK,4BAA4B,MACnC,OAAI,KAAK,MACAC,EAAc,CAAE,MAAO,KAAK,4BAA4B,KAAM,CAAC,EAEjE,GAET,GAAI,KAAK,wBAAwB,OAC3B,KAAK,MACP,OAAOA,EAAc,CAAE,MAAO,KAAK,wBAAwB,KAAM,CAAC,EAItE,GAAIxB,GAAQ,KACV,OAAI,KAAK,MACAwB,EAAc,CAAE,MAAO,IAAIC,EAAU,SAAS,CAAE,CAAC,EAEnD,GAET,MAAMzC,EAAagB,GAAM,YAAc,CAAC,EAClCX,EAAoBL,EAAW,KAAMM,GAAOA,EAAG,UAAU,KAAOZ,CAAmB,GAAK,KAExFsC,EACJ,KAAK,aAAa,oCAAoC,IAAM,UAC5D,KAAK,aAAa,oCAAoC,IAAM,kBACxDU,EAAY1B,GAAM,QAAQ,KAAK,MACrC,KAAK,iBAAmB,CAAA,CAAA0B,EACxB,MAAML,EAAgCrC,EAAW,KAAM2C,GAAc,CAACA,EAAU,OAAS,CAACA,EAAU,MAAM,QAAQ,EAElH,OAAO5D;AAAAA;AAAAA;AAAAA,YAGC,KAAK,aAAa,MAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAQD+C,EAAS,CAAE,SAAU,CAAC,KAAK,yBAA2B,KAAK,cAAe,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,2BAIrF,CAAC,KAAK,WAAW;AAAA;AAAA,YAEhCc,EACA5C,EACC6C,GAAMA,EAAE,UAAU,GACnB,CAACvC,EAAIP,IAAU,CACb,MAAM+C,EAAapD,IAAwBY,EAAG,UAAU,GAClDyC,EAAcD,GAAezC,GAAqB,MAAQN,IAAU,EAC1E,OAAOhB;AAAAA;AAAAA,kCAEa+C,EAAS,CACvB,WAAYgB,EACZ,WAAY,CAAC,KAAK,WACpB,CAAC,CAAC;AAAA;AAAA;AAAA,8BAGUC,EAAc,EAAI,EAAE;AAAA,+BACnBzC,EAAG,UAAU,EAAE;AAAA,kCACZwC,CAAU;AAAA,2BACjB,KAAK,iBAAiBxC,EAAG,UAAU,GAAIP,EAAOC,CAAU,CAAC;AAAA,6BACvD,KAAK,iBAAiBM,EAAG,UAAU,GAAIP,EAAOC,CAAU,CAAC;AAAA,gCACtD+B,EAAmB,KAAK,WAAYzB,EAAG,UAAU,OAAS,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,sBAIvE,KAAK,kBAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAMpB,KAAK,qBAAqBA,EAAI0B,CAAW,CAAC;AAAA,0BAC1C,KAAK,uBAAuB1B,EAAI+B,EAA+BrB,CAAI,CAAC;AAAA;AAAA,wBAEtE,KAAK,kBAAkBV,CAAE,CAAC;AAAA;AAAA;AAAA;AAAA,eAKtC,CACF,CAAC;AAAA;AAAA;AAAA,4EAGiE,KAAK,mBAAmBU,CAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAMnE,KAAK,UAAY,kDAAkD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMhFmB,EAAc,gCAAgC,CAAC;AAAA;AAAA,kBAEtDJ,EAAmB,KAAK,WAAYf,GAAM,QAAQ,KAAK,KAAK,GAAK/B,EAAQ,KAAK,UAAU,EAAE,SAAU,CAAA;AAAA;AAAA,gBAEtG,KAAK,iBACHF;AAAAA,6BACW2D,CAAS;AAAA,6BACT,KAAK,UAAY,gCAAgC;AAAA,4CAE5D3D,GAAM;AAAA;AAAA,+DAEuCoD,EAAc,sCAAsC,CAAC;AAAA,gBACpG,KAAK,iBACHpD;AAAAA,wBACMgD,EAAmB,KAAK,WAAYf,GAAM,QAAQ,KAAK,wBAA0B,EAAE,GACrF/B,EAAQ,KAAK,UAAU,EAAE,sBAAuB,CAAA;AAAA;AAAA;AAAA,wBAG9C8C,EAAmB,KAAK,WAAYf,GAAM,QAAQ,KAAK,kBAAoB,EAAE,GAC/E/B,EAAQ,KAAK,UAAU,EAAE,gBAAiB,CAAA;AAAA,6BAE9CF;AAAAA,uBACKgD,EAAmB,KAAK,WAAYf,GAAM,QAAQ,KAAK,aAAe,EAAE,GAC3E/B,EAAQ,KAAK,UAAU,EAAE,WAAY,CAAA;AAAA,0BAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMD+B,EAAK,MAAM,IAAI;AAAA,4BACZA,EAAK,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,KAM5C,CACF,CAl4Ba7B,EACJ,QAAU,0BADNA,EAoXJ,OAAS,CACd6D,EACAC;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,UAqJMd,EAAc,0CAA0C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAoCzDA,EAAc,+DAA+D,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA8CpFe,EAAY,CACV,IAAK,MACL,aAAc,sDACd,YAAa,sDACf,CAAC,CACH,EA/lBmCC,EAAA,CAAlCC,EAAS,CAAE,KAAM,MAAO,CAAC,CAHf,EAAAjE,EAGwB,UAEAgE,SAAAA,EAAAA,EAAA,CAAlCC,EAAS,CAAE,KAAM,MAAO,CAAC,CAAA,EALfjE,EAKwB,UAAA,QAAA,EAEAgE,EAAA,CAAlCC,EAAS,CAAE,KAAM,MAAO,CAAC,CAPf,EAAAjE,EAOwB,2BAEAgE,EAAA,CAAlCC,EAAS,CAAE,KAAM,MAAO,CAAC,CAAA,EATfjE,EASwB,UAEAgE,SAAAA,EAAAA,EAAA,CAAlCC,EAAS,CAAE,KAAM,MAAO,CAAC,GAXfjE,EAWwB,UAAA,aAAA,EAEAgE,EAAA,CAAlCC,EAAS,CAAE,KAAM,MAAO,CAAC,GAbfjE,EAawB,UAAA,YAAA,EAEAgE,EAAA,CAAlCC,EAAS,CAAE,KAAM,MAAO,CAAC,CAff,EAAAjE,EAewB,UAG5BgE,MAAAA,EAAAA,EAAA,CADNC,EAAS,CAAE,KAAM,OAAQ,QAAS,EAAK,CAAC,CAAA,EAjB9BjE,EAkBJ,UAAA,qBAAA,EAE4BgE,EAAA,CAAlCC,EAAS,CAAE,KAAM,MAAO,CAAC,CApBf,EAAAjE,EAoBwB,UAECgE,MAAAA,EAAAA,EAAA,CAAnCC,EAAS,CAAE,KAAM,OAAQ,CAAC,CAAA,EAtBhBjE,EAsByB,UAAA,OAAA,EAEAgE,EAAA,CAAnCC,EAAS,CAAE,KAAM,OAAQ,CAAC,CAxBhB,EAAAjE,EAwByB,yBAEnBgE,EAAA,CAAhBE,EAAM,CAAA,EA1BIlE,EA0BM,UAAA,UAAA,EAEAgE,EAAA,CAAhBE,GA5BU,EAAAlE,EA4BM,UAEAgE,yBAAAA,EAAAA,EAAA,CAAhBE,EAAM,CAAA,EA9BIlE,EA8BM,UAAA,kBAAA,EAs2BnBmE,EAAoBnE,CAAqB"}
@@ -0,0 +1,2 @@
1
+ import{O as e}from"./update-cart-HlVGSYR7.esm.js";var r=Object.freeze({__proto__:null,updateCart:e});export{r as i};
2
+ //# sourceMappingURL=index-NHPT4c0V.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-NHPT4c0V.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,2 +1,2 @@
1
- import{o as O,i as T,a as J}from"./lodash-D3TLHRR_.esm.js";import{i as W,j as K,d as M,c as q,k as F,h as G,g as V}from"./events-Dki0ka4F.esm.js";import{logger as g}from"../utils/logger.esm.js";import{initNetworkListeners as $}from"../utils/network-listeners.esm.js";import{createScopedLocalStorage as j}from"../utils/local-storage.esm.js";import{memoizeLast as U}from"../utils/memoize-last.esm.js";import"./promo-types-DKAOFHJr.esm.js";import{B as D}from"./cart-contents-DkoytiZh.esm.js";import{O as E}from"./update-cart-Dsu0mPtW.esm.js";import{W as z,D as X}from"./routes-D0_9umO_.esm.js";import{getBeamCartId as A,getExternalCartId as Z}from"../utils/cart.esm.js";import"../components/post-purchase.esm.js";import{waitForElement as H}from"../utils/wait-for-element.esm.js";import{B as Q}from"./beam-errors-Ci0d3926.esm.js";import{getCookieValue as Y}from"../utils/cookies.esm.js";const N=window.Shopify?.routes?.root||"/";let P=!1,R=!0,k=!1;const tt="cart";async function et(t,c=!0){if(P)return!1;$(),window.addEventListener(K.eventName,async()=>{k=!0}),window.addEventListener(M.eventName,async i=>{const e=i,o=/cart\/(add|change|update|clear)/,r=e.detail.type==="xhr"?e.detail.xhr.responseURL:e.detail.response.url,n=new URL(r);if(!o.test(n.pathname))return;const s=await B(t);s.changed&&E(t,s.cart)});let m,d;window.addEventListener(q.eventName,async i=>{const e=i;g.debug("[cart-page][BeamNonprofitSelectEvent]",e.detail);const{source:o,selectedNonprofitId:r,selectionId:n}=e.detail;if(o===z.select_nonprofit){if(m===r&&d===n)return;const s=await y(t);await h({...s,selectedNonprofitId:r,selectionId:n}),d=n,m=r}}),window.addEventListener(F.eventName,async i=>{const e=i;g.debug("[cart-page][BeamNonprofitSelectionRemovedEvent]",e.detail);const{newNonprofitId:o,selectionId:r}=e.detail;if(m===o&&d===r)return;const n=await y(t);await h({...n,selectedNonprofitId:null,selectionId:r}),d=r,m=o}),window.addEventListener(G.eventName,async i=>{const e=i;if(g.debug("[cart-page][BeamCartCreatedEvent]",e.detail),window.statsig||c){const o=await y(t);await h(o)}}),window.addEventListener(V.eventName,async i=>{const e=i;if(g.debug("[cart-page][BeamCartChangeEvent]",e.detail),window.statsig||c){const o=await y(t);await h(o)}});const p=await B(t);return await E(t,p.cart,!0),P=!0,!0}async function x(t){const c=await y(t);await h(c)}async function y(t){let c,m;if(window.statsig)try{const o=window.statsig;typeof o?.getLayer("beam_trial_layer")?.get("show_beam")=="boolean"&&(c=o.getLayer("beam_trial_layer").get("show_beam",!1),m=o.getStableID())}catch{}const d=Z(tt,t),p=A(D,t),{chainId:i,storeId:e}=t;return{showBeam:c??void 0,remoteSessionId:m??void 0,beamCartId:p&&p!=="null"?p:void 0,cartId:d&&d!=="null"?d:void 0,chainId:i,storeId:e}}const ot=x;async function B(t){const{token:c,total_price:m,item_count:d,currency:p,items:i,cart_level_discount_applications:e,attributes:o}=await L();let r=!1;const n=j(t),s=n.getItemJson("cart"),b=A(D,t),u={cartId:c,beamCartId:b,subtotal:m/100,itemCount:d,currencyCode:p,schema:{source:"generic"},content:{items:i.map(({sku:l,final_line_price:f,product_id:C,line_level_discount_allocations:I})=>{const w=l||String(C),a=f/100,v=I?.map(({discount_application:S})=>({code:S?.title,applicable:!0}));return{remoteProductIdentifier:w,localAmount:a,discounts:v}}),discounts:e.map(({title:l})=>({code:l,applicable:!0}))}};let _=null;try{o?.beam&&(_=JSON.parse(o.beam))}catch(l){g.error(l)}if(_&&R&&!k){R=!1;const{nonprofit_id:l,selection_id:f}=_,C=n.getItem("nonprofit"),I=n.getItem("transaction"),w=l!==void 0&&String(l)!==C,a=f!=null&&String(f)!==I;(w||a)&&(w&&(n.setItem("nonprofit",String(l)),n.setItem("nonprofit_selected_at",new Date().toISOString())),a&&(n.setItem("transaction",String(f)),n.setItem("nonprofit_selected_at",new Date().toISOString())),window.dispatchEvent(new W({nonprofitId:l,nonprofitIdChanged:w,selectionId:f,selectionIdChanged:a})))}return T(u,{...s,beamCartId:s?.beamCartId})||(r=!0),{changed:r,cart:u}}const at=E,L=async function(){return await window.fetch(N+"cart.js",{method:"GET",headers:{"Content-Type":"application/json"}}).then(t=>t.json())},h=U(async function({selectedNonprofitId:t,selectionId:c,beamCartId:m,cartId:d,chainId:p,storeId:i,showBeam:e,remoteSessionId:o}){const{attributes:r}=await L(),n=r?.beam;let s={};try{n&&(s=JSON.parse(n))}catch(l){g.error(l)}const b=O({nonprofit_id:t,selection_id:c,beam_cart_id:m,shopify_cart_id:d,chain_id:p,store_id:i,show_beam:e,remote_session_id:o},J),u={...s,...b};t===null&&(u.nonprofit_id=void 0);const _={beam:JSON.stringify(u)};if(!T(u,s))try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:_})})}catch(l){g.error(l)}}),nt=U(async function({selectedNonprofitId:t,selectionId:c,beamCartId:m,cartId:d,chainId:p,storeId:i}){let e,o;if(window.statsig)try{const s=window.statsig;typeof s?.getLayer("beam_trial_layer")?.get("show_beam")=="boolean"&&(e=s.getLayer("beam_trial_layer").get("show_beam",!1),o=s.getStableID())}catch{}const r=O({nonprofit_id:t,selection_id:c,beam_cart_id:m,shopify_cart_id:d,chain_id:p,store_id:i,show_beam:e,remote_session_id:o},J);t===null&&(r.nonprofit_id=void 0);const n={beam:JSON.stringify(r)};try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:n})})}catch(s){g.error(s)}});async function it({parentSelector:t=".step__sections",apiKey:c,baseUrl:m=X,storeId:d,postalCode:p,discountCodes:i,countryCode:e,orderId:o,email:r,cartTotal:n,cart:s,promoCodes:b,htmlPromoCodes:u,currencyCode:_="USD",domain:l,lang:f="en",debug:C=!1}){const I=document.querySelector(t)||await H(t);if(!I)throw new Q(`Timed out waiting for selector '${t}'. Could not render Beam post-purchase widget.`);const w=await Y("cart");if(w){const v=j({apiKey:c}),S=v.getItemJson("cart")||{};v.setItemJson("cart",{...S,cartId:w})}const a=document.createElement("beam-post-purchase");a.apiKey=c,a.baseUrl=m,a.storeId=d,a.postalCode=p,a.countryCode=e,a.orderId=String(o),a.email=r,a.cartTotal=n,a.cart=s,a.promoCodes=b,a.htmlPromoCodes=u,a.discountCodes=i,a.currencyCode=_,a.domain=l,a.lang=f,a.debug=C,I.appendChild(a)}export{at as $,y as C,L as E,et as X,ot as Z,h as b,it as s,nt as t,B as v,x};
2
- //# sourceMappingURL=order-page-C41TBLoV.esm.js.map
1
+ import{o as O,i as T,a as J}from"./lodash-D3TLHRR_.esm.js";import{i as W,j as K,d as M,c as q,k as F,h as G,g as V}from"./events-Dki0ka4F.esm.js";import{logger as g}from"../utils/logger.esm.js";import{initNetworkListeners as $}from"../utils/network-listeners.esm.js";import{createScopedLocalStorage as j}from"../utils/local-storage.esm.js";import{memoizeLast as U}from"../utils/memoize-last.esm.js";import"./promo-types-DKAOFHJr.esm.js";import{B as D}from"./cart-contents-DkoytiZh.esm.js";import{O as E}from"./update-cart-HlVGSYR7.esm.js";import{W as z,D as X}from"./routes-E1gMJl6d.esm.js";import{getBeamCartId as A,getExternalCartId as Z}from"../utils/cart.esm.js";import"../components/post-purchase.esm.js";import{waitForElement as H}from"../utils/wait-for-element.esm.js";import{B as Q}from"./beam-errors-Ci0d3926.esm.js";import{getCookieValue as Y}from"../utils/cookies.esm.js";const N=window.Shopify?.routes?.root||"/";let P=!1,R=!0,k=!1;const tt="cart";async function et(t,c=!0){if(P)return!1;$(),window.addEventListener(K.eventName,async()=>{k=!0}),window.addEventListener(M.eventName,async i=>{const e=i,o=/cart\/(add|change|update|clear)/,r=e.detail.type==="xhr"?e.detail.xhr.responseURL:e.detail.response.url,n=new URL(r);if(!o.test(n.pathname))return;const s=await B(t);s.changed&&E(t,s.cart)});let m,d;window.addEventListener(q.eventName,async i=>{const e=i;g.debug("[cart-page][BeamNonprofitSelectEvent]",e.detail);const{source:o,selectedNonprofitId:r,selectionId:n}=e.detail;if(o===z.select_nonprofit){if(m===r&&d===n)return;const s=await y(t);await h({...s,selectedNonprofitId:r,selectionId:n}),d=n,m=r}}),window.addEventListener(F.eventName,async i=>{const e=i;g.debug("[cart-page][BeamNonprofitSelectionRemovedEvent]",e.detail);const{newNonprofitId:o,selectionId:r}=e.detail;if(m===o&&d===r)return;const n=await y(t);await h({...n,selectedNonprofitId:null,selectionId:r}),d=r,m=o}),window.addEventListener(G.eventName,async i=>{const e=i;if(g.debug("[cart-page][BeamCartCreatedEvent]",e.detail),window.statsig||c){const o=await y(t);await h(o)}}),window.addEventListener(V.eventName,async i=>{const e=i;if(g.debug("[cart-page][BeamCartChangeEvent]",e.detail),window.statsig||c){const o=await y(t);await h(o)}});const p=await B(t);return await E(t,p.cart,!0),P=!0,!0}async function x(t){const c=await y(t);await h(c)}async function y(t){let c,m;if(window.statsig)try{const o=window.statsig;typeof o?.getLayer("beam_trial_layer")?.get("show_beam")=="boolean"&&(c=o.getLayer("beam_trial_layer").get("show_beam",!1),m=o.getStableID())}catch{}const d=Z(tt,t),p=A(D,t),{chainId:i,storeId:e}=t;return{showBeam:c??void 0,remoteSessionId:m??void 0,beamCartId:p&&p!=="null"?p:void 0,cartId:d&&d!=="null"?d:void 0,chainId:i,storeId:e}}const ot=x;async function B(t){const{token:c,total_price:m,item_count:d,currency:p,items:i,cart_level_discount_applications:e,attributes:o}=await L();let r=!1;const n=j(t),s=n.getItemJson("cart"),b=A(D,t),u={cartId:c,beamCartId:b,subtotal:m/100,itemCount:d,currencyCode:p,schema:{source:"generic"},content:{items:i.map(({sku:l,final_line_price:f,product_id:C,line_level_discount_allocations:I})=>{const w=l||String(C),a=f/100,v=I?.map(({discount_application:S})=>({code:S?.title,applicable:!0}));return{remoteProductIdentifier:w,localAmount:a,discounts:v}}),discounts:e.map(({title:l})=>({code:l,applicable:!0}))}};let _=null;try{o?.beam&&(_=JSON.parse(o.beam))}catch(l){g.error(l)}if(_&&R&&!k){R=!1;const{nonprofit_id:l,selection_id:f}=_,C=n.getItem("nonprofit"),I=n.getItem("transaction"),w=l!==void 0&&String(l)!==C,a=f!=null&&String(f)!==I;(w||a)&&(w&&(n.setItem("nonprofit",String(l)),n.setItem("nonprofit_selected_at",new Date().toISOString())),a&&(n.setItem("transaction",String(f)),n.setItem("nonprofit_selected_at",new Date().toISOString())),window.dispatchEvent(new W({nonprofitId:l,nonprofitIdChanged:w,selectionId:f,selectionIdChanged:a})))}return T(u,{...s,beamCartId:s?.beamCartId})||(r=!0),{changed:r,cart:u}}const at=E,L=async function(){return await window.fetch(N+"cart.js",{method:"GET",headers:{"Content-Type":"application/json"}}).then(t=>t.json())},h=U(async function({selectedNonprofitId:t,selectionId:c,beamCartId:m,cartId:d,chainId:p,storeId:i,showBeam:e,remoteSessionId:o}){const{attributes:r}=await L(),n=r?.beam;let s={};try{n&&(s=JSON.parse(n))}catch(l){g.error(l)}const b=O({nonprofit_id:t,selection_id:c,beam_cart_id:m,shopify_cart_id:d,chain_id:p,store_id:i,show_beam:e,remote_session_id:o},J),u={...s,...b};t===null&&(u.nonprofit_id=void 0);const _={beam:JSON.stringify(u)};if(!T(u,s))try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:_})})}catch(l){g.error(l)}}),nt=U(async function({selectedNonprofitId:t,selectionId:c,beamCartId:m,cartId:d,chainId:p,storeId:i}){let e,o;if(window.statsig)try{const s=window.statsig;typeof s?.getLayer("beam_trial_layer")?.get("show_beam")=="boolean"&&(e=s.getLayer("beam_trial_layer").get("show_beam",!1),o=s.getStableID())}catch{}const r=O({nonprofit_id:t,selection_id:c,beam_cart_id:m,shopify_cart_id:d,chain_id:p,store_id:i,show_beam:e,remote_session_id:o},J);t===null&&(r.nonprofit_id=void 0);const n={beam:JSON.stringify(r)};try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:n})})}catch(s){g.error(s)}});async function it({parentSelector:t=".step__sections",apiKey:c,baseUrl:m=X,storeId:d,postalCode:p,discountCodes:i,countryCode:e,orderId:o,email:r,cartTotal:n,cart:s,promoCodes:b,htmlPromoCodes:u,currencyCode:_="USD",domain:l,lang:f="en",debug:C=!1}){const I=document.querySelector(t)||await H(t);if(!I)throw new Q(`Timed out waiting for selector '${t}'. Could not render Beam post-purchase widget.`);const w=await Y("cart");if(w){const v=j({apiKey:c}),S=v.getItemJson("cart")||{};v.setItemJson("cart",{...S,cartId:w})}const a=document.createElement("beam-post-purchase");a.apiKey=c,a.baseUrl=m,a.storeId=d,a.postalCode=p,a.countryCode=e,a.orderId=String(o),a.email=r,a.cartTotal=n,a.cart=s,a.promoCodes=b,a.htmlPromoCodes=u,a.discountCodes=i,a.currencyCode=_,a.domain=l,a.lang=f,a.debug=C,I.appendChild(a)}export{at as $,y as C,L as E,et as X,ot as Z,h as b,it as s,nt as t,B as v,x};
2
+ //# sourceMappingURL=order-page-C3b348k0.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"order-page-C41TBLoV.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 isUndefined from \"lodash-es/isUndefined\";\nimport omitBy from \"lodash-es/omitBy\";\nimport { logger, memoizeLast } from \"../../utils\";\nimport { initNetworkListeners } from \"../../utils/network-listeners\";\nimport {\n BeamCartChangeEvent,\n BeamCartCreatedEvent,\n BeamNetworkCallEvent,\n BeamNonprofitSelectEvent,\n BeamNonprofitSelectionRemovedEvent,\n BeamWidgetInitialNonprofitSyncCancelEvent,\n BeamWidgetInitialNonprofitSyncEvent,\n} from \"../../utils/events\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { BEAM_CART_COOKIE_NAME, TBeamCartLocalStorage, TCart, TCartItems } from \"../../shared/cart-contents\";\nimport { BeamCartAPIConfig, updateCart } from \"../cart\";\nimport { WIDGET_NAMES } from \"../../api-sdk/constants\";\nimport { getBeamCartId, getExternalCartId } from \"../../utils/cart\";\n\nexport type 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\ntype ShopifyDiscountApplication = {\n title: string;\n value: string;\n};\n\ntype ShopifyLineLevelDiscountAllocations = {\n amount?: string;\n discount_application: ShopifyDiscountApplication;\n};\n\ntype ShopifyCartBeamAttribute = {\n nonprofit_id?: number | null;\n selection_id?: string;\n beam_cart_id?: string;\n shopify_cart_id?: string;\n chain_id?: number;\n store_id?: number;\n show_beam?: boolean;\n remote_session_id?: string;\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\nlet allowEmitInitialNonprofitSync = true; // Skip updating local storage if already run initially\nlet skipEmitInitialNonprofitSync = false; // Allow other processes to skip the nonprofit sync from cart attributes\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(\n config: BeamShopifyCartIntegrationConfig,\n autoUpdateShopifyCartAttributes = true\n) {\n if (isBeamCartIntegrationRegistered) {\n return false; // Do nothing if listeners are already attached\n }\n\n // logger.debug(\"[cart-page][registerCartIntegration] initializing network listeners\");\n // Set up event listeners for AJAX events\n initNetworkListeners();\n\n /**\n * Allow another component to cancel the loading & setting\n * of the Shopify cart selection (like if a selection is made before we've gotten the previous values)\n */\n window.addEventListener(BeamWidgetInitialNonprofitSyncCancelEvent.eventName, async () => {\n // logger.debug(\"[cart-page][BeamWidgetInitialNonprofitSyncCancelEvent]\");\n skipEmitInitialNonprofitSync = true;\n });\n\n // When any network call happens, check if it's for the Shopify /cart AJAX Api.\n // If so, and the cart is updated, send the cart to Beam\n window.addEventListener(BeamNetworkCallEvent.eventName, async (_event: Event) => {\n const event = _event as BeamNetworkCallEvent;\n const cartChangePaths = /cart\\/(add|change|update|clear)/;\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 // logger.debug(\"[cart-page][BeamNetworkCallEvent] getting current cart\");\n const currentCart = await getCurrentCart(config);\n if (!currentCart.changed) {\n // logger.debug(`[cart-page][BeamNetworkCallEvent] cart has not changed from URL ${requestUrlStr}`, currentCart.cart);\n return;\n }\n // Send cart to Beam to update timestamp, which is used for cart abandonment / ROI calc\n // logger.debug(`[cart-page][BeamNetworkCallEvent] cart has changed from URL ${requestUrlStr}`, currentCart.cart);\n 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 logger.debug(\"[cart-page][BeamNonprofitSelectEvent]\", event.detail);\n const { source, selectedNonprofitId, selectionId } = event.detail;\n\n // On nonprofit selection, we always write Beam's attributes\n // to the Shopify cart attributes\n if (source === WIDGET_NAMES.select_nonprofit) {\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\n const beamCartData = await getBeamAttributesForCart(config);\n await appendBeamAttributesToCart({\n ...beamCartData,\n selectedNonprofitId,\n selectionId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = selectedNonprofitId;\n }\n });\n\n /**\n * Upon removal of the selected nonprofit from the widget and local storage,\n * an event is emitted and that event is then used to update the cart attributes accordingly\n * This event listener updates the cart attributes based on the emitted event\n */\n window.addEventListener(BeamNonprofitSelectionRemovedEvent.eventName, async (_event) => {\n const event = _event as BeamNonprofitSelectionRemovedEvent;\n logger.debug(\"[cart-page][BeamNonprofitSelectionRemovedEvent]\", event.detail);\n const { newNonprofitId, selectionId } = event.detail;\n\n if (lastNonprofitId === newNonprofitId && lastSelectionId === selectionId) {\n return;\n }\n\n // On nonprofit deselection, we always write Beam's attributes\n // to the Shopify cart attributes\n const beamCartData = await getBeamAttributesForCart(config);\n await appendBeamAttributesToCart({\n ...beamCartData,\n selectedNonprofitId: null,\n selectionId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = newNonprofitId;\n });\n\n /**\n * When a BeamCart is created, write beam metadata to the Shopify cart if\n * we need to capture it for Statsig or Extensibility\n */\n window.addEventListener(BeamCartCreatedEvent.eventName, async (_event: Event) => {\n const event = _event as BeamCartCreatedEvent;\n logger.debug(\"[cart-page][BeamCartCreatedEvent]\", event.detail);\n if (window.statsig || autoUpdateShopifyCartAttributes) {\n const beamCartData = await getBeamAttributesForCart(config);\n await appendBeamAttributesToCart(beamCartData);\n }\n });\n\n /**\n * On any cart changes, write beam metadata to the Shopify cart if\n * we need to capture it for Statsig or Extensibility\n */\n window.addEventListener(BeamCartChangeEvent.eventName, async (_event: Event) => {\n const event = _event as BeamCartChangeEvent;\n logger.debug(\"[cart-page][BeamCartChangeEvent]\", event.detail);\n if (window.statsig || autoUpdateShopifyCartAttributes) {\n const beamCartData = await getBeamAttributesForCart(config);\n await appendBeamAttributesToCart(beamCartData);\n }\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 // logger.debug(\"[cart-page][registerCartIntegration] initial cart fetch result\", currentCart);\n await updateCart(config, currentCart.cart, true);\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\nasync function appendToShopifyCartBeamAttribute(config: BeamShopifyCartIntegrationConfig) {\n const beamCartData = await getBeamAttributesForCart(config);\n await appendBeamAttributesToCart(beamCartData);\n}\n\n/**\n * Gathers the base Beam data needed for updating a Shopify cart's metadata\n */\nasync function getBeamAttributesForCart(config: BeamShopifyCartIntegrationConfig) {\n let showBeam;\n let remoteSessionId;\n\n if (window.statsig) {\n // If the site is using Statsig, but not for Beam, we need to ignore it\n try {\n const statsig = window.statsig as any;\n const statsigLayerProperty = statsig?.getLayer(\"beam_trial_layer\")?.get(\"show_beam\");\n if (typeof statsigLayerProperty === \"boolean\") {\n showBeam = statsig.getLayer(\"beam_trial_layer\").get(\"show_beam\", false /* default to hide */) as boolean;\n remoteSessionId = statsig.getStableID();\n }\n } catch (err) {\n // logger.error(err)\n }\n }\n\n const cartId = getExternalCartId(SHOPIFY_CART_COOKIE_NAME, config);\n const beamCartId = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n const { chainId, storeId } = config;\n\n return {\n showBeam: showBeam ?? undefined,\n remoteSessionId: remoteSessionId ?? undefined,\n beamCartId: beamCartId && beamCartId !== \"null\" ? beamCartId : undefined,\n cartId: cartId && cartId !== \"null\" ? cartId : undefined,\n chainId,\n storeId,\n };\n}\n\n/**\n * Adds Statsig data to a Shopify cart\n */\nconst appendStatsigToShopifyCartAttributes = appendToShopifyCartBeamAttribute;\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 cart_level_discount_applications,\n attributes,\n } = await getShopifyCart();\n\n let changed = false;\n\n const localStorage = createScopedLocalStorage(config);\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 = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n\n const cart = {\n cartId: token,\n beamCartId,\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, product_id, line_level_discount_allocations }) => {\n const remoteProductIdentifier = sku || String(product_id);\n const localAmount = final_line_price / 100;\n const discounts = (line_level_discount_allocations as ShopifyLineLevelDiscountAllocations[])?.map(\n ({ discount_application }) => {\n return { code: discount_application?.title, applicable: true };\n }\n );\n return { remoteProductIdentifier, localAmount, discounts };\n }),\n discounts: (cart_level_discount_applications as ShopifyDiscountApplication[]).map(({ title }) => {\n return { code: title, applicable: true };\n }),\n },\n };\n\n let beamAttr: ShopifyCartBeamAttribute | null = null;\n\n try {\n if (attributes?.beam) {\n beamAttr = JSON.parse(attributes.beam);\n }\n } catch (err) {\n logger.error(err);\n }\n\n /**\n * Only attempt to emit BeamWidgetInitialNonprofitSyncEvent once\n * as soon as we see a \"beam\" attribute for the first time.\n * allowEmitInitialNonprofitSync is local to this file to keep this\n * from running more than once.\n * skipEmitInitialNonprofitSync is settable by an event listener\n * so other processes can stop this sync from happening\n */\n if (beamAttr && allowEmitInitialNonprofitSync && !skipEmitInitialNonprofitSync) {\n allowEmitInitialNonprofitSync = false;\n\n const { nonprofit_id, selection_id } = beamAttr;\n\n const storedNonprofit = localStorage.getItem(\"nonprofit\");\n const storedSelection = localStorage.getItem(\"transaction\");\n\n const nonprofitChanged = nonprofit_id !== undefined && String(nonprofit_id) !== storedNonprofit;\n const selectionChanged = selection_id != null && String(selection_id) !== storedSelection;\n\n // Only dispatch if something changed, and if it's not skipped\n if (nonprofitChanged || selectionChanged) {\n if (nonprofitChanged) {\n localStorage.setItem(\"nonprofit\", String(nonprofit_id));\n localStorage.setItem(\"nonprofit_selected_at\", new Date().toISOString());\n }\n\n if (selectionChanged) {\n localStorage.setItem(\"transaction\", String(selection_id));\n localStorage.setItem(\"nonprofit_selected_at\", new Date().toISOString());\n }\n\n window.dispatchEvent(\n new BeamWidgetInitialNonprofitSyncEvent({\n nonprofitId: nonprofit_id,\n nonprofitIdChanged: nonprofitChanged,\n selectionId: selection_id,\n selectionIdChanged: selectionChanged,\n })\n );\n }\n }\n\n if (\n !isEqual(cart, {\n ...cachedCart,\n beamCartId: cachedCart?.beamCartId,\n })\n ) {\n changed = true;\n }\n\n // logger.debug(\"[cart-page][getCurrentCart] has cart changed?\", changed, cart);\n\n return { changed, cart };\n}\n\n/**\n * trackCart - Backwards-compatible alias for updateCart\n */\nconst trackCart = updateCart;\n\n/**\n * Helper function to get the Shopify cart attributes\n */\nconst getShopifyCart = async function () {\n const cart = 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 return cart;\n};\n\n/**\n * Sends Beam data to Shopify to integrate with order as custom attributes.\n * Memoized so that calls with the same data as the previous don't create additional API calls to Shopify.\n * This will do an append, not a full overwrite of the attributes in the beam property\n */\nconst appendBeamAttributesToCart = memoizeLast(async function appendBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n showBeam,\n remoteSessionId,\n}: {\n selectedNonprofitId?: number | null;\n selectionId?: string;\n beamCartId?: string;\n cartId?: string;\n chainId?: number;\n storeId?: number;\n showBeam?: boolean;\n remoteSessionId?: string;\n}) {\n // logger.debug(\"[cart-page][appendBeamAttributesToCart] fetching existing cart\");\n const { attributes } = await getShopifyCart();\n\n // Get only the Beam attribute, if it exists\n const existingBeamCartAttrString = attributes?.beam;\n let existingBeamCartAttr = {};\n try {\n if (existingBeamCartAttrString) {\n existingBeamCartAttr = JSON.parse(existingBeamCartAttrString);\n }\n } catch (err) {\n logger.error(err);\n }\n\n const newBeamAttrs = omitBy(\n {\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 show_beam: showBeam,\n remote_session_id: remoteSessionId,\n },\n isUndefined\n );\n\n const appendedBeamAttributes = {\n ...existingBeamCartAttr,\n ...newBeamAttrs,\n } as ShopifyCartBeamAttribute;\n\n // For the nonprofitId, if we specifically get a null value here,\n // we want to remove it from the cart attributes, not just write \"null\"\n if (selectedNonprofitId === null) {\n appendedBeamAttributes.nonprofit_id = undefined;\n }\n\n const beamCartAttrs = {\n beam: JSON.stringify(appendedBeamAttributes),\n };\n\n // If the attributes match, no reason to update the cart\n if (isEqual(appendedBeamAttributes, existingBeamCartAttr)) {\n // logger.debug(\"[cart-page][appendBeamAttributesToCart] cart attributes match, skipping update\");\n return;\n }\n\n try {\n // logger.debug(\"[cart-page][appendBeamAttributesToCart] updating Shopify cart\");\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 logger.error(err); // don't throw, allow later calls to continue\n }\n});\n\n/**\n * Sends Beam data to Shopify to integrate with order as custom attributes.\n * Memoized so that calls with the same data as the previous don't create additional API calls to Shopify.\n * This method force-updates the \"beam\" attribute with the values passed in\n */\nconst addBeamAttributesToCart = memoizeLast(async 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 let showBeam;\n let remoteSessionId;\n\n if (window.statsig) {\n // If the site is using Statsig, but not for Beam, we need to ignore it\n try {\n const statsig = window.statsig as any;\n const statsigLayerProperty = statsig?.getLayer(\"beam_trial_layer\")?.get(\"show_beam\");\n if (typeof statsigLayerProperty === \"boolean\") {\n showBeam = statsig.getLayer(\"beam_trial_layer\").get(\"show_beam\", false /* default to hide */) as boolean;\n remoteSessionId = statsig.getStableID();\n }\n } catch (err) {\n // logger.error(err)\n }\n }\n\n const allBeamAttributes = omitBy(\n {\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 show_beam: showBeam,\n remote_session_id: remoteSessionId,\n },\n isUndefined\n ) as ShopifyCartBeamAttribute;\n\n // For the nonprofitId, if we specifically get a null value here,\n // we want to remove it from the cart attributes, not just write \"null\"\n if (selectedNonprofitId === null) {\n allBeamAttributes.nonprofit_id = undefined;\n }\n\n const beamCartAttrs = {\n beam: JSON.stringify(allBeamAttributes),\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 logger.error(err); // don't throw, allow later calls to continue\n }\n});\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n statsig?: any; // attached by Statsig CDN script\n }\n}\nexport {\n trackCart,\n getCurrentCart,\n addBeamAttributesToCart,\n appendStatsigToShopifyCartAttributes,\n appendToShopifyCartBeamAttribute,\n registerCartIntegration,\n appendBeamAttributesToCart,\n getShopifyCart,\n getBeamAttributesForCart,\n};\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 \"../../utils/wait-for-element\";\nimport { BeamError } from \"../../utils/beam-errors\";\nimport { getCookieValue } from \"../../utils/cookies\";\nimport { createScopedLocalStorage } from \"../../utils/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 promoCodes: string[];\n htmlPromoCodes: 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 domain?: string; // Base domain for setting cookies\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 discountCodes,\n countryCode,\n orderId,\n email,\n cartTotal,\n cart,\n promoCodes,\n htmlPromoCodes,\n currencyCode = \"USD\",\n domain,\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.promoCodes = promoCodes;\n widget.htmlPromoCodes = htmlPromoCodes;\n widget.discountCodes = discountCodes;\n widget.currencyCode = currencyCode;\n widget.domain = domain;\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","allowEmitInitialNonprofitSync","skipEmitInitialNonprofitSync","SHOPIFY_CART_COOKIE_NAME","registerCartIntegration","config","autoUpdateShopifyCartAttributes","initNetworkListeners","BeamWidgetInitialNonprofitSyncCancelEvent","BeamNetworkCallEvent","_event","event","cartChangePaths","requestUrlStr","url","currentCart","getCurrentCart","updateCart","lastNonprofitId","lastSelectionId","BeamNonprofitSelectEvent","logger","source","selectedNonprofitId","selectionId","WIDGET_NAMES","beamCartData","getBeamAttributesForCart","appendBeamAttributesToCart","BeamNonprofitSelectionRemovedEvent","newNonprofitId","BeamCartCreatedEvent","BeamCartChangeEvent","appendToShopifyCartBeamAttribute","showBeam","remoteSessionId","statsig","cartId","getExternalCartId","beamCartId","getBeamCartId","BEAM_CART_COOKIE_NAME","chainId","storeId","appendStatsigToShopifyCartAttributes","token","total_price","item_count","currency","items","cart_level_discount_applications","attributes","getShopifyCart","changed","localStorage","createScopedLocalStorage","cachedCart","cart","sku","final_line_price","product_id","line_level_discount_allocations","remoteProductIdentifier","localAmount","discounts","discount_application","title","beamAttr","err","nonprofit_id","selection_id","storedNonprofit","storedSelection","nonprofitChanged","selectionChanged","BeamWidgetInitialNonprofitSyncEvent","isEqual","trackCart","res","memoizeLast","existingBeamCartAttrString","existingBeamCartAttr","newBeamAttrs","omitBy","isUndefined","appendedBeamAttributes","beamCartAttrs","addBeamAttributesToCart","allBeamAttributes","showBeamOrderPageWidgets","parentSelector","apiKey","baseUrl","DEFAULT_BASE_URL","postalCode","discountCodes","countryCode","orderId","email","cartTotal","promoCodes","htmlPromoCodes","currencyCode","domain","lang","debug","parentElement","waitForElement","BeamError","getCookieValue","beamLocalStorage","existingValue","widget"],"mappings":"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"}
1
+ {"version":3,"file":"order-page-C3b348k0.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 isUndefined from \"lodash-es/isUndefined\";\nimport omitBy from \"lodash-es/omitBy\";\nimport { logger, memoizeLast } from \"../../utils\";\nimport { initNetworkListeners } from \"../../utils/network-listeners\";\nimport {\n BeamCartChangeEvent,\n BeamCartCreatedEvent,\n BeamNetworkCallEvent,\n BeamNonprofitSelectEvent,\n BeamNonprofitSelectionRemovedEvent,\n BeamWidgetInitialNonprofitSyncCancelEvent,\n BeamWidgetInitialNonprofitSyncEvent,\n} from \"../../utils/events\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { BEAM_CART_COOKIE_NAME, TBeamCartLocalStorage, TCart, TCartItems } from \"../../shared/cart-contents\";\nimport { BeamCartAPIConfig, updateCart } from \"../cart\";\nimport { WIDGET_NAMES } from \"../../api-sdk/constants\";\nimport { getBeamCartId, getExternalCartId } from \"../../utils/cart\";\n\nexport type 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\ntype ShopifyDiscountApplication = {\n title: string;\n value: string;\n};\n\ntype ShopifyLineLevelDiscountAllocations = {\n amount?: string;\n discount_application: ShopifyDiscountApplication;\n};\n\ntype ShopifyCartBeamAttribute = {\n nonprofit_id?: number | null;\n selection_id?: string;\n beam_cart_id?: string;\n shopify_cart_id?: string;\n chain_id?: number;\n store_id?: number;\n show_beam?: boolean;\n remote_session_id?: string;\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\nlet allowEmitInitialNonprofitSync = true; // Skip updating local storage if already run initially\nlet skipEmitInitialNonprofitSync = false; // Allow other processes to skip the nonprofit sync from cart attributes\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(\n config: BeamShopifyCartIntegrationConfig,\n autoUpdateShopifyCartAttributes = true\n) {\n if (isBeamCartIntegrationRegistered) {\n return false; // Do nothing if listeners are already attached\n }\n\n // logger.debug(\"[cart-page][registerCartIntegration] initializing network listeners\");\n // Set up event listeners for AJAX events\n initNetworkListeners();\n\n /**\n * Allow another component to cancel the loading & setting\n * of the Shopify cart selection (like if a selection is made before we've gotten the previous values)\n */\n window.addEventListener(BeamWidgetInitialNonprofitSyncCancelEvent.eventName, async () => {\n // logger.debug(\"[cart-page][BeamWidgetInitialNonprofitSyncCancelEvent]\");\n skipEmitInitialNonprofitSync = true;\n });\n\n // When any network call happens, check if it's for the Shopify /cart AJAX Api.\n // If so, and the cart is updated, send the cart to Beam\n window.addEventListener(BeamNetworkCallEvent.eventName, async (_event: Event) => {\n const event = _event as BeamNetworkCallEvent;\n const cartChangePaths = /cart\\/(add|change|update|clear)/;\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 // logger.debug(\"[cart-page][BeamNetworkCallEvent] getting current cart\");\n const currentCart = await getCurrentCart(config);\n if (!currentCart.changed) {\n // logger.debug(`[cart-page][BeamNetworkCallEvent] cart has not changed from URL ${requestUrlStr}`, currentCart.cart);\n return;\n }\n // Send cart to Beam to update timestamp, which is used for cart abandonment / ROI calc\n // logger.debug(`[cart-page][BeamNetworkCallEvent] cart has changed from URL ${requestUrlStr}`, currentCart.cart);\n 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 logger.debug(\"[cart-page][BeamNonprofitSelectEvent]\", event.detail);\n const { source, selectedNonprofitId, selectionId } = event.detail;\n\n // On nonprofit selection, we always write Beam's attributes\n // to the Shopify cart attributes\n if (source === WIDGET_NAMES.select_nonprofit) {\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\n const beamCartData = await getBeamAttributesForCart(config);\n await appendBeamAttributesToCart({\n ...beamCartData,\n selectedNonprofitId,\n selectionId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = selectedNonprofitId;\n }\n });\n\n /**\n * Upon removal of the selected nonprofit from the widget and local storage,\n * an event is emitted and that event is then used to update the cart attributes accordingly\n * This event listener updates the cart attributes based on the emitted event\n */\n window.addEventListener(BeamNonprofitSelectionRemovedEvent.eventName, async (_event) => {\n const event = _event as BeamNonprofitSelectionRemovedEvent;\n logger.debug(\"[cart-page][BeamNonprofitSelectionRemovedEvent]\", event.detail);\n const { newNonprofitId, selectionId } = event.detail;\n\n if (lastNonprofitId === newNonprofitId && lastSelectionId === selectionId) {\n return;\n }\n\n // On nonprofit deselection, we always write Beam's attributes\n // to the Shopify cart attributes\n const beamCartData = await getBeamAttributesForCart(config);\n await appendBeamAttributesToCart({\n ...beamCartData,\n selectedNonprofitId: null,\n selectionId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = newNonprofitId;\n });\n\n /**\n * When a BeamCart is created, write beam metadata to the Shopify cart if\n * we need to capture it for Statsig or Extensibility\n */\n window.addEventListener(BeamCartCreatedEvent.eventName, async (_event: Event) => {\n const event = _event as BeamCartCreatedEvent;\n logger.debug(\"[cart-page][BeamCartCreatedEvent]\", event.detail);\n if (window.statsig || autoUpdateShopifyCartAttributes) {\n const beamCartData = await getBeamAttributesForCart(config);\n await appendBeamAttributesToCart(beamCartData);\n }\n });\n\n /**\n * On any cart changes, write beam metadata to the Shopify cart if\n * we need to capture it for Statsig or Extensibility\n */\n window.addEventListener(BeamCartChangeEvent.eventName, async (_event: Event) => {\n const event = _event as BeamCartChangeEvent;\n logger.debug(\"[cart-page][BeamCartChangeEvent]\", event.detail);\n if (window.statsig || autoUpdateShopifyCartAttributes) {\n const beamCartData = await getBeamAttributesForCart(config);\n await appendBeamAttributesToCart(beamCartData);\n }\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 // logger.debug(\"[cart-page][registerCartIntegration] initial cart fetch result\", currentCart);\n await updateCart(config, currentCart.cart, true);\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\nasync function appendToShopifyCartBeamAttribute(config: BeamShopifyCartIntegrationConfig) {\n const beamCartData = await getBeamAttributesForCart(config);\n await appendBeamAttributesToCart(beamCartData);\n}\n\n/**\n * Gathers the base Beam data needed for updating a Shopify cart's metadata\n */\nasync function getBeamAttributesForCart(config: BeamShopifyCartIntegrationConfig) {\n let showBeam;\n let remoteSessionId;\n\n if (window.statsig) {\n // If the site is using Statsig, but not for Beam, we need to ignore it\n try {\n const statsig = window.statsig as any;\n const statsigLayerProperty = statsig?.getLayer(\"beam_trial_layer\")?.get(\"show_beam\");\n if (typeof statsigLayerProperty === \"boolean\") {\n showBeam = statsig.getLayer(\"beam_trial_layer\").get(\"show_beam\", false /* default to hide */) as boolean;\n remoteSessionId = statsig.getStableID();\n }\n } catch (err) {\n // logger.error(err)\n }\n }\n\n const cartId = getExternalCartId(SHOPIFY_CART_COOKIE_NAME, config);\n const beamCartId = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n const { chainId, storeId } = config;\n\n return {\n showBeam: showBeam ?? undefined,\n remoteSessionId: remoteSessionId ?? undefined,\n beamCartId: beamCartId && beamCartId !== \"null\" ? beamCartId : undefined,\n cartId: cartId && cartId !== \"null\" ? cartId : undefined,\n chainId,\n storeId,\n };\n}\n\n/**\n * Adds Statsig data to a Shopify cart\n */\nconst appendStatsigToShopifyCartAttributes = appendToShopifyCartBeamAttribute;\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 cart_level_discount_applications,\n attributes,\n } = await getShopifyCart();\n\n let changed = false;\n\n const localStorage = createScopedLocalStorage(config);\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 = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n\n const cart = {\n cartId: token,\n beamCartId,\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, product_id, line_level_discount_allocations }) => {\n const remoteProductIdentifier = sku || String(product_id);\n const localAmount = final_line_price / 100;\n const discounts = (line_level_discount_allocations as ShopifyLineLevelDiscountAllocations[])?.map(\n ({ discount_application }) => {\n return { code: discount_application?.title, applicable: true };\n }\n );\n return { remoteProductIdentifier, localAmount, discounts };\n }),\n discounts: (cart_level_discount_applications as ShopifyDiscountApplication[]).map(({ title }) => {\n return { code: title, applicable: true };\n }),\n },\n };\n\n let beamAttr: ShopifyCartBeamAttribute | null = null;\n\n try {\n if (attributes?.beam) {\n beamAttr = JSON.parse(attributes.beam);\n }\n } catch (err) {\n logger.error(err);\n }\n\n /**\n * Only attempt to emit BeamWidgetInitialNonprofitSyncEvent once\n * as soon as we see a \"beam\" attribute for the first time.\n * allowEmitInitialNonprofitSync is local to this file to keep this\n * from running more than once.\n * skipEmitInitialNonprofitSync is settable by an event listener\n * so other processes can stop this sync from happening\n */\n if (beamAttr && allowEmitInitialNonprofitSync && !skipEmitInitialNonprofitSync) {\n allowEmitInitialNonprofitSync = false;\n\n const { nonprofit_id, selection_id } = beamAttr;\n\n const storedNonprofit = localStorage.getItem(\"nonprofit\");\n const storedSelection = localStorage.getItem(\"transaction\");\n\n const nonprofitChanged = nonprofit_id !== undefined && String(nonprofit_id) !== storedNonprofit;\n const selectionChanged = selection_id != null && String(selection_id) !== storedSelection;\n\n // Only dispatch if something changed, and if it's not skipped\n if (nonprofitChanged || selectionChanged) {\n if (nonprofitChanged) {\n localStorage.setItem(\"nonprofit\", String(nonprofit_id));\n localStorage.setItem(\"nonprofit_selected_at\", new Date().toISOString());\n }\n\n if (selectionChanged) {\n localStorage.setItem(\"transaction\", String(selection_id));\n localStorage.setItem(\"nonprofit_selected_at\", new Date().toISOString());\n }\n\n window.dispatchEvent(\n new BeamWidgetInitialNonprofitSyncEvent({\n nonprofitId: nonprofit_id,\n nonprofitIdChanged: nonprofitChanged,\n selectionId: selection_id,\n selectionIdChanged: selectionChanged,\n })\n );\n }\n }\n\n if (\n !isEqual(cart, {\n ...cachedCart,\n beamCartId: cachedCart?.beamCartId,\n })\n ) {\n changed = true;\n }\n\n // logger.debug(\"[cart-page][getCurrentCart] has cart changed?\", changed, cart);\n\n return { changed, cart };\n}\n\n/**\n * trackCart - Backwards-compatible alias for updateCart\n */\nconst trackCart = updateCart;\n\n/**\n * Helper function to get the Shopify cart attributes\n */\nconst getShopifyCart = async function () {\n const cart = 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 return cart;\n};\n\n/**\n * Sends Beam data to Shopify to integrate with order as custom attributes.\n * Memoized so that calls with the same data as the previous don't create additional API calls to Shopify.\n * This will do an append, not a full overwrite of the attributes in the beam property\n */\nconst appendBeamAttributesToCart = memoizeLast(async function appendBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n showBeam,\n remoteSessionId,\n}: {\n selectedNonprofitId?: number | null;\n selectionId?: string;\n beamCartId?: string;\n cartId?: string;\n chainId?: number;\n storeId?: number;\n showBeam?: boolean;\n remoteSessionId?: string;\n}) {\n // logger.debug(\"[cart-page][appendBeamAttributesToCart] fetching existing cart\");\n const { attributes } = await getShopifyCart();\n\n // Get only the Beam attribute, if it exists\n const existingBeamCartAttrString = attributes?.beam;\n let existingBeamCartAttr = {};\n try {\n if (existingBeamCartAttrString) {\n existingBeamCartAttr = JSON.parse(existingBeamCartAttrString);\n }\n } catch (err) {\n logger.error(err);\n }\n\n const newBeamAttrs = omitBy(\n {\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 show_beam: showBeam,\n remote_session_id: remoteSessionId,\n },\n isUndefined\n );\n\n const appendedBeamAttributes = {\n ...existingBeamCartAttr,\n ...newBeamAttrs,\n } as ShopifyCartBeamAttribute;\n\n // For the nonprofitId, if we specifically get a null value here,\n // we want to remove it from the cart attributes, not just write \"null\"\n if (selectedNonprofitId === null) {\n appendedBeamAttributes.nonprofit_id = undefined;\n }\n\n const beamCartAttrs = {\n beam: JSON.stringify(appendedBeamAttributes),\n };\n\n // If the attributes match, no reason to update the cart\n if (isEqual(appendedBeamAttributes, existingBeamCartAttr)) {\n // logger.debug(\"[cart-page][appendBeamAttributesToCart] cart attributes match, skipping update\");\n return;\n }\n\n try {\n // logger.debug(\"[cart-page][appendBeamAttributesToCart] updating Shopify cart\");\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 logger.error(err); // don't throw, allow later calls to continue\n }\n});\n\n/**\n * Sends Beam data to Shopify to integrate with order as custom attributes.\n * Memoized so that calls with the same data as the previous don't create additional API calls to Shopify.\n * This method force-updates the \"beam\" attribute with the values passed in\n */\nconst addBeamAttributesToCart = memoizeLast(async 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 let showBeam;\n let remoteSessionId;\n\n if (window.statsig) {\n // If the site is using Statsig, but not for Beam, we need to ignore it\n try {\n const statsig = window.statsig as any;\n const statsigLayerProperty = statsig?.getLayer(\"beam_trial_layer\")?.get(\"show_beam\");\n if (typeof statsigLayerProperty === \"boolean\") {\n showBeam = statsig.getLayer(\"beam_trial_layer\").get(\"show_beam\", false /* default to hide */) as boolean;\n remoteSessionId = statsig.getStableID();\n }\n } catch (err) {\n // logger.error(err)\n }\n }\n\n const allBeamAttributes = omitBy(\n {\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 show_beam: showBeam,\n remote_session_id: remoteSessionId,\n },\n isUndefined\n ) as ShopifyCartBeamAttribute;\n\n // For the nonprofitId, if we specifically get a null value here,\n // we want to remove it from the cart attributes, not just write \"null\"\n if (selectedNonprofitId === null) {\n allBeamAttributes.nonprofit_id = undefined;\n }\n\n const beamCartAttrs = {\n beam: JSON.stringify(allBeamAttributes),\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 logger.error(err); // don't throw, allow later calls to continue\n }\n});\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n statsig?: any; // attached by Statsig CDN script\n }\n}\nexport {\n trackCart,\n getCurrentCart,\n addBeamAttributesToCart,\n appendStatsigToShopifyCartAttributes,\n appendToShopifyCartBeamAttribute,\n registerCartIntegration,\n appendBeamAttributesToCart,\n getShopifyCart,\n getBeamAttributesForCart,\n};\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 \"../../utils/wait-for-element\";\nimport { BeamError } from \"../../utils/beam-errors\";\nimport { getCookieValue } from \"../../utils/cookies\";\nimport { createScopedLocalStorage } from \"../../utils/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 promoCodes: string[];\n htmlPromoCodes: 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 domain?: string; // Base domain for setting cookies\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 discountCodes,\n countryCode,\n orderId,\n email,\n cartTotal,\n cart,\n promoCodes,\n htmlPromoCodes,\n currencyCode = \"USD\",\n domain,\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.promoCodes = promoCodes;\n widget.htmlPromoCodes = htmlPromoCodes;\n widget.discountCodes = discountCodes;\n widget.currencyCode = currencyCode;\n widget.domain = domain;\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","allowEmitInitialNonprofitSync","skipEmitInitialNonprofitSync","SHOPIFY_CART_COOKIE_NAME","registerCartIntegration","config","autoUpdateShopifyCartAttributes","initNetworkListeners","BeamWidgetInitialNonprofitSyncCancelEvent","BeamNetworkCallEvent","_event","event","cartChangePaths","requestUrlStr","url","currentCart","getCurrentCart","updateCart","lastNonprofitId","lastSelectionId","BeamNonprofitSelectEvent","logger","source","selectedNonprofitId","selectionId","WIDGET_NAMES","beamCartData","getBeamAttributesForCart","appendBeamAttributesToCart","BeamNonprofitSelectionRemovedEvent","newNonprofitId","BeamCartCreatedEvent","BeamCartChangeEvent","appendToShopifyCartBeamAttribute","showBeam","remoteSessionId","statsig","cartId","getExternalCartId","beamCartId","getBeamCartId","BEAM_CART_COOKIE_NAME","chainId","storeId","appendStatsigToShopifyCartAttributes","token","total_price","item_count","currency","items","cart_level_discount_applications","attributes","getShopifyCart","changed","localStorage","createScopedLocalStorage","cachedCart","cart","sku","final_line_price","product_id","line_level_discount_allocations","remoteProductIdentifier","localAmount","discounts","discount_application","title","beamAttr","err","nonprofit_id","selection_id","storedNonprofit","storedSelection","nonprofitChanged","selectionChanged","BeamWidgetInitialNonprofitSyncEvent","isEqual","trackCart","res","memoizeLast","existingBeamCartAttrString","existingBeamCartAttr","newBeamAttrs","omitBy","isUndefined","appendedBeamAttributes","beamCartAttrs","addBeamAttributesToCart","allBeamAttributes","showBeamOrderPageWidgets","parentSelector","apiKey","baseUrl","DEFAULT_BASE_URL","postalCode","discountCodes","countryCode","orderId","email","cartTotal","promoCodes","htmlPromoCodes","currencyCode","domain","lang","debug","parentElement","waitForElement","BeamError","getCookieValue","beamLocalStorage","existingValue","widget"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{o as O,i as T,a as J}from"./lodash-D3TLHRR_.esm.js";import{i as W,j as K,d as M,c as q,k as F,h as G,g as V}from"./events-Dki0ka4F.esm.js";import{logger as g}from"../utils/logger.js";import{initNetworkListeners as $}from"../utils/network-listeners.js";import{createScopedLocalStorage as j}from"../utils/local-storage.js";import{memoizeLast as U}from"../utils/memoize-last.js";import"./promo-types-DKAOFHJr.esm.js";import{B as D}from"./cart-contents-DkoytiZh.esm.js";import{O as E}from"./update-cart-CFB8JVgq.esm.js";import{W as z,D as X}from"./routes-BGx3ADhY.esm.js";import{getBeamCartId as A,getExternalCartId as Z}from"../utils/cart.js";import"../components/post-purchase.js";import{waitForElement as H}from"../utils/wait-for-element.js";import{B as Q}from"./beam-errors-Ci0d3926.esm.js";import{getCookieValue as Y}from"../utils/cookies.js";const N=window.Shopify?.routes?.root||"/";let P=!1,R=!0,k=!1;const tt="cart";async function et(t,c=!0){if(P)return!1;$(),window.addEventListener(K.eventName,async()=>{k=!0}),window.addEventListener(M.eventName,async i=>{const e=i,o=/cart\/(add|change|update|clear)/,r=e.detail.type==="xhr"?e.detail.xhr.responseURL:e.detail.response.url,n=new URL(r);if(!o.test(n.pathname))return;const s=await B(t);s.changed&&E(t,s.cart)});let m,d;window.addEventListener(q.eventName,async i=>{const e=i;g.debug("[cart-page][BeamNonprofitSelectEvent]",e.detail);const{source:o,selectedNonprofitId:r,selectionId:n}=e.detail;if(o===z.select_nonprofit){if(m===r&&d===n)return;const s=await y(t);await h({...s,selectedNonprofitId:r,selectionId:n}),d=n,m=r}}),window.addEventListener(F.eventName,async i=>{const e=i;g.debug("[cart-page][BeamNonprofitSelectionRemovedEvent]",e.detail);const{newNonprofitId:o,selectionId:r}=e.detail;if(m===o&&d===r)return;const n=await y(t);await h({...n,selectedNonprofitId:null,selectionId:r}),d=r,m=o}),window.addEventListener(G.eventName,async i=>{const e=i;if(g.debug("[cart-page][BeamCartCreatedEvent]",e.detail),window.statsig||c){const o=await y(t);await h(o)}}),window.addEventListener(V.eventName,async i=>{const e=i;if(g.debug("[cart-page][BeamCartChangeEvent]",e.detail),window.statsig||c){const o=await y(t);await h(o)}});const p=await B(t);return await E(t,p.cart,!0),P=!0,!0}async function x(t){const c=await y(t);await h(c)}async function y(t){let c,m;if(window.statsig)try{const o=window.statsig;typeof o?.getLayer("beam_trial_layer")?.get("show_beam")=="boolean"&&(c=o.getLayer("beam_trial_layer").get("show_beam",!1),m=o.getStableID())}catch{}const d=Z(tt,t),p=A(D,t),{chainId:i,storeId:e}=t;return{showBeam:c??void 0,remoteSessionId:m??void 0,beamCartId:p&&p!=="null"?p:void 0,cartId:d&&d!=="null"?d:void 0,chainId:i,storeId:e}}const ot=x;async function B(t){const{token:c,total_price:m,item_count:d,currency:p,items:i,cart_level_discount_applications:e,attributes:o}=await L();let r=!1;const n=j(t),s=n.getItemJson("cart"),b=A(D,t),u={cartId:c,beamCartId:b,subtotal:m/100,itemCount:d,currencyCode:p,schema:{source:"generic"},content:{items:i.map(({sku:l,final_line_price:f,product_id:C,line_level_discount_allocations:I})=>{const w=l||String(C),a=f/100,v=I?.map(({discount_application:S})=>({code:S?.title,applicable:!0}));return{remoteProductIdentifier:w,localAmount:a,discounts:v}}),discounts:e.map(({title:l})=>({code:l,applicable:!0}))}};let _=null;try{o?.beam&&(_=JSON.parse(o.beam))}catch(l){g.error(l)}if(_&&R&&!k){R=!1;const{nonprofit_id:l,selection_id:f}=_,C=n.getItem("nonprofit"),I=n.getItem("transaction"),w=l!==void 0&&String(l)!==C,a=f!=null&&String(f)!==I;(w||a)&&(w&&(n.setItem("nonprofit",String(l)),n.setItem("nonprofit_selected_at",new Date().toISOString())),a&&(n.setItem("transaction",String(f)),n.setItem("nonprofit_selected_at",new Date().toISOString())),window.dispatchEvent(new W({nonprofitId:l,nonprofitIdChanged:w,selectionId:f,selectionIdChanged:a})))}return T(u,{...s,beamCartId:s?.beamCartId})||(r=!0),{changed:r,cart:u}}const at=E,L=async function(){return await window.fetch(N+"cart.js",{method:"GET",headers:{"Content-Type":"application/json"}}).then(t=>t.json())},h=U(async function({selectedNonprofitId:t,selectionId:c,beamCartId:m,cartId:d,chainId:p,storeId:i,showBeam:e,remoteSessionId:o}){const{attributes:r}=await L(),n=r?.beam;let s={};try{n&&(s=JSON.parse(n))}catch(l){g.error(l)}const b=O({nonprofit_id:t,selection_id:c,beam_cart_id:m,shopify_cart_id:d,chain_id:p,store_id:i,show_beam:e,remote_session_id:o},J),u={...s,...b};t===null&&(u.nonprofit_id=void 0);const _={beam:JSON.stringify(u)};if(!T(u,s))try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:_})})}catch(l){g.error(l)}}),nt=U(async function({selectedNonprofitId:t,selectionId:c,beamCartId:m,cartId:d,chainId:p,storeId:i}){let e,o;if(window.statsig)try{const s=window.statsig;typeof s?.getLayer("beam_trial_layer")?.get("show_beam")=="boolean"&&(e=s.getLayer("beam_trial_layer").get("show_beam",!1),o=s.getStableID())}catch{}const r=O({nonprofit_id:t,selection_id:c,beam_cart_id:m,shopify_cart_id:d,chain_id:p,store_id:i,show_beam:e,remote_session_id:o},J);t===null&&(r.nonprofit_id=void 0);const n={beam:JSON.stringify(r)};try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:n})})}catch(s){g.error(s)}});async function it({parentSelector:t=".step__sections",apiKey:c,baseUrl:m=X,storeId:d,postalCode:p,discountCodes:i,countryCode:e,orderId:o,email:r,cartTotal:n,cart:s,promoCodes:b,htmlPromoCodes:u,currencyCode:_="USD",domain:l,lang:f="en",debug:C=!1}){const I=document.querySelector(t)||await H(t);if(!I)throw new Q(`Timed out waiting for selector '${t}'. Could not render Beam post-purchase widget.`);const w=await Y("cart");if(w){const v=j({apiKey:c}),S=v.getItemJson("cart")||{};v.setItemJson("cart",{...S,cartId:w})}const a=document.createElement("beam-post-purchase");a.apiKey=c,a.baseUrl=m,a.storeId=d,a.postalCode=p,a.countryCode=e,a.orderId=String(o),a.email=r,a.cartTotal=n,a.cart=s,a.promoCodes=b,a.htmlPromoCodes=u,a.discountCodes=i,a.currencyCode=_,a.domain=l,a.lang=f,a.debug=C,I.appendChild(a)}export{at as $,y as C,L as E,et as X,ot as Z,h as b,it as s,nt as t,B as v,x};
2
- //# sourceMappingURL=order-page-Brrq-LAx.esm.js.map
1
+ import{o as O,i as T,a as J}from"./lodash-D3TLHRR_.esm.js";import{i as W,j as K,d as M,c as q,k as F,h as G,g as V}from"./events-Dki0ka4F.esm.js";import{logger as g}from"../utils/logger.js";import{initNetworkListeners as $}from"../utils/network-listeners.js";import{createScopedLocalStorage as j}from"../utils/local-storage.js";import{memoizeLast as U}from"../utils/memoize-last.js";import"./promo-types-DKAOFHJr.esm.js";import{B as D}from"./cart-contents-DkoytiZh.esm.js";import{O as E}from"./update-cart-C6BdmBt1.esm.js";import{W as z,D as X}from"./routes-BHChxaFQ.esm.js";import{getBeamCartId as A,getExternalCartId as Z}from"../utils/cart.js";import"../components/post-purchase.js";import{waitForElement as H}from"../utils/wait-for-element.js";import{B as Q}from"./beam-errors-Ci0d3926.esm.js";import{getCookieValue as Y}from"../utils/cookies.js";const N=window.Shopify?.routes?.root||"/";let P=!1,R=!0,k=!1;const tt="cart";async function et(t,c=!0){if(P)return!1;$(),window.addEventListener(K.eventName,async()=>{k=!0}),window.addEventListener(M.eventName,async i=>{const e=i,o=/cart\/(add|change|update|clear)/,r=e.detail.type==="xhr"?e.detail.xhr.responseURL:e.detail.response.url,n=new URL(r);if(!o.test(n.pathname))return;const s=await B(t);s.changed&&E(t,s.cart)});let m,d;window.addEventListener(q.eventName,async i=>{const e=i;g.debug("[cart-page][BeamNonprofitSelectEvent]",e.detail);const{source:o,selectedNonprofitId:r,selectionId:n}=e.detail;if(o===z.select_nonprofit){if(m===r&&d===n)return;const s=await y(t);await h({...s,selectedNonprofitId:r,selectionId:n}),d=n,m=r}}),window.addEventListener(F.eventName,async i=>{const e=i;g.debug("[cart-page][BeamNonprofitSelectionRemovedEvent]",e.detail);const{newNonprofitId:o,selectionId:r}=e.detail;if(m===o&&d===r)return;const n=await y(t);await h({...n,selectedNonprofitId:null,selectionId:r}),d=r,m=o}),window.addEventListener(G.eventName,async i=>{const e=i;if(g.debug("[cart-page][BeamCartCreatedEvent]",e.detail),window.statsig||c){const o=await y(t);await h(o)}}),window.addEventListener(V.eventName,async i=>{const e=i;if(g.debug("[cart-page][BeamCartChangeEvent]",e.detail),window.statsig||c){const o=await y(t);await h(o)}});const p=await B(t);return await E(t,p.cart,!0),P=!0,!0}async function x(t){const c=await y(t);await h(c)}async function y(t){let c,m;if(window.statsig)try{const o=window.statsig;typeof o?.getLayer("beam_trial_layer")?.get("show_beam")=="boolean"&&(c=o.getLayer("beam_trial_layer").get("show_beam",!1),m=o.getStableID())}catch{}const d=Z(tt,t),p=A(D,t),{chainId:i,storeId:e}=t;return{showBeam:c??void 0,remoteSessionId:m??void 0,beamCartId:p&&p!=="null"?p:void 0,cartId:d&&d!=="null"?d:void 0,chainId:i,storeId:e}}const ot=x;async function B(t){const{token:c,total_price:m,item_count:d,currency:p,items:i,cart_level_discount_applications:e,attributes:o}=await L();let r=!1;const n=j(t),s=n.getItemJson("cart"),b=A(D,t),u={cartId:c,beamCartId:b,subtotal:m/100,itemCount:d,currencyCode:p,schema:{source:"generic"},content:{items:i.map(({sku:l,final_line_price:f,product_id:C,line_level_discount_allocations:I})=>{const w=l||String(C),a=f/100,v=I?.map(({discount_application:S})=>({code:S?.title,applicable:!0}));return{remoteProductIdentifier:w,localAmount:a,discounts:v}}),discounts:e.map(({title:l})=>({code:l,applicable:!0}))}};let _=null;try{o?.beam&&(_=JSON.parse(o.beam))}catch(l){g.error(l)}if(_&&R&&!k){R=!1;const{nonprofit_id:l,selection_id:f}=_,C=n.getItem("nonprofit"),I=n.getItem("transaction"),w=l!==void 0&&String(l)!==C,a=f!=null&&String(f)!==I;(w||a)&&(w&&(n.setItem("nonprofit",String(l)),n.setItem("nonprofit_selected_at",new Date().toISOString())),a&&(n.setItem("transaction",String(f)),n.setItem("nonprofit_selected_at",new Date().toISOString())),window.dispatchEvent(new W({nonprofitId:l,nonprofitIdChanged:w,selectionId:f,selectionIdChanged:a})))}return T(u,{...s,beamCartId:s?.beamCartId})||(r=!0),{changed:r,cart:u}}const at=E,L=async function(){return await window.fetch(N+"cart.js",{method:"GET",headers:{"Content-Type":"application/json"}}).then(t=>t.json())},h=U(async function({selectedNonprofitId:t,selectionId:c,beamCartId:m,cartId:d,chainId:p,storeId:i,showBeam:e,remoteSessionId:o}){const{attributes:r}=await L(),n=r?.beam;let s={};try{n&&(s=JSON.parse(n))}catch(l){g.error(l)}const b=O({nonprofit_id:t,selection_id:c,beam_cart_id:m,shopify_cart_id:d,chain_id:p,store_id:i,show_beam:e,remote_session_id:o},J),u={...s,...b};t===null&&(u.nonprofit_id=void 0);const _={beam:JSON.stringify(u)};if(!T(u,s))try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:_})})}catch(l){g.error(l)}}),nt=U(async function({selectedNonprofitId:t,selectionId:c,beamCartId:m,cartId:d,chainId:p,storeId:i}){let e,o;if(window.statsig)try{const s=window.statsig;typeof s?.getLayer("beam_trial_layer")?.get("show_beam")=="boolean"&&(e=s.getLayer("beam_trial_layer").get("show_beam",!1),o=s.getStableID())}catch{}const r=O({nonprofit_id:t,selection_id:c,beam_cart_id:m,shopify_cart_id:d,chain_id:p,store_id:i,show_beam:e,remote_session_id:o},J);t===null&&(r.nonprofit_id=void 0);const n={beam:JSON.stringify(r)};try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:n})})}catch(s){g.error(s)}});async function it({parentSelector:t=".step__sections",apiKey:c,baseUrl:m=X,storeId:d,postalCode:p,discountCodes:i,countryCode:e,orderId:o,email:r,cartTotal:n,cart:s,promoCodes:b,htmlPromoCodes:u,currencyCode:_="USD",domain:l,lang:f="en",debug:C=!1}){const I=document.querySelector(t)||await H(t);if(!I)throw new Q(`Timed out waiting for selector '${t}'. Could not render Beam post-purchase widget.`);const w=await Y("cart");if(w){const v=j({apiKey:c}),S=v.getItemJson("cart")||{};v.setItemJson("cart",{...S,cartId:w})}const a=document.createElement("beam-post-purchase");a.apiKey=c,a.baseUrl=m,a.storeId=d,a.postalCode=p,a.countryCode=e,a.orderId=String(o),a.email=r,a.cartTotal=n,a.cart=s,a.promoCodes=b,a.htmlPromoCodes=u,a.discountCodes=i,a.currencyCode=_,a.domain=l,a.lang=f,a.debug=C,I.appendChild(a)}export{at as $,y as C,L as E,et as X,ot as Z,h as b,it as s,nt as t,B as v,x};
2
+ //# sourceMappingURL=order-page-CuL1s6HR.esm.js.map