@beamimpact/web-sdk 1.57.3 → 1.57.4

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 (93) hide show
  1. package/dist/chunks/{_share-dialog-dependencies-BonvNllt.esm.js → _share-dialog-dependencies-BvaXft1r.esm.js} +2 -2
  2. package/dist/chunks/{_share-dialog-dependencies-BonvNllt.esm.js.map → _share-dialog-dependencies-BvaXft1r.esm.js.map} +1 -1
  3. package/dist/chunks/{index-CQEhF7Dy.esm.js → index-726Vfz5u.esm.js} +2 -2
  4. package/dist/chunks/{index-CQEhF7Dy.esm.js.map → index-726Vfz5u.esm.js.map} +1 -1
  5. package/dist/chunks/{index-BnbtpTg-.esm.js → index-B7OkmoYI.esm.js} +2 -2
  6. package/dist/chunks/{index-BnbtpTg-.esm.js.map → index-B7OkmoYI.esm.js.map} +1 -1
  7. package/dist/chunks/{index-DJ5OwAaV.esm.js → index-BOHlIBDq.esm.js} +2 -2
  8. package/dist/chunks/{index-DJ5OwAaV.esm.js.map → index-BOHlIBDq.esm.js.map} +1 -1
  9. package/dist/chunks/{index-C03QP2W-.esm.js → index-Bc_hD09J.esm.js} +2 -2
  10. package/dist/chunks/{index-C03QP2W-.esm.js.map → index-Bc_hD09J.esm.js.map} +1 -1
  11. package/dist/chunks/{index-Ghl9JrXJ.esm.js → index-Bt4Ob1Fi.esm.js} +2 -2
  12. package/dist/chunks/{index-Ghl9JrXJ.esm.js.map → index-Bt4Ob1Fi.esm.js.map} +1 -1
  13. package/dist/chunks/{index-BpR0FMss.esm.js → index-CVHrQ1WC.esm.js} +2 -2
  14. package/dist/chunks/{index-BpR0FMss.esm.js.map → index-CVHrQ1WC.esm.js.map} +1 -1
  15. package/dist/chunks/{index-BXivnoQL.esm.js → index-Di1IwSgk.esm.js} +2 -2
  16. package/dist/chunks/{index-BXivnoQL.esm.js.map → index-Di1IwSgk.esm.js.map} +1 -1
  17. package/dist/chunks/{promo-pill-label-F6oSUeZ_.esm.js → promo-pill-label-D-VXaB27.esm.js} +2 -2
  18. package/dist/chunks/{promo-pill-label-F6oSUeZ_.esm.js.map → promo-pill-label-D-VXaB27.esm.js.map} +1 -1
  19. package/dist/chunks/{share-button-C_qDR7Rw.esm.js → share-button-DFuEWa2h.esm.js} +2 -2
  20. package/dist/chunks/{share-button-C_qDR7Rw.esm.js.map → share-button-DFuEWa2h.esm.js.map} +1 -1
  21. package/dist/chunks/{share-button-Cle5Uexn.esm.js → share-button-o8IBYAxH.esm.js} +2 -2
  22. package/dist/chunks/{share-button-Cle5Uexn.esm.js.map → share-button-o8IBYAxH.esm.js.map} +1 -1
  23. package/dist/components/community-impact.esm.js +13 -13
  24. package/dist/components/community-impact.esm.js.map +1 -1
  25. package/dist/components/community-impact.js +13 -13
  26. package/dist/components/community-impact.js.map +1 -1
  27. package/dist/components/cumulative-impact.esm.js +1 -1
  28. package/dist/components/cumulative-impact.js +1 -1
  29. package/dist/components/impact-overview.esm.js +1 -1
  30. package/dist/components/impact-overview.js +1 -1
  31. package/dist/components/index.esm.js +1 -1
  32. package/dist/components/index.js +1 -1
  33. package/dist/components/post-purchase.esm.js +1 -1
  34. package/dist/components/post-purchase.js +1 -1
  35. package/dist/components/product-details-page.esm.js +1 -1
  36. package/dist/components/product-details-page.js +1 -1
  37. package/dist/components/redeem-transaction.esm.js +1 -1
  38. package/dist/components/redeem-transaction.js +1 -1
  39. package/dist/components/select-nonprofit.esm.js +1 -1
  40. package/dist/components/select-nonprofit.js +1 -1
  41. package/dist/components/select-subscription-nonprofit.esm.js +1 -1
  42. package/dist/components/select-subscription-nonprofit.js +1 -1
  43. package/dist/components/shopify.esm.js +1 -1
  44. package/dist/components/shopify.js +1 -1
  45. package/dist/components/social-share.esm.js +1 -1
  46. package/dist/components/social-share.js +1 -1
  47. package/dist/components/subscriber-select-nonprofit.esm.js +1 -1
  48. package/dist/components/subscriber-select-nonprofit.js +1 -1
  49. package/dist/components/subscription-impact.esm.js +1 -1
  50. package/dist/components/subscription-impact.js +1 -1
  51. package/dist/components/subscription-management.esm.js +1 -1
  52. package/dist/components/subscription-management.js +1 -1
  53. package/dist/index.esm.js +1 -1
  54. package/dist/index.js +1 -1
  55. package/dist/integrations/beam.esm.js +1 -1
  56. package/dist/integrations/beam.js +1 -1
  57. package/dist/integrations/cart.esm.js +1 -1
  58. package/dist/integrations/cart.js +1 -1
  59. package/dist/integrations/logs.esm.js +1 -1
  60. package/dist/integrations/logs.js +1 -1
  61. package/dist/integrations/shopify-order.esm.js +1 -1
  62. package/dist/integrations/shopify-order.js +1 -1
  63. package/dist/integrations/shopify.esm.js +1 -1
  64. package/dist/integrations/shopify.js +1 -1
  65. package/dist/integrations/statsig.esm.js +1 -1
  66. package/dist/integrations/statsig.js +1 -1
  67. package/dist/react/community-impact.esm.js +1 -1
  68. package/dist/react/community-impact.js +1 -1
  69. package/dist/react/cumulative-impact.esm.js +1 -1
  70. package/dist/react/cumulative-impact.js +1 -1
  71. package/dist/react/impact-overview.esm.js +1 -1
  72. package/dist/react/impact-overview.js +1 -1
  73. package/dist/react/index.esm.js +1 -1
  74. package/dist/react/index.js +1 -1
  75. package/dist/react/post-purchase.esm.js +1 -1
  76. package/dist/react/post-purchase.js +1 -1
  77. package/dist/react/product-details-page.esm.js +1 -1
  78. package/dist/react/product-details-page.js +1 -1
  79. package/dist/react/redeem-transaction.esm.js +1 -1
  80. package/dist/react/redeem-transaction.js +1 -1
  81. package/dist/react/select-nonprofit.esm.js +1 -1
  82. package/dist/react/select-nonprofit.js +1 -1
  83. package/dist/react/select-subscription-nonprofit.esm.js +1 -1
  84. package/dist/react/select-subscription-nonprofit.js +1 -1
  85. package/dist/react/social-share.esm.js +1 -1
  86. package/dist/react/social-share.js +1 -1
  87. package/dist/react/subscriber-select-nonprofit.esm.js +1 -1
  88. package/dist/react/subscriber-select-nonprofit.js +1 -1
  89. package/dist/react/subscription-impact.esm.js +1 -1
  90. package/dist/react/subscription-impact.js +1 -1
  91. package/dist/react/subscription-management.esm.js +1 -1
  92. package/dist/react/subscription-management.js +1 -1
  93. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index-DJ5OwAaV.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\nexport const updateTransaction = makeOpenApiMethod(\"/v4/transaction/{transactionId}/update\", \"post\", 200);\n","import { html } from \"lit\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nexport const _radioButton = ({ height = \"1em\", width = \"1em\" } = {}) => 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, LOCAL_STORAGE_KEYS, SUPPORTED_LANGUAGES, WIDGET_NAMES } from \"../../api-sdk/constants\";\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(LOCAL_STORAGE_KEYS.CHAIN_NONPROFITS, {\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 }>(LOCAL_STORAGE_KEYS.CHAIN_NONPROFITS) || {};\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:\n background-color 0.2s,\n border-color 0.2s,\n 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:\n border-color 0.2s,\n background-color 0.2s,\n 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:\n background-color 0.2s,\n color 0.2s,\n 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=\"\" data-speedsize-ignore=\"true\" 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 data-speedsize-ignore=\"true\"\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","updateTransaction","_radioButton","height","width","html","styleMap","strings","donationPercentage","BeamRedeemTransaction","LitElement","DEFAULT_BASE_URL","MissingConfig","res","postChainEligibleNonprofitsForCart","WIDGET_NAMES","LOCAL_STORAGE_KEYS","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":"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"}
1
+ {"version":3,"file":"index-BOHlIBDq.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\nexport const updateTransaction = makeOpenApiMethod(\"/v4/transaction/{transactionId}/update\", \"post\", 200);\n","import { html } from \"lit\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nexport const _radioButton = ({ height = \"1em\", width = \"1em\" } = {}) => 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, LOCAL_STORAGE_KEYS, SUPPORTED_LANGUAGES, WIDGET_NAMES } from \"../../api-sdk/constants\";\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(LOCAL_STORAGE_KEYS.CHAIN_NONPROFITS, {\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 }>(LOCAL_STORAGE_KEYS.CHAIN_NONPROFITS) || {};\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:\n background-color 0.2s,\n border-color 0.2s,\n 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:\n border-color 0.2s,\n background-color 0.2s,\n 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:\n background-color 0.2s,\n color 0.2s,\n 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=\"\" data-speedsize-ignore=\"true\" 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 data-speedsize-ignore=\"true\"\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","updateTransaction","_radioButton","height","width","html","styleMap","strings","donationPercentage","BeamRedeemTransaction","LitElement","DEFAULT_BASE_URL","MissingConfig","res","postChainEligibleNonprofitsForCart","WIDGET_NAMES","LOCAL_STORAGE_KEYS","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":"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"}
@@ -1,4 +1,4 @@
1
- import{n as o,r as c,a as K,b as g}from"./lit-BEag9MFp.esm.js";import{D as v,z as P,h as B,_ as M,$ as F,C as N,R as x,g as y,l as L,n as w,a1 as W,L as T,a2 as J,Y as z,u as k,F as q,P as Y,w as j}from"./utils-C5hmbxa4.esm.js";import{c as G,d as V,e as H}from"./css-card-grid-CiqEjkwR.esm.js";import{B as U,A as Q,c as X}from"./index-BpR0FMss.esm.js";import{p as Z,u as tt}from"./index-DJ5OwAaV.esm.js";import"../components/impact-overview.esm.js";var et=Object.defineProperty,e=(h,s,n,m)=>{for(var d=void 0,p=h.length-1,u;p>=0;p--)(u=h[p])&&(d=u(s,n,d)||d);return d&&et(s,n,d),d};const A=["baseUrl","apiKey","orderId","cartTotal","currencyCode","lang"],ot=["storeId","postalCode","countryCode","cart","discountCodes","promoCodes","htmlPromoCodes","email","partnerUserId","remoteSessionId"];class t extends K{constructor(){super(...arguments),this.baseUrl=v,this.currencyCode="USD",this.lang="en",this.debug=!1,this.activeWidget=null,this.nonprofitId=null,this.selectionId=null,this.cartId=null,this.beamCartId=null,this.userId=null,this.transactionId=null,this.excludeDonationsForRecurringTransactions=!1,this.creationMethod="",this.orderProcessedAt="",this.draftConfig=!1,this.localStorage=P(this),this.handlePostTransaction=async()=>{this.enforceConfig(),this.updateComponentState();const s=this.getManualPromoCodes(),n=B(s.map(a=>({value:a})),this.apiKey),m=M(),d={unvalidatedPromoCodes:F(s.map(a=>({value:a}))),validatedPromoCodes:m?.validatedPromoCodes??[]},p=n??d,u=p&&!N(p),I=this.remoteSessionId??x({apiKey:this.apiKey})??y("beam_statsig_session_id"),i=await Z({baseUrl:this.baseUrl,apiRoot:"/api",headers:{authorization:`Api-Key ${this.apiKey}`},requestBody:{selectionId:this.selectionId||void 0,cartId:this.cartId||void 0,beamCartId:this.beamCartId||void 0,storeId:this.storeId,orderId:this.orderId,cartTotal:this.cartTotal,email:this.email,partnerUserId:this.partnerUserId,currencyCode:this.currencyCode,postalCode:this.postalCode,countryCode:this.countryCode,cart:this.cart,...u&&{promos:p},discountCodes:this.discountCodes,orderProcessedAt:new Date().toISOString(),...I&&{remoteSessionId:I}}});let l=i;if(!i.transactionCreated&&!i.selectionId&&this.selectionId)try{const a=await tt({baseUrl:this.baseUrl,apiRoot:"/api",headers:{authorization:`Api-Key ${this.apiKey}`},pathParams:{transactionId:i.transactionId},requestBody:{selectionId:this.selectionId}});l=a,this.selectionId=a.selectionId??this.selectionId,this.localStorage.removeItem("transaction")}catch(a){L.warn(new w("Failed to attach selectionId to existing transaction via update endpoint",{cause:a}),{transactionId:i.transactionId,selectionId:this.selectionId})}this.transactionId=l.transactionId,this.userId=l.beamUserId,this.nonprofitId=l.nonprofitId,this.excludeDonationsForRecurringTransactions=!!i.reportSettings?.excludeRecurringDonations,this.creationMethod=l.creationMethod||"",this.orderProcessedAt=l.timestamp;const C=!!this.nonprofitId;return this.activeWidget=C?"impact-overview":"redeem-transaction",i.transactionCreated&&(["transaction","cart",W,T.NONPROFIT,T.NONPROFIT_SELECTED_AT].forEach(a=>{this.localStorage.removeItem(a)}),[{name:U,path:"/",domain:this.domain},{name:J,path:"/",domain:this.domain}].forEach(a=>z(a)),dispatchEvent(new k({transactionId:i.transactionId,orderId:this.orderId,cartTotal:this.cartTotal,currencyCode:this.currencyCode,selectionId:this.selectionId??null,cartId:this.cartId,beamCartId:this.beamCartId,storeId:this.storeId??null,postalCode:this.postalCode??null,countryCode:this.countryCode??null,remoteSessionId:this.remoteSessionId??null,transactionNonprofitId:i.nonprofitId,orderProcessedAt:i.timestamp}))),l},this.transactionDataController=new Q(this,this.handlePostTransaction)}get parsedPromoCodes(){return q(this.htmlPromoCodes)}updateComponentState(){this.localStorage.getItem("transaction")?.toLocaleLowerCase()==="undefined"&&this.localStorage.removeItem("transaction"),this.selectionId=this.selectionId||this.localStorage.getItem("transaction")||null,this.cartId=this.cartId||this.localStorage.getItemJson("cart")?.cartId||null,this.beamCartId=this.beamCartId||this.localStorage.getItemJson("cart")?.beamCartId||y(U)||null,this.selectionId&&this.nonprofitId&&(this.activeWidget="impact-overview")}firstUpdated(s){this.enforceConfig(),this.updateComponentState()}async updated(s){[...A,...ot].some(n=>s.has(n))&&await this.transactionDataController.exec()}enforceConfig(){if(H(A,this),!this.email&&!this.partnerUserId)throw new Y([this.email?"":"email",this.partnerUserId?"":"partnerUserId"].filter(Boolean),"At least one of [email, partnerUserId] must be provided")}getManualPromoCodes(){return this.parsedPromoCodes?.length?this.parsedPromoCodes:this.promoCodes?.length?this.promoCodes:[]}render(){const s=Date.now()-new Date(this.orderProcessedAt).getTime()<2592e6;return this.transactionDataController.loading?"":this.transactionDataController.error?this.debug?X({error:this.transactionDataController.error}):"":this.excludeDonationsForRecurringTransactions&&this.creationMethod==="recurring"?g``:this.activeWidget==="redeem-transaction"&&s?g`
1
+ import{n as o,r as c,a as K,b as g}from"./lit-BEag9MFp.esm.js";import{D as v,z as P,h as B,_ as M,$ as F,C as N,R as x,g as y,l as L,n as w,a1 as W,L as T,a2 as J,Y as z,u as k,F as q,P as Y,w as j}from"./utils-C5hmbxa4.esm.js";import{c as G,d as V,e as H}from"./css-card-grid-CiqEjkwR.esm.js";import{B as U,A as Q,c as X}from"./index-CVHrQ1WC.esm.js";import{p as Z,u as tt}from"./index-BOHlIBDq.esm.js";import"../components/impact-overview.esm.js";var et=Object.defineProperty,e=(h,s,n,m)=>{for(var d=void 0,p=h.length-1,u;p>=0;p--)(u=h[p])&&(d=u(s,n,d)||d);return d&&et(s,n,d),d};const A=["baseUrl","apiKey","orderId","cartTotal","currencyCode","lang"],ot=["storeId","postalCode","countryCode","cart","discountCodes","promoCodes","htmlPromoCodes","email","partnerUserId","remoteSessionId"];class t extends K{constructor(){super(...arguments),this.baseUrl=v,this.currencyCode="USD",this.lang="en",this.debug=!1,this.activeWidget=null,this.nonprofitId=null,this.selectionId=null,this.cartId=null,this.beamCartId=null,this.userId=null,this.transactionId=null,this.excludeDonationsForRecurringTransactions=!1,this.creationMethod="",this.orderProcessedAt="",this.draftConfig=!1,this.localStorage=P(this),this.handlePostTransaction=async()=>{this.enforceConfig(),this.updateComponentState();const s=this.getManualPromoCodes(),n=B(s.map(a=>({value:a})),this.apiKey),m=M(),d={unvalidatedPromoCodes:F(s.map(a=>({value:a}))),validatedPromoCodes:m?.validatedPromoCodes??[]},p=n??d,u=p&&!N(p),I=this.remoteSessionId??x({apiKey:this.apiKey})??y("beam_statsig_session_id"),i=await Z({baseUrl:this.baseUrl,apiRoot:"/api",headers:{authorization:`Api-Key ${this.apiKey}`},requestBody:{selectionId:this.selectionId||void 0,cartId:this.cartId||void 0,beamCartId:this.beamCartId||void 0,storeId:this.storeId,orderId:this.orderId,cartTotal:this.cartTotal,email:this.email,partnerUserId:this.partnerUserId,currencyCode:this.currencyCode,postalCode:this.postalCode,countryCode:this.countryCode,cart:this.cart,...u&&{promos:p},discountCodes:this.discountCodes,orderProcessedAt:new Date().toISOString(),...I&&{remoteSessionId:I}}});let l=i;if(!i.transactionCreated&&!i.selectionId&&this.selectionId)try{const a=await tt({baseUrl:this.baseUrl,apiRoot:"/api",headers:{authorization:`Api-Key ${this.apiKey}`},pathParams:{transactionId:i.transactionId},requestBody:{selectionId:this.selectionId}});l=a,this.selectionId=a.selectionId??this.selectionId,this.localStorage.removeItem("transaction")}catch(a){L.warn(new w("Failed to attach selectionId to existing transaction via update endpoint",{cause:a}),{transactionId:i.transactionId,selectionId:this.selectionId})}this.transactionId=l.transactionId,this.userId=l.beamUserId,this.nonprofitId=l.nonprofitId,this.excludeDonationsForRecurringTransactions=!!i.reportSettings?.excludeRecurringDonations,this.creationMethod=l.creationMethod||"",this.orderProcessedAt=l.timestamp;const C=!!this.nonprofitId;return this.activeWidget=C?"impact-overview":"redeem-transaction",i.transactionCreated&&(["transaction","cart",W,T.NONPROFIT,T.NONPROFIT_SELECTED_AT].forEach(a=>{this.localStorage.removeItem(a)}),[{name:U,path:"/",domain:this.domain},{name:J,path:"/",domain:this.domain}].forEach(a=>z(a)),dispatchEvent(new k({transactionId:i.transactionId,orderId:this.orderId,cartTotal:this.cartTotal,currencyCode:this.currencyCode,selectionId:this.selectionId??null,cartId:this.cartId,beamCartId:this.beamCartId,storeId:this.storeId??null,postalCode:this.postalCode??null,countryCode:this.countryCode??null,remoteSessionId:this.remoteSessionId??null,transactionNonprofitId:i.nonprofitId,orderProcessedAt:i.timestamp}))),l},this.transactionDataController=new Q(this,this.handlePostTransaction)}get parsedPromoCodes(){return q(this.htmlPromoCodes)}updateComponentState(){this.localStorage.getItem("transaction")?.toLocaleLowerCase()==="undefined"&&this.localStorage.removeItem("transaction"),this.selectionId=this.selectionId||this.localStorage.getItem("transaction")||null,this.cartId=this.cartId||this.localStorage.getItemJson("cart")?.cartId||null,this.beamCartId=this.beamCartId||this.localStorage.getItemJson("cart")?.beamCartId||y(U)||null,this.selectionId&&this.nonprofitId&&(this.activeWidget="impact-overview")}firstUpdated(s){this.enforceConfig(),this.updateComponentState()}async updated(s){[...A,...ot].some(n=>s.has(n))&&await this.transactionDataController.exec()}enforceConfig(){if(H(A,this),!this.email&&!this.partnerUserId)throw new Y([this.email?"":"email",this.partnerUserId?"":"partnerUserId"].filter(Boolean),"At least one of [email, partnerUserId] must be provided")}getManualPromoCodes(){return this.parsedPromoCodes?.length?this.parsedPromoCodes:this.promoCodes?.length?this.promoCodes:[]}render(){const s=Date.now()-new Date(this.orderProcessedAt).getTime()<2592e6;return this.transactionDataController.loading?"":this.transactionDataController.error?this.debug?X({error:this.transactionDataController.error}):"":this.excludeDonationsForRecurringTransactions&&this.creationMethod==="recurring"?g``:this.activeWidget==="redeem-transaction"&&s?g`
2
2
  <beam-redeem-transaction
3
3
  part="redeem-transaction"
4
4
  baseUrl="${this.baseUrl}"
@@ -29,4 +29,4 @@ import{n as o,r as c,a as K,b as g}from"./lit-BEag9MFp.esm.js";import{D as v,z a
29
29
  ?debug="${this.debug}"
30
30
  ></beam-impact-overview>
31
31
  `:""}}t.tagName="beam-post-purchase",t.styles=[G],e([o({type:String})],t.prototype,"baseUrl"),e([o({type:String})],t.prototype,"apiKey"),e([o({type:Number,reflect:!0})],t.prototype,"storeId"),e([o({type:String})],t.prototype,"postalCode"),e([o({type:String})],t.prototype,"countryCode"),e([o({type:String})],t.prototype,"orderId"),e([o({type:String})],t.prototype,"email"),e([o({type:String})],t.prototype,"partnerUserId"),e([o({type:Number})],t.prototype,"cartTotal"),e([o({type:String})],t.prototype,"currencyCode"),e([o({type:String})],t.prototype,"lang"),e([o({type:Object})],t.prototype,"cart"),e([o({type:Array})],t.prototype,"discountCodes"),e([o({type:Array})],t.prototype,"promoCodes"),e([o({type:String})],t.prototype,"htmlPromoCodes"),e([o({type:String})],t.prototype,"domain"),e([o({type:String})],t.prototype,"remoteSessionId"),e([o({type:Boolean})],t.prototype,"debug"),e([c()],t.prototype,"activeWidget"),e([c()],t.prototype,"nonprofitId"),e([c()],t.prototype,"selectionId"),e([c()],t.prototype,"cartId"),e([c()],t.prototype,"beamCartId"),e([c()],t.prototype,"userId"),e([c()],t.prototype,"transactionId"),e([c()],t.prototype,"excludeDonationsForRecurringTransactions"),e([c()],t.prototype,"creationMethod"),e([c()],t.prototype,"orderProcessedAt"),e([o({type:Boolean})],t.prototype,"draftConfig"),V(t);async function rt({parentSelector:h=".step__sections",apiKey:s,baseUrl:n=v,storeId:m,postalCode:d,discountCodes:p,countryCode:u,orderId:I,email:i,cartTotal:l,cart:C,promoCodes:a,htmlPromoCodes:$,currencyCode:E="USD",domain:O,lang:D="en",debug:_=!1}){const f=document.querySelector(h)||await j(h);if(!f)throw new w(`Timed out waiting for selector '${h}'. Could not render Beam post-purchase widget.`);const S=await y("cart");if(S){const b=P({apiKey:s}),R=b.getItemJson("cart")||{};b.setItemJson("cart",{...R,cartId:S})}const r=document.createElement("beam-post-purchase");r.apiKey=s,r.baseUrl=n,r.storeId=m,r.postalCode=d,r.countryCode=u,r.orderId=String(I),r.email=i,r.cartTotal=l,r.cart=C,r.promoCodes=a,r.htmlPromoCodes=$,r.discountCodes=p,r.currencyCode=E,r.domain=O,r.lang=D,r.debug=_,f.appendChild(r)}export{t as B,rt as s};
32
- //# sourceMappingURL=index-C03QP2W-.esm.js.map
32
+ //# sourceMappingURL=index-Bc_hD09J.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-C03QP2W-.esm.js","sources":["../../src/components/post-purchase/index.ts","../../src/integrations/shopify-order/order.ts"],"sourcesContent":["import { html, LitElement, PropertyValues } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { state } from \"lit/decorators/state.js\";\nimport { BeamError, MissingConfig } from \"../../utils/beam-errors\";\nimport { deleteCookieValue, getCookieValue } from \"../../utils/cookies\";\nimport { cssReset } from \"../../shared/css-reset\";\nimport { defineCustomElement } from \"../../shared/defineCustomElement\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { AsyncController } from \"../../shared/controllers/async-controller\";\nimport { _errorMessage } from \"../../shared/fragments/error-message-template\";\nimport { enforceConfig } from \"../../shared/enforce-config\";\nimport { LANGUAGES } from \"../../api-sdk/types\";\nimport { DEFAULT_BASE_URL, LOCAL_STORAGE_KEYS } from \"../../api-sdk/constants\";\nimport { postTransaction, updateTransaction } from \"../../api-sdk/v4/routes\";\nimport \"../redeem-transaction\";\nimport \"../impact-overview\";\nimport { BEAM_CART_COOKIE_NAME, TBeamCartLocalStorage, TCart } from \"../../shared/cart-contents\";\nimport { BeamNonprofitSelectEvent, BeamOrderCreatedEvent } from \"../../utils/events\";\nimport {\n isEmptyPromoData,\n parseJsonStringArray,\n formatStoreAndReturnPromoCodes,\n getAllPromoCodesFromCookie,\n mapToUnvalidatedPromoCodes,\n} from \"../../utils/promoManager\";\nimport { PROMO_CODES_COOKIE_NAME, PROMO_LOCAL_STORAGE_KEY, TPromoCodeRequest } from \"../../shared/promo-types\";\nimport { getRemoteSession } from \"../../utils/remote-session\";\nimport { logger } from \"../../utils/logger\";\n\nconst REQUIRED_DATA_PROPS = [\"baseUrl\", \"apiKey\", \"orderId\", \"cartTotal\", \"currencyCode\", \"lang\"];\nconst OPTIONAL_DATA_PROPS = [\n \"storeId\",\n \"postalCode\",\n \"countryCode\",\n \"cart\",\n \"discountCodes\",\n \"promoCodes\",\n \"htmlPromoCodes\",\n \"email\",\n \"partnerUserId\",\n \"remoteSessionId\",\n];\n\nexport class BeamPostPurchase extends LitElement {\n static tagName = \"beam-post-purchase\";\n\n @property({ type: String })\n public baseUrl: string = DEFAULT_BASE_URL;\n\n @property({ type: String })\n public apiKey!: string;\n\n @property({ type: Number, reflect: true })\n public storeId?: number; // Either storeId or postalCode, countryCode must be provided\n\n @property({ type: String })\n public postalCode?: string;\n\n @property({ type: String })\n public countryCode?: string;\n\n @property({ type: String })\n public orderId!: string;\n\n /**\n * Either email or partnerUserId is required\n */\n @property({ type: String })\n public email?: string;\n\n /**\n * Either email or partnerUserId is required\n */\n @property({ type: String })\n public partnerUserId?: string;\n\n @property({ type: Number })\n public cartTotal!: number;\n\n @property({ type: String })\n public currencyCode = \"USD\";\n\n @property({ type: String })\n public lang: LANGUAGES = \"en\";\n\n @property({ type: Object })\n public cart?: TCart;\n\n /**\n * @deprecated Use `promoCodes` instead. `discountCodes` is retained for backward compatibility\n */\n @property({ type: Array })\n public discountCodes?: string[];\n\n @property({ type: Array })\n public promoCodes?: string[];\n\n @property({ type: String })\n public htmlPromoCodes?: string;\n\n @property({ type: String })\n public domain?: string;\n\n @property({ type: String })\n public remoteSessionId?: string;\n\n @property({ type: Boolean })\n public debug = false;\n\n @state() private activeWidget: \"redeem-transaction\" | \"impact-overview\" | null = null; // wait for postTransaction\n @state() private nonprofitId: number | null = null; // from localStorage or redeem-transaction result\n @state() private selectionId: string | null = null; // from localStorage\n @state() private cartId: string | null = null; // from localStorage, external cart ID\n @state() private beamCartId: string | null = null; // from cookie, Beam cart ID\n @state() private userId: string | null = null; // from postTransaction\n @state() private transactionId: string | null = null; // from postTransaction\n @state() private excludeDonationsForRecurringTransactions = false;\n @state() private creationMethod = \"\";\n @state() private orderProcessedAt = \"\";\n @property({ type: Boolean }) public draftConfig = false;\n\n private localStorage = createScopedLocalStorage(this);\n\n get parsedPromoCodes(): string[] {\n return parseJsonStringArray(this.htmlPromoCodes);\n }\n\n updateComponentState() {\n // Delete selectionId if it was saved with an invalid string (bug introduced v1.54.0)\n if (this.localStorage.getItem(\"transaction\")?.toLocaleLowerCase() === \"undefined\") {\n this.localStorage.removeItem(\"transaction\");\n }\n\n this.selectionId = this.selectionId || this.localStorage.getItem(\"transaction\") || null;\n this.cartId = this.cartId || this.localStorage.getItemJson<TBeamCartLocalStorage>(\"cart\")?.cartId || null;\n // Reading beamCartId from cookies instead of localStorage allows it to work across subdomains\n this.beamCartId =\n this.beamCartId ||\n this.localStorage.getItemJson<TBeamCartLocalStorage>(\"cart\")?.beamCartId ||\n getCookieValue(BEAM_CART_COOKIE_NAME) ||\n null;\n\n if (this.selectionId && this.nonprofitId) {\n this.activeWidget = \"impact-overview\";\n }\n }\n\n firstUpdated(_changedProperties: PropertyValues) {\n this.enforceConfig();\n this.updateComponentState();\n }\n\n async updated(previousPropertyValues: PropertyValues) {\n // Also fires on first load as props go from undefined => value\n const refreshOnChangeProps = [...REQUIRED_DATA_PROPS, ...OPTIONAL_DATA_PROPS];\n if (refreshOnChangeProps.some((p) => previousPropertyValues.has(p))) {\n await this.transactionDataController.exec();\n }\n }\n\n enforceConfig() {\n enforceConfig(REQUIRED_DATA_PROPS, this);\n if (!this.email && !this.partnerUserId) {\n throw new MissingConfig(\n [this.email ? \"\" : \"email\", this.partnerUserId ? \"\" : \"partnerUserId\"].filter(Boolean),\n \"At least one of [email, partnerUserId] must be provided\",\n );\n }\n }\n\n private getManualPromoCodes(): string[] {\n if (this.parsedPromoCodes?.length) {\n return this.parsedPromoCodes;\n }\n if (this.promoCodes?.length) {\n return this.promoCodes;\n }\n return [];\n }\n\n handlePostTransaction = async () => {\n this.enforceConfig();\n this.updateComponentState();\n\n const manualPromoCodes = this.getManualPromoCodes();\n const formattedPromosFromLocalStorage = formatStoreAndReturnPromoCodes(\n manualPromoCodes.map((code) => ({ value: code })),\n this.apiKey,\n );\n\n const promoCookieData = getAllPromoCodesFromCookie();\n const formattedPromosFromCookie: TPromoCodeRequest = {\n unvalidatedPromoCodes: mapToUnvalidatedPromoCodes(manualPromoCodes.map((code) => ({ value: code }))),\n validatedPromoCodes: promoCookieData?.validatedPromoCodes ?? [],\n };\n\n const formattedPromos = formattedPromosFromLocalStorage ?? formattedPromosFromCookie;\n\n const shouldSendPromos = formattedPromos && !isEmptyPromoData(formattedPromos);\n const remoteSessionId =\n this.remoteSessionId ?? getRemoteSession({ apiKey: this.apiKey }) ?? getCookieValue(\"beam_statsig_session_id\");\n const result = await postTransaction({\n baseUrl: this.baseUrl,\n apiRoot: \"/api\",\n headers: {\n authorization: `Api-Key ${this.apiKey}`,\n },\n requestBody: {\n selectionId: this.selectionId || undefined,\n cartId: this.cartId || undefined,\n beamCartId: this.beamCartId || undefined,\n storeId: this.storeId,\n orderId: this.orderId,\n cartTotal: this.cartTotal,\n email: this.email, // One or both of email & partnerUserId should be defined\n partnerUserId: this.partnerUserId, // One or both of email & partnerUserId should be defined\n currencyCode: this.currencyCode,\n postalCode: this.postalCode,\n countryCode: this.countryCode,\n cart: this.cart,\n ...(shouldSendPromos && { promos: formattedPromos }),\n discountCodes: this.discountCodes,\n orderProcessedAt: new Date().toISOString(),\n ...(remoteSessionId && { remoteSessionId }),\n },\n });\n\n let effectiveResult: Awaited<ReturnType<typeof postTransaction>> = result;\n const shouldAttachSelectionId = !result.transactionCreated && !result.selectionId && Boolean(this.selectionId);\n\n if (shouldAttachSelectionId) {\n try {\n const updateResult = await updateTransaction({\n baseUrl: this.baseUrl,\n apiRoot: \"/api\",\n headers: { authorization: `Api-Key ${this.apiKey}` },\n pathParams: { transactionId: result.transactionId },\n requestBody: { selectionId: this.selectionId as string },\n });\n effectiveResult = updateResult;\n this.selectionId = updateResult.selectionId ?? this.selectionId;\n // Clear the pending selectionId now that it's durably attached server-side,\n // so a future unrelated order doesn't try to reattach it (mirrors the\n // transactionCreated cleanup below).\n this.localStorage.removeItem(\"transaction\");\n } catch (err) {\n logger.warn(\n new BeamError(\"Failed to attach selectionId to existing transaction via update endpoint\", { cause: err }),\n { transactionId: result.transactionId, selectionId: this.selectionId },\n );\n // Fail softly: effectiveResult stays = result, component renders as it does today\n }\n }\n\n this.transactionId = effectiveResult.transactionId;\n this.userId = effectiveResult.beamUserId;\n this.nonprofitId = effectiveResult.nonprofitId;\n // reportSettings is absent from the update endpoint's response, so this always\n // sources from the original postTransaction result, never effectiveResult.\n this.excludeDonationsForRecurringTransactions = Boolean(result.reportSettings?.excludeRecurringDonations);\n this.creationMethod = effectiveResult.creationMethod || \"\";\n this.orderProcessedAt = effectiveResult.timestamp;\n\n const isTransactionRedeemed = !!this.nonprofitId;\n this.activeWidget = isTransactionRedeemed ? \"impact-overview\" : \"redeem-transaction\";\n\n // Emit order created event only when order is registered with Beam for the first time\n if (result.transactionCreated) {\n const localStorageKeys = [\n \"transaction\",\n \"cart\",\n PROMO_LOCAL_STORAGE_KEY,\n LOCAL_STORAGE_KEYS.NONPROFIT,\n LOCAL_STORAGE_KEYS.NONPROFIT_SELECTED_AT,\n ];\n localStorageKeys.forEach((key) => {\n this.localStorage.removeItem(key);\n });\n const cookieConfigs = [\n { name: BEAM_CART_COOKIE_NAME, path: \"/\", domain: this.domain },\n { name: PROMO_CODES_COOKIE_NAME, path: \"/\", domain: this.domain },\n ];\n\n cookieConfigs.forEach((config) => deleteCookieValue(config));\n\n // Emit order created event only when order is registered with Beam for the first time\n dispatchEvent(\n new BeamOrderCreatedEvent({\n transactionId: result.transactionId,\n orderId: this.orderId,\n cartTotal: this.cartTotal,\n currencyCode: this.currencyCode,\n selectionId: this.selectionId ?? null,\n cartId: this.cartId,\n beamCartId: this.beamCartId,\n storeId: this.storeId ?? null,\n postalCode: this.postalCode ?? null,\n countryCode: this.countryCode ?? null,\n remoteSessionId: this.remoteSessionId ?? null,\n transactionNonprofitId: result.nonprofitId,\n orderProcessedAt: result.timestamp,\n }),\n );\n }\n return effectiveResult;\n };\n\n private transactionDataController = new AsyncController<typeof this.handlePostTransaction>(\n this,\n this.handlePostTransaction,\n );\n\n render() {\n const THIRTY_DAYS_IN_MS = 30 * 24 * 60 * 60 * 1000;\n const transactionIsLessThan30DaysOld = Date.now() - new Date(this.orderProcessedAt).getTime() < THIRTY_DAYS_IN_MS;\n\n if (this.transactionDataController.loading) {\n return \"\";\n }\n if (this.transactionDataController.error) {\n if (this.debug) {\n return _errorMessage({ error: this.transactionDataController.error });\n }\n return \"\";\n }\n if (this.excludeDonationsForRecurringTransactions && this.creationMethod === \"recurring\") {\n return html``;\n }\n if (this.activeWidget === \"redeem-transaction\" && transactionIsLessThan30DaysOld) {\n return html`\n <beam-redeem-transaction\n part=\"redeem-transaction\"\n baseUrl=\"${this.baseUrl}\"\n apiKey=\"${this.apiKey}\"\n storeId=\"${this.storeId}\"\n postalCode=\"${this.postalCode}\"\n countryCode=\"${this.countryCode}\"\n transactionId=\"${this.transactionId}\"\n cart=\"${JSON.stringify(this.cart)}\"\n lang=\"${this.lang}\"\n excludeDonationsForRecurringTransactions=\"${this.excludeDonationsForRecurringTransactions}\"\n ?draftConfig=\"${this.draftConfig}\"\n ?debug=\"${this.debug}\"\n @beamnonprofitselect=\"${(event: Event) => {\n if (!(event instanceof CustomEvent)) return; // TS guard\n const { selectedNonprofitId } = (event as BeamNonprofitSelectEvent).detail;\n this.nonprofitId = selectedNonprofitId ?? null;\n this.activeWidget = \"impact-overview\";\n }}\"\n ></beam-redeem-transaction>\n `;\n }\n if (this.activeWidget === \"impact-overview\") {\n return html`\n <beam-impact-overview\n part=\"impact-overview\"\n storeId=\"${this.storeId}\"\n baseUrl=\"${this.baseUrl}\"\n apiKey=\"${this.apiKey}\"\n userId=\"${this.userId}\"\n nonprofitId=\"${this.nonprofitId}\"\n lang=\"${this.lang}\"\n discountCodes=\"${JSON.stringify(this.discountCodes)}\"\n transactionId=\"${this.transactionId}\"\n ?draftConfig=\"${this.draftConfig}\"\n ?debug=\"${this.debug}\"\n ></beam-impact-overview>\n `;\n }\n return \"\";\n }\n\n static styles = [cssReset];\n}\n\ndefineCustomElement(BeamPostPurchase);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"beam-post-purchase\": BeamPostPurchase;\n }\n}\n","/**\n * @deprecated (v1.57.0) Shopify no longer supports customized post-purchase pages directly without Extensibility apps\n */\nimport \"../../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":["v","t","m","p","r","a","o","d","l","REQUIRED_DATA_PROPS","OPTIONAL_DATA_PROPS","BeamPostPurchase","LitElement","DEFAULT_BASE_URL","createScopedLocalStorage","manualPromoCodes","formattedPromosFromLocalStorage","formatStoreAndReturnPromoCodes","code","promoCookieData","getAllPromoCodesFromCookie","formattedPromosFromCookie","mapToUnvalidatedPromoCodes","formattedPromos","shouldSendPromos","isEmptyPromoData","remoteSessionId","getRemoteSession","getCookieValue","result","postTransaction","effectiveResult","updateResult","updateTransaction","err","logger","BeamError","isTransactionRedeemed","PROMO_LOCAL_STORAGE_KEY","LOCAL_STORAGE_KEYS","key","BEAM_CART_COOKIE_NAME","PROMO_CODES_COOKIE_NAME","config","deleteCookieValue","BeamOrderCreatedEvent","AsyncController","parseJsonStringArray","_changedProperties","previousPropertyValues","enforceConfig","MissingConfig","transactionIsLessThan30DaysOld","_errorMessage","html","event","selectedNonprofitId","cssReset","__decorateClass","property","state","defineCustomElement","showBeamOrderPageWidgets","parentSelector","apiKey","baseUrl","storeId","postalCode","discountCodes","countryCode","orderId","email","cartTotal","cart","promoCodes","htmlPromoCodes","currencyCode","domain","lang","debug","parentElement","waitForElement","cartId","beamLocalStorage","existingValue","widget"],"mappings":"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"}
1
+ {"version":3,"file":"index-Bc_hD09J.esm.js","sources":["../../src/components/post-purchase/index.ts","../../src/integrations/shopify-order/order.ts"],"sourcesContent":["import { html, LitElement, PropertyValues } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { state } from \"lit/decorators/state.js\";\nimport { BeamError, MissingConfig } from \"../../utils/beam-errors\";\nimport { deleteCookieValue, getCookieValue } from \"../../utils/cookies\";\nimport { cssReset } from \"../../shared/css-reset\";\nimport { defineCustomElement } from \"../../shared/defineCustomElement\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { AsyncController } from \"../../shared/controllers/async-controller\";\nimport { _errorMessage } from \"../../shared/fragments/error-message-template\";\nimport { enforceConfig } from \"../../shared/enforce-config\";\nimport { LANGUAGES } from \"../../api-sdk/types\";\nimport { DEFAULT_BASE_URL, LOCAL_STORAGE_KEYS } from \"../../api-sdk/constants\";\nimport { postTransaction, updateTransaction } from \"../../api-sdk/v4/routes\";\nimport \"../redeem-transaction\";\nimport \"../impact-overview\";\nimport { BEAM_CART_COOKIE_NAME, TBeamCartLocalStorage, TCart } from \"../../shared/cart-contents\";\nimport { BeamNonprofitSelectEvent, BeamOrderCreatedEvent } from \"../../utils/events\";\nimport {\n isEmptyPromoData,\n parseJsonStringArray,\n formatStoreAndReturnPromoCodes,\n getAllPromoCodesFromCookie,\n mapToUnvalidatedPromoCodes,\n} from \"../../utils/promoManager\";\nimport { PROMO_CODES_COOKIE_NAME, PROMO_LOCAL_STORAGE_KEY, TPromoCodeRequest } from \"../../shared/promo-types\";\nimport { getRemoteSession } from \"../../utils/remote-session\";\nimport { logger } from \"../../utils/logger\";\n\nconst REQUIRED_DATA_PROPS = [\"baseUrl\", \"apiKey\", \"orderId\", \"cartTotal\", \"currencyCode\", \"lang\"];\nconst OPTIONAL_DATA_PROPS = [\n \"storeId\",\n \"postalCode\",\n \"countryCode\",\n \"cart\",\n \"discountCodes\",\n \"promoCodes\",\n \"htmlPromoCodes\",\n \"email\",\n \"partnerUserId\",\n \"remoteSessionId\",\n];\n\nexport class BeamPostPurchase extends LitElement {\n static tagName = \"beam-post-purchase\";\n\n @property({ type: String })\n public baseUrl: string = DEFAULT_BASE_URL;\n\n @property({ type: String })\n public apiKey!: string;\n\n @property({ type: Number, reflect: true })\n public storeId?: number; // Either storeId or postalCode, countryCode must be provided\n\n @property({ type: String })\n public postalCode?: string;\n\n @property({ type: String })\n public countryCode?: string;\n\n @property({ type: String })\n public orderId!: string;\n\n /**\n * Either email or partnerUserId is required\n */\n @property({ type: String })\n public email?: string;\n\n /**\n * Either email or partnerUserId is required\n */\n @property({ type: String })\n public partnerUserId?: string;\n\n @property({ type: Number })\n public cartTotal!: number;\n\n @property({ type: String })\n public currencyCode = \"USD\";\n\n @property({ type: String })\n public lang: LANGUAGES = \"en\";\n\n @property({ type: Object })\n public cart?: TCart;\n\n /**\n * @deprecated Use `promoCodes` instead. `discountCodes` is retained for backward compatibility\n */\n @property({ type: Array })\n public discountCodes?: string[];\n\n @property({ type: Array })\n public promoCodes?: string[];\n\n @property({ type: String })\n public htmlPromoCodes?: string;\n\n @property({ type: String })\n public domain?: string;\n\n @property({ type: String })\n public remoteSessionId?: string;\n\n @property({ type: Boolean })\n public debug = false;\n\n @state() private activeWidget: \"redeem-transaction\" | \"impact-overview\" | null = null; // wait for postTransaction\n @state() private nonprofitId: number | null = null; // from localStorage or redeem-transaction result\n @state() private selectionId: string | null = null; // from localStorage\n @state() private cartId: string | null = null; // from localStorage, external cart ID\n @state() private beamCartId: string | null = null; // from cookie, Beam cart ID\n @state() private userId: string | null = null; // from postTransaction\n @state() private transactionId: string | null = null; // from postTransaction\n @state() private excludeDonationsForRecurringTransactions = false;\n @state() private creationMethod = \"\";\n @state() private orderProcessedAt = \"\";\n @property({ type: Boolean }) public draftConfig = false;\n\n private localStorage = createScopedLocalStorage(this);\n\n get parsedPromoCodes(): string[] {\n return parseJsonStringArray(this.htmlPromoCodes);\n }\n\n updateComponentState() {\n // Delete selectionId if it was saved with an invalid string (bug introduced v1.54.0)\n if (this.localStorage.getItem(\"transaction\")?.toLocaleLowerCase() === \"undefined\") {\n this.localStorage.removeItem(\"transaction\");\n }\n\n this.selectionId = this.selectionId || this.localStorage.getItem(\"transaction\") || null;\n this.cartId = this.cartId || this.localStorage.getItemJson<TBeamCartLocalStorage>(\"cart\")?.cartId || null;\n // Reading beamCartId from cookies instead of localStorage allows it to work across subdomains\n this.beamCartId =\n this.beamCartId ||\n this.localStorage.getItemJson<TBeamCartLocalStorage>(\"cart\")?.beamCartId ||\n getCookieValue(BEAM_CART_COOKIE_NAME) ||\n null;\n\n if (this.selectionId && this.nonprofitId) {\n this.activeWidget = \"impact-overview\";\n }\n }\n\n firstUpdated(_changedProperties: PropertyValues) {\n this.enforceConfig();\n this.updateComponentState();\n }\n\n async updated(previousPropertyValues: PropertyValues) {\n // Also fires on first load as props go from undefined => value\n const refreshOnChangeProps = [...REQUIRED_DATA_PROPS, ...OPTIONAL_DATA_PROPS];\n if (refreshOnChangeProps.some((p) => previousPropertyValues.has(p))) {\n await this.transactionDataController.exec();\n }\n }\n\n enforceConfig() {\n enforceConfig(REQUIRED_DATA_PROPS, this);\n if (!this.email && !this.partnerUserId) {\n throw new MissingConfig(\n [this.email ? \"\" : \"email\", this.partnerUserId ? \"\" : \"partnerUserId\"].filter(Boolean),\n \"At least one of [email, partnerUserId] must be provided\",\n );\n }\n }\n\n private getManualPromoCodes(): string[] {\n if (this.parsedPromoCodes?.length) {\n return this.parsedPromoCodes;\n }\n if (this.promoCodes?.length) {\n return this.promoCodes;\n }\n return [];\n }\n\n handlePostTransaction = async () => {\n this.enforceConfig();\n this.updateComponentState();\n\n const manualPromoCodes = this.getManualPromoCodes();\n const formattedPromosFromLocalStorage = formatStoreAndReturnPromoCodes(\n manualPromoCodes.map((code) => ({ value: code })),\n this.apiKey,\n );\n\n const promoCookieData = getAllPromoCodesFromCookie();\n const formattedPromosFromCookie: TPromoCodeRequest = {\n unvalidatedPromoCodes: mapToUnvalidatedPromoCodes(manualPromoCodes.map((code) => ({ value: code }))),\n validatedPromoCodes: promoCookieData?.validatedPromoCodes ?? [],\n };\n\n const formattedPromos = formattedPromosFromLocalStorage ?? formattedPromosFromCookie;\n\n const shouldSendPromos = formattedPromos && !isEmptyPromoData(formattedPromos);\n const remoteSessionId =\n this.remoteSessionId ?? getRemoteSession({ apiKey: this.apiKey }) ?? getCookieValue(\"beam_statsig_session_id\");\n const result = await postTransaction({\n baseUrl: this.baseUrl,\n apiRoot: \"/api\",\n headers: {\n authorization: `Api-Key ${this.apiKey}`,\n },\n requestBody: {\n selectionId: this.selectionId || undefined,\n cartId: this.cartId || undefined,\n beamCartId: this.beamCartId || undefined,\n storeId: this.storeId,\n orderId: this.orderId,\n cartTotal: this.cartTotal,\n email: this.email, // One or both of email & partnerUserId should be defined\n partnerUserId: this.partnerUserId, // One or both of email & partnerUserId should be defined\n currencyCode: this.currencyCode,\n postalCode: this.postalCode,\n countryCode: this.countryCode,\n cart: this.cart,\n ...(shouldSendPromos && { promos: formattedPromos }),\n discountCodes: this.discountCodes,\n orderProcessedAt: new Date().toISOString(),\n ...(remoteSessionId && { remoteSessionId }),\n },\n });\n\n let effectiveResult: Awaited<ReturnType<typeof postTransaction>> = result;\n const shouldAttachSelectionId = !result.transactionCreated && !result.selectionId && Boolean(this.selectionId);\n\n if (shouldAttachSelectionId) {\n try {\n const updateResult = await updateTransaction({\n baseUrl: this.baseUrl,\n apiRoot: \"/api\",\n headers: { authorization: `Api-Key ${this.apiKey}` },\n pathParams: { transactionId: result.transactionId },\n requestBody: { selectionId: this.selectionId as string },\n });\n effectiveResult = updateResult;\n this.selectionId = updateResult.selectionId ?? this.selectionId;\n // Clear the pending selectionId now that it's durably attached server-side,\n // so a future unrelated order doesn't try to reattach it (mirrors the\n // transactionCreated cleanup below).\n this.localStorage.removeItem(\"transaction\");\n } catch (err) {\n logger.warn(\n new BeamError(\"Failed to attach selectionId to existing transaction via update endpoint\", { cause: err }),\n { transactionId: result.transactionId, selectionId: this.selectionId },\n );\n // Fail softly: effectiveResult stays = result, component renders as it does today\n }\n }\n\n this.transactionId = effectiveResult.transactionId;\n this.userId = effectiveResult.beamUserId;\n this.nonprofitId = effectiveResult.nonprofitId;\n // reportSettings is absent from the update endpoint's response, so this always\n // sources from the original postTransaction result, never effectiveResult.\n this.excludeDonationsForRecurringTransactions = Boolean(result.reportSettings?.excludeRecurringDonations);\n this.creationMethod = effectiveResult.creationMethod || \"\";\n this.orderProcessedAt = effectiveResult.timestamp;\n\n const isTransactionRedeemed = !!this.nonprofitId;\n this.activeWidget = isTransactionRedeemed ? \"impact-overview\" : \"redeem-transaction\";\n\n // Emit order created event only when order is registered with Beam for the first time\n if (result.transactionCreated) {\n const localStorageKeys = [\n \"transaction\",\n \"cart\",\n PROMO_LOCAL_STORAGE_KEY,\n LOCAL_STORAGE_KEYS.NONPROFIT,\n LOCAL_STORAGE_KEYS.NONPROFIT_SELECTED_AT,\n ];\n localStorageKeys.forEach((key) => {\n this.localStorage.removeItem(key);\n });\n const cookieConfigs = [\n { name: BEAM_CART_COOKIE_NAME, path: \"/\", domain: this.domain },\n { name: PROMO_CODES_COOKIE_NAME, path: \"/\", domain: this.domain },\n ];\n\n cookieConfigs.forEach((config) => deleteCookieValue(config));\n\n // Emit order created event only when order is registered with Beam for the first time\n dispatchEvent(\n new BeamOrderCreatedEvent({\n transactionId: result.transactionId,\n orderId: this.orderId,\n cartTotal: this.cartTotal,\n currencyCode: this.currencyCode,\n selectionId: this.selectionId ?? null,\n cartId: this.cartId,\n beamCartId: this.beamCartId,\n storeId: this.storeId ?? null,\n postalCode: this.postalCode ?? null,\n countryCode: this.countryCode ?? null,\n remoteSessionId: this.remoteSessionId ?? null,\n transactionNonprofitId: result.nonprofitId,\n orderProcessedAt: result.timestamp,\n }),\n );\n }\n return effectiveResult;\n };\n\n private transactionDataController = new AsyncController<typeof this.handlePostTransaction>(\n this,\n this.handlePostTransaction,\n );\n\n render() {\n const THIRTY_DAYS_IN_MS = 30 * 24 * 60 * 60 * 1000;\n const transactionIsLessThan30DaysOld = Date.now() - new Date(this.orderProcessedAt).getTime() < THIRTY_DAYS_IN_MS;\n\n if (this.transactionDataController.loading) {\n return \"\";\n }\n if (this.transactionDataController.error) {\n if (this.debug) {\n return _errorMessage({ error: this.transactionDataController.error });\n }\n return \"\";\n }\n if (this.excludeDonationsForRecurringTransactions && this.creationMethod === \"recurring\") {\n return html``;\n }\n if (this.activeWidget === \"redeem-transaction\" && transactionIsLessThan30DaysOld) {\n return html`\n <beam-redeem-transaction\n part=\"redeem-transaction\"\n baseUrl=\"${this.baseUrl}\"\n apiKey=\"${this.apiKey}\"\n storeId=\"${this.storeId}\"\n postalCode=\"${this.postalCode}\"\n countryCode=\"${this.countryCode}\"\n transactionId=\"${this.transactionId}\"\n cart=\"${JSON.stringify(this.cart)}\"\n lang=\"${this.lang}\"\n excludeDonationsForRecurringTransactions=\"${this.excludeDonationsForRecurringTransactions}\"\n ?draftConfig=\"${this.draftConfig}\"\n ?debug=\"${this.debug}\"\n @beamnonprofitselect=\"${(event: Event) => {\n if (!(event instanceof CustomEvent)) return; // TS guard\n const { selectedNonprofitId } = (event as BeamNonprofitSelectEvent).detail;\n this.nonprofitId = selectedNonprofitId ?? null;\n this.activeWidget = \"impact-overview\";\n }}\"\n ></beam-redeem-transaction>\n `;\n }\n if (this.activeWidget === \"impact-overview\") {\n return html`\n <beam-impact-overview\n part=\"impact-overview\"\n storeId=\"${this.storeId}\"\n baseUrl=\"${this.baseUrl}\"\n apiKey=\"${this.apiKey}\"\n userId=\"${this.userId}\"\n nonprofitId=\"${this.nonprofitId}\"\n lang=\"${this.lang}\"\n discountCodes=\"${JSON.stringify(this.discountCodes)}\"\n transactionId=\"${this.transactionId}\"\n ?draftConfig=\"${this.draftConfig}\"\n ?debug=\"${this.debug}\"\n ></beam-impact-overview>\n `;\n }\n return \"\";\n }\n\n static styles = [cssReset];\n}\n\ndefineCustomElement(BeamPostPurchase);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"beam-post-purchase\": BeamPostPurchase;\n }\n}\n","/**\n * @deprecated (v1.57.0) Shopify no longer supports customized post-purchase pages directly without Extensibility apps\n */\nimport \"../../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":["v","t","m","p","r","a","o","d","l","REQUIRED_DATA_PROPS","OPTIONAL_DATA_PROPS","BeamPostPurchase","LitElement","DEFAULT_BASE_URL","createScopedLocalStorage","manualPromoCodes","formattedPromosFromLocalStorage","formatStoreAndReturnPromoCodes","code","promoCookieData","getAllPromoCodesFromCookie","formattedPromosFromCookie","mapToUnvalidatedPromoCodes","formattedPromos","shouldSendPromos","isEmptyPromoData","remoteSessionId","getRemoteSession","getCookieValue","result","postTransaction","effectiveResult","updateResult","updateTransaction","err","logger","BeamError","isTransactionRedeemed","PROMO_LOCAL_STORAGE_KEY","LOCAL_STORAGE_KEYS","key","BEAM_CART_COOKIE_NAME","PROMO_CODES_COOKIE_NAME","config","deleteCookieValue","BeamOrderCreatedEvent","AsyncController","parseJsonStringArray","_changedProperties","previousPropertyValues","enforceConfig","MissingConfig","transactionIsLessThan30DaysOld","_errorMessage","html","event","selectedNonprofitId","cssReset","__decorateClass","property","state","defineCustomElement","showBeamOrderPageWidgets","parentSelector","apiKey","baseUrl","storeId","postalCode","discountCodes","countryCode","orderId","email","cartTotal","cart","promoCodes","htmlPromoCodes","currencyCode","domain","lang","debug","parentElement","waitForElement","cartId","beamLocalStorage","existingValue","widget"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{d as v,i as B}from"./lodash-CrMU6wKg.esm.js";import{Q as f,z as S,D as K,A as R,R as L,h as O,E as x,T as z,o as J,O as T,t as U,n as D}from"./utils-C5hmbxa4.esm.js";import{B as b,o as M}from"./index-BpR0FMss.esm.js";const N=50,l=v(f(async function(e,n,w=!1){try{const t=S({apiKey:e.apiKey}),h=e.baseUrl??K,o=t.getItemJson("cart"),a=R(b,e),y=L(e)??void 0,{cartId:d,subtotal:i,itemCount:c,currencyCode:m,content:{items:C=[],discounts:u=[]}={},schema:p={source:"generic"}}=n,r={cartId:d,subtotal:i,itemCount:c,currencyCode:m,content:{items:C,discounts:u},schema:p,beamCartId:a};if(w&&!o&&n?.itemCount){t.setItemJson("cart",{...r,beamCartId:a});return}if(B(r,{...o,cartId:o?.cartId})||n.itemCount===0&&(!a||o?.itemCount===0)){t.setItemJson("cart",{...r,beamCartId:a});return}O((u??[]).map(g=>({value:g?.code})),e.apiKey),window.dispatchEvent(new x({source:z.cart_update}));const A=await M({baseUrl:h,headers:{authorization:`Api-Key ${e.apiKey}`},requestBody:{beamCartId:a,storeId:e.storeId,remoteSessionId:y,cartId:d,subtotal:i,itemCount:c,currencyCode:m}}),{beamCartId:s,expiresAt:I,beamCartCreated:_}=A;s&&I&&await J({name:b,domain:e.domain,value:s,path:"/",expires:new Date(I).getTime()}),t.setItemJson("cart",{...r,beamCartId:s});const E={schema:p,content:{items:C,discounts:u},subtotal:i,itemCount:c,currencyCode:m,cartId:d,beamCartId:s};window.dispatchEvent(new T(E)),_&&window.dispatchEvent(new U(E))}catch(t){throw new D("Could not update cart in Beam",{cause:t})}}),N,{leading:!0});var P=Object.freeze({__proto__:null,updateCart:l});export{l as O,P as i};
2
- //# sourceMappingURL=index-Ghl9JrXJ.esm.js.map
1
+ import{d as v,i as B}from"./lodash-CrMU6wKg.esm.js";import{Q as f,z as S,D as K,A as R,R as L,h as O,E as x,T as z,o as J,O as T,t as U,n as D}from"./utils-C5hmbxa4.esm.js";import{B as b,o as M}from"./index-CVHrQ1WC.esm.js";const N=50,l=v(f(async function(e,n,w=!1){try{const t=S({apiKey:e.apiKey}),h=e.baseUrl??K,o=t.getItemJson("cart"),a=R(b,e),y=L(e)??void 0,{cartId:d,subtotal:i,itemCount:c,currencyCode:m,content:{items:C=[],discounts:u=[]}={},schema:p={source:"generic"}}=n,r={cartId:d,subtotal:i,itemCount:c,currencyCode:m,content:{items:C,discounts:u},schema:p,beamCartId:a};if(w&&!o&&n?.itemCount){t.setItemJson("cart",{...r,beamCartId:a});return}if(B(r,{...o,cartId:o?.cartId})||n.itemCount===0&&(!a||o?.itemCount===0)){t.setItemJson("cart",{...r,beamCartId:a});return}O((u??[]).map(g=>({value:g?.code})),e.apiKey),window.dispatchEvent(new x({source:z.cart_update}));const A=await M({baseUrl:h,headers:{authorization:`Api-Key ${e.apiKey}`},requestBody:{beamCartId:a,storeId:e.storeId,remoteSessionId:y,cartId:d,subtotal:i,itemCount:c,currencyCode:m}}),{beamCartId:s,expiresAt:I,beamCartCreated:_}=A;s&&I&&await J({name:b,domain:e.domain,value:s,path:"/",expires:new Date(I).getTime()}),t.setItemJson("cart",{...r,beamCartId:s});const E={schema:p,content:{items:C,discounts:u},subtotal:i,itemCount:c,currencyCode:m,cartId:d,beamCartId:s};window.dispatchEvent(new T(E)),_&&window.dispatchEvent(new U(E))}catch(t){throw new D("Could not update cart in Beam",{cause:t})}}),N,{leading:!0});var P=Object.freeze({__proto__:null,updateCart:l});export{l as O,P as i};
2
+ //# sourceMappingURL=index-Bt4Ob1Fi.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-Ghl9JrXJ.esm.js","sources":["../../src/integrations/cart/update-cart.ts"],"sourcesContent":["import isEqual from \"lodash-es/isEqual\";\nimport { DEFAULT_BASE_URL, HELPER_NAMES } from \"../../api-sdk/constants\";\nimport { BeamBaseAPIConfig } from \"../../api-sdk/types\";\nimport { postCart } from \"../../api-sdk/v3/routes\";\nimport { debounce, memoizeLast } from \"../../utils\";\nimport { BeamError } from \"../../utils/beam-errors\";\nimport { BEAM_CART_COOKIE_NAME, TBeamCartLocalStorage, TCartApi } from \"../../shared/cart-contents\";\nimport { setCookieValue } from \"../../utils/cookies\";\nimport { BeamCartChangeEvent, BeamCartCreatedEvent, BeamWidgetStoredPromoCodesEvent } from \"../../utils/events\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { getRemoteSession } from \"../../utils/remote-session\";\nimport { getBeamCartId } from \"../../utils/cart\";\nimport { formatStoreAndReturnPromoCodes } from \"../../utils/promoManager\";\n\nexport type BeamCartAPIConfig = BeamBaseAPIConfig & {\n storeId: number;\n domain?: string; // Domain to set cookies on\n statsigExperiment?: string;\n};\n\nexport type BeamCartValues = {\n cartId?: string; // External (partner) cart ID\n itemCount?: number;\n subtotal?: number;\n currencyCode?: string;\n} & Partial<TCartApi>;\n\n/**\n * The debounce time in milliseconds for updating the cart - updateCart will delay until it hasn't been called for\n * this long before handling the last call.\n */\nconst UPDATE_CART_DEBOUNCE_MS = 50;\n\n/**\n * Sends cart information to Beam\n * Memoized based on previous arguments - if the objects are deep-equal, no update is made.\n * @side-effects Sets beam_cart cookie, set cart data in localstorage\n * @example\n * const BeamConfig = { apiKey: 'abc-123' }\n * const { beamCartId } = await updateCart(BeamConfig, { beamCartId, itemCount, subtotal, currencyCode })\n * */\nconst updateCart = debounce(\n memoizeLast(async function updateCart(\n config: BeamCartAPIConfig,\n cartValues: BeamCartValues,\n isFirstCartUpdateOnPageLoad = false,\n ) {\n try {\n const localStorage = createScopedLocalStorage({ apiKey: config.apiKey });\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n // The cart cache is used to detect changes after page refreshes / across tabs\n const cachedCart: TBeamCartLocalStorage | null = localStorage.getItemJson(\"cart\");\n // The Beam cart cookie is used to identify the cart across subdomains\n // Use explicit null if empty because API requires it\n const beamCartId: string | null = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n // Remote session ID (ie, device ID from an A/B testing tool) will be linked to the cart\n const remoteSessionId: string | undefined = getRemoteSession(config) ?? undefined;\n\n const {\n cartId,\n subtotal,\n itemCount,\n currencyCode,\n content: { items = [], discounts = [] } = {},\n schema = { source: \"generic\" },\n } = cartValues;\n\n const cartWithDefaults = {\n cartId,\n subtotal,\n itemCount,\n currencyCode,\n content: { items, discounts },\n schema,\n beamCartId,\n };\n\n // If this is our first time calling \"updateCart\" on page load, and there is\n // no prior \"cachedCart\", and the current Platform cart is not empty,\n // we should assume that the cart has not been interacted with.\n // In this case, we want to cache the current cart, but not send it to Beam\n // so that the next time we call this method, it will compare to the existing\n // Platform cart\n if (isFirstCartUpdateOnPageLoad && !cachedCart && !!cartValues?.itemCount) {\n // logger.debug(\n // \"[update-cart] first attempt to update cart; no prior cart found, cart is not empty; skipping update to Beam\"\n // );\n localStorage.setItemJson(\"cart\", {\n ...cartWithDefaults,\n beamCartId: beamCartId,\n });\n\n return;\n }\n\n // Early return conditions. Skip sending cart to Beam if any apply:\n // 1. The cart has not changed\n // 2. Cart is empty, unless the cart was not empty before\n if (\n isEqual(cartWithDefaults, {\n ...cachedCart,\n cartId: cachedCart?.cartId /* make sure optional key is defined even if empty */,\n }) || // cart has not changed, OR\n (cartValues.itemCount === 0 && // nothing in current cart, AND\n (!beamCartId || cachedCart?.itemCount === 0)) // no/expired prev cart or prev cart was empty\n ) {\n // logger.debug(\"[update-cart] cart not changed\");\n // If the cart has not changed because the cart is empty now,\n // we still want to save that this changed happened in our cached cart\n // so the next update will compare against a current cart\n localStorage.setItemJson(\"cart\", {\n ...cartWithDefaults,\n beamCartId: beamCartId,\n });\n\n return;\n }\n\n formatStoreAndReturnPromoCodes(\n (discounts ?? []).map((discount) => ({ value: discount?.code })),\n config.apiKey,\n );\n window.dispatchEvent(new BeamWidgetStoredPromoCodesEvent({ source: HELPER_NAMES.cart_update }));\n // logger.debug(\"[update-cart] sending cart update request\");\n const response = await postCart({\n baseUrl,\n headers: {\n authorization: `Api-Key ${config.apiKey}`,\n },\n requestBody: {\n beamCartId, // backwards compat: explicitly sending null here is required to get initial beamCartId\n storeId: config.storeId,\n remoteSessionId,\n cartId,\n subtotal,\n itemCount,\n currencyCode,\n },\n });\n\n // Response will contain a new beamCartId if one was not provided, or old one expired\n const { beamCartId: newBeamCartId, expiresAt, beamCartCreated } = response;\n\n if (newBeamCartId && expiresAt) {\n await setCookieValue({\n name: BEAM_CART_COOKIE_NAME,\n domain: config.domain,\n value: newBeamCartId,\n path: \"/\",\n // If we don't set an expiration, the cookie will be cleared when the tab is closed\n expires: new Date(expiresAt).getTime(),\n });\n }\n\n localStorage.setItemJson(\"cart\", {\n ...cartWithDefaults,\n beamCartId: newBeamCartId,\n });\n\n const eventDetail = {\n schema: schema as any, // TS union type can't figure out what variant applies here\n content: {\n items: items as any,\n discounts: discounts as any,\n },\n subtotal,\n itemCount,\n currencyCode,\n cartId,\n beamCartId: newBeamCartId,\n };\n\n // emit change event on any create/update/delete of cart items\n window.dispatchEvent(new BeamCartChangeEvent(eventDetail));\n\n // emit created event only when the cart is new according to Beam\n if (beamCartCreated) {\n window.dispatchEvent(new BeamCartCreatedEvent(eventDetail));\n }\n } catch (err) {\n throw new BeamError(\"Could not update cart in Beam\", { cause: err });\n }\n }),\n UPDATE_CART_DEBOUNCE_MS,\n { leading: true }, // handle first call immediately but delay for more calls within debounce window\n);\n\nexport { updateCart };\n"],"names":["UPDATE_CART_DEBOUNCE_MS","updateCart","debounce","memoizeLast","config","cartValues","isFirstCartUpdateOnPageLoad","localStorage","createScopedLocalStorage","baseUrl","DEFAULT_BASE_URL","cachedCart","beamCartId","getBeamCartId","BEAM_CART_COOKIE_NAME","remoteSessionId","getRemoteSession","cartId","subtotal","itemCount","currencyCode","items","discounts","schema","cartWithDefaults","isEqual","formatStoreAndReturnPromoCodes","discount","BeamWidgetStoredPromoCodesEvent","HELPER_NAMES","response","postCart","newBeamCartId","expiresAt","beamCartCreated","setCookieValue","eventDetail","BeamCartChangeEvent","BeamCartCreatedEvent","err","BeamError"],"mappings":"sOA+BMA,EAA0B,GAU1BC,EAAaC,EACjBC,EAAY,eACVC,EACAC,EACAC,EAA8B,GAC9B,CACA,GAAI,CACF,MAAMC,EAAeC,EAAyB,CAAE,OAAQJ,EAAO,MAAO,CAAC,EACjEK,EAAUL,EAAO,SAAWM,EAG5BC,EAA2CJ,EAAa,YAAY,MAAM,EAG1EK,EAA4BC,EAAcC,EAAuBV,CAAM,EAEvEW,EAAsCC,EAAiBZ,CAAM,GAAK,OAElE,CACJ,OAAAa,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,EACA,QAAS,CAAE,MAAAC,EAAQ,CAAA,EAAI,UAAAC,EAAY,CAAA,CAAG,EAAI,CAAA,EAC1C,OAAAC,EAAS,CAAE,OAAQ,SAAU,CAC/B,EAAIlB,EAEEmB,EAAmB,CACvB,OAAAP,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,EACA,QAAS,CAAE,MAAAC,EAAO,UAAAC,CAAU,EAC5B,OAAAC,EACA,WAAAX,CACF,EAQA,GAAIN,GAA+B,CAACK,GAAgBN,GAAY,UAAW,CAIzEE,EAAa,YAAY,OAAQ,CAC/B,GAAGiB,EACH,WAAYZ,CACd,CAAC,EAED,MACF,CAKA,GACEa,EAAQD,EAAkB,CACxB,GAAGb,EACH,OAAQA,GAAY,MACtB,CAAC,GACAN,EAAW,YAAc,IACvB,CAACO,GAAcD,GAAY,YAAc,GAC5C,CAKAJ,EAAa,YAAY,OAAQ,CAC/B,GAAGiB,EACH,WAAYZ,CACd,CAAC,EAED,MACF,CAEAc,GACGJ,GAAa,CAAA,GAAI,IAAKK,IAAc,CAAE,MAAOA,GAAU,IAAK,EAAE,EAC/DvB,EAAO,MACT,EACA,OAAO,cAAc,IAAIwB,EAAgC,CAAE,OAAQC,EAAa,WAAY,CAAC,CAAC,EAE9F,MAAMC,EAAW,MAAMC,EAAS,CAC9B,QAAAtB,EACA,QAAS,CACP,cAAe,WAAWL,EAAO,MAAM,EACzC,EACA,YAAa,CACX,WAAAQ,EACA,QAASR,EAAO,QAChB,gBAAAW,EACA,OAAAE,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,CACF,CACF,CAAC,EAGK,CAAE,WAAYY,EAAe,UAAAC,EAAW,gBAAAC,CAAgB,EAAIJ,EAE9DE,GAAiBC,GACnB,MAAME,EAAe,CACnB,KAAMrB,EACN,OAAQV,EAAO,OACf,MAAO4B,EACP,KAAM,IAEN,QAAS,IAAI,KAAKC,CAAS,EAAE,QAAA,CAC/B,CAAC,EAGH1B,EAAa,YAAY,OAAQ,CAC/B,GAAGiB,EACH,WAAYQ,CACd,CAAC,EAED,MAAMI,EAAc,CAClB,OAAQb,EACR,QAAS,CACP,MAAOF,EACP,UAAWC,CACb,EACA,SAAAJ,EACA,UAAAC,EACA,aAAAC,EACA,OAAAH,EACA,WAAYe,CACd,EAGA,OAAO,cAAc,IAAIK,EAAoBD,CAAW,CAAC,EAGrDF,GACF,OAAO,cAAc,IAAII,EAAqBF,CAAW,CAAC,CAE9D,OAASG,EAAK,CACZ,MAAM,IAAIC,EAAU,gCAAiC,CAAE,MAAOD,CAAI,CAAC,CACrE,CACF,CAAC,EACDvC,EACA,CAAE,QAAS,EAAK,CAClB"}
1
+ {"version":3,"file":"index-Bt4Ob1Fi.esm.js","sources":["../../src/integrations/cart/update-cart.ts"],"sourcesContent":["import isEqual from \"lodash-es/isEqual\";\nimport { DEFAULT_BASE_URL, HELPER_NAMES } from \"../../api-sdk/constants\";\nimport { BeamBaseAPIConfig } from \"../../api-sdk/types\";\nimport { postCart } from \"../../api-sdk/v3/routes\";\nimport { debounce, memoizeLast } from \"../../utils\";\nimport { BeamError } from \"../../utils/beam-errors\";\nimport { BEAM_CART_COOKIE_NAME, TBeamCartLocalStorage, TCartApi } from \"../../shared/cart-contents\";\nimport { setCookieValue } from \"../../utils/cookies\";\nimport { BeamCartChangeEvent, BeamCartCreatedEvent, BeamWidgetStoredPromoCodesEvent } from \"../../utils/events\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { getRemoteSession } from \"../../utils/remote-session\";\nimport { getBeamCartId } from \"../../utils/cart\";\nimport { formatStoreAndReturnPromoCodes } from \"../../utils/promoManager\";\n\nexport type BeamCartAPIConfig = BeamBaseAPIConfig & {\n storeId: number;\n domain?: string; // Domain to set cookies on\n statsigExperiment?: string;\n};\n\nexport type BeamCartValues = {\n cartId?: string; // External (partner) cart ID\n itemCount?: number;\n subtotal?: number;\n currencyCode?: string;\n} & Partial<TCartApi>;\n\n/**\n * The debounce time in milliseconds for updating the cart - updateCart will delay until it hasn't been called for\n * this long before handling the last call.\n */\nconst UPDATE_CART_DEBOUNCE_MS = 50;\n\n/**\n * Sends cart information to Beam\n * Memoized based on previous arguments - if the objects are deep-equal, no update is made.\n * @side-effects Sets beam_cart cookie, set cart data in localstorage\n * @example\n * const BeamConfig = { apiKey: 'abc-123' }\n * const { beamCartId } = await updateCart(BeamConfig, { beamCartId, itemCount, subtotal, currencyCode })\n * */\nconst updateCart = debounce(\n memoizeLast(async function updateCart(\n config: BeamCartAPIConfig,\n cartValues: BeamCartValues,\n isFirstCartUpdateOnPageLoad = false,\n ) {\n try {\n const localStorage = createScopedLocalStorage({ apiKey: config.apiKey });\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n // The cart cache is used to detect changes after page refreshes / across tabs\n const cachedCart: TBeamCartLocalStorage | null = localStorage.getItemJson(\"cart\");\n // The Beam cart cookie is used to identify the cart across subdomains\n // Use explicit null if empty because API requires it\n const beamCartId: string | null = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n // Remote session ID (ie, device ID from an A/B testing tool) will be linked to the cart\n const remoteSessionId: string | undefined = getRemoteSession(config) ?? undefined;\n\n const {\n cartId,\n subtotal,\n itemCount,\n currencyCode,\n content: { items = [], discounts = [] } = {},\n schema = { source: \"generic\" },\n } = cartValues;\n\n const cartWithDefaults = {\n cartId,\n subtotal,\n itemCount,\n currencyCode,\n content: { items, discounts },\n schema,\n beamCartId,\n };\n\n // If this is our first time calling \"updateCart\" on page load, and there is\n // no prior \"cachedCart\", and the current Platform cart is not empty,\n // we should assume that the cart has not been interacted with.\n // In this case, we want to cache the current cart, but not send it to Beam\n // so that the next time we call this method, it will compare to the existing\n // Platform cart\n if (isFirstCartUpdateOnPageLoad && !cachedCart && !!cartValues?.itemCount) {\n // logger.debug(\n // \"[update-cart] first attempt to update cart; no prior cart found, cart is not empty; skipping update to Beam\"\n // );\n localStorage.setItemJson(\"cart\", {\n ...cartWithDefaults,\n beamCartId: beamCartId,\n });\n\n return;\n }\n\n // Early return conditions. Skip sending cart to Beam if any apply:\n // 1. The cart has not changed\n // 2. Cart is empty, unless the cart was not empty before\n if (\n isEqual(cartWithDefaults, {\n ...cachedCart,\n cartId: cachedCart?.cartId /* make sure optional key is defined even if empty */,\n }) || // cart has not changed, OR\n (cartValues.itemCount === 0 && // nothing in current cart, AND\n (!beamCartId || cachedCart?.itemCount === 0)) // no/expired prev cart or prev cart was empty\n ) {\n // logger.debug(\"[update-cart] cart not changed\");\n // If the cart has not changed because the cart is empty now,\n // we still want to save that this changed happened in our cached cart\n // so the next update will compare against a current cart\n localStorage.setItemJson(\"cart\", {\n ...cartWithDefaults,\n beamCartId: beamCartId,\n });\n\n return;\n }\n\n formatStoreAndReturnPromoCodes(\n (discounts ?? []).map((discount) => ({ value: discount?.code })),\n config.apiKey,\n );\n window.dispatchEvent(new BeamWidgetStoredPromoCodesEvent({ source: HELPER_NAMES.cart_update }));\n // logger.debug(\"[update-cart] sending cart update request\");\n const response = await postCart({\n baseUrl,\n headers: {\n authorization: `Api-Key ${config.apiKey}`,\n },\n requestBody: {\n beamCartId, // backwards compat: explicitly sending null here is required to get initial beamCartId\n storeId: config.storeId,\n remoteSessionId,\n cartId,\n subtotal,\n itemCount,\n currencyCode,\n },\n });\n\n // Response will contain a new beamCartId if one was not provided, or old one expired\n const { beamCartId: newBeamCartId, expiresAt, beamCartCreated } = response;\n\n if (newBeamCartId && expiresAt) {\n await setCookieValue({\n name: BEAM_CART_COOKIE_NAME,\n domain: config.domain,\n value: newBeamCartId,\n path: \"/\",\n // If we don't set an expiration, the cookie will be cleared when the tab is closed\n expires: new Date(expiresAt).getTime(),\n });\n }\n\n localStorage.setItemJson(\"cart\", {\n ...cartWithDefaults,\n beamCartId: newBeamCartId,\n });\n\n const eventDetail = {\n schema: schema as any, // TS union type can't figure out what variant applies here\n content: {\n items: items as any,\n discounts: discounts as any,\n },\n subtotal,\n itemCount,\n currencyCode,\n cartId,\n beamCartId: newBeamCartId,\n };\n\n // emit change event on any create/update/delete of cart items\n window.dispatchEvent(new BeamCartChangeEvent(eventDetail));\n\n // emit created event only when the cart is new according to Beam\n if (beamCartCreated) {\n window.dispatchEvent(new BeamCartCreatedEvent(eventDetail));\n }\n } catch (err) {\n throw new BeamError(\"Could not update cart in Beam\", { cause: err });\n }\n }),\n UPDATE_CART_DEBOUNCE_MS,\n { leading: true }, // handle first call immediately but delay for more calls within debounce window\n);\n\nexport { updateCart };\n"],"names":["UPDATE_CART_DEBOUNCE_MS","updateCart","debounce","memoizeLast","config","cartValues","isFirstCartUpdateOnPageLoad","localStorage","createScopedLocalStorage","baseUrl","DEFAULT_BASE_URL","cachedCart","beamCartId","getBeamCartId","BEAM_CART_COOKIE_NAME","remoteSessionId","getRemoteSession","cartId","subtotal","itemCount","currencyCode","items","discounts","schema","cartWithDefaults","isEqual","formatStoreAndReturnPromoCodes","discount","BeamWidgetStoredPromoCodesEvent","HELPER_NAMES","response","postCart","newBeamCartId","expiresAt","beamCartCreated","setCookieValue","eventDetail","BeamCartChangeEvent","BeamCartCreatedEvent","err","BeamError"],"mappings":"sOA+BMA,EAA0B,GAU1BC,EAAaC,EACjBC,EAAY,eACVC,EACAC,EACAC,EAA8B,GAC9B,CACA,GAAI,CACF,MAAMC,EAAeC,EAAyB,CAAE,OAAQJ,EAAO,MAAO,CAAC,EACjEK,EAAUL,EAAO,SAAWM,EAG5BC,EAA2CJ,EAAa,YAAY,MAAM,EAG1EK,EAA4BC,EAAcC,EAAuBV,CAAM,EAEvEW,EAAsCC,EAAiBZ,CAAM,GAAK,OAElE,CACJ,OAAAa,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,EACA,QAAS,CAAE,MAAAC,EAAQ,CAAA,EAAI,UAAAC,EAAY,CAAA,CAAG,EAAI,CAAA,EAC1C,OAAAC,EAAS,CAAE,OAAQ,SAAU,CAC/B,EAAIlB,EAEEmB,EAAmB,CACvB,OAAAP,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,EACA,QAAS,CAAE,MAAAC,EAAO,UAAAC,CAAU,EAC5B,OAAAC,EACA,WAAAX,CACF,EAQA,GAAIN,GAA+B,CAACK,GAAgBN,GAAY,UAAW,CAIzEE,EAAa,YAAY,OAAQ,CAC/B,GAAGiB,EACH,WAAYZ,CACd,CAAC,EAED,MACF,CAKA,GACEa,EAAQD,EAAkB,CACxB,GAAGb,EACH,OAAQA,GAAY,MACtB,CAAC,GACAN,EAAW,YAAc,IACvB,CAACO,GAAcD,GAAY,YAAc,GAC5C,CAKAJ,EAAa,YAAY,OAAQ,CAC/B,GAAGiB,EACH,WAAYZ,CACd,CAAC,EAED,MACF,CAEAc,GACGJ,GAAa,CAAA,GAAI,IAAKK,IAAc,CAAE,MAAOA,GAAU,IAAK,EAAE,EAC/DvB,EAAO,MACT,EACA,OAAO,cAAc,IAAIwB,EAAgC,CAAE,OAAQC,EAAa,WAAY,CAAC,CAAC,EAE9F,MAAMC,EAAW,MAAMC,EAAS,CAC9B,QAAAtB,EACA,QAAS,CACP,cAAe,WAAWL,EAAO,MAAM,EACzC,EACA,YAAa,CACX,WAAAQ,EACA,QAASR,EAAO,QAChB,gBAAAW,EACA,OAAAE,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,CACF,CACF,CAAC,EAGK,CAAE,WAAYY,EAAe,UAAAC,EAAW,gBAAAC,CAAgB,EAAIJ,EAE9DE,GAAiBC,GACnB,MAAME,EAAe,CACnB,KAAMrB,EACN,OAAQV,EAAO,OACf,MAAO4B,EACP,KAAM,IAEN,QAAS,IAAI,KAAKC,CAAS,EAAE,QAAA,CAC/B,CAAC,EAGH1B,EAAa,YAAY,OAAQ,CAC/B,GAAGiB,EACH,WAAYQ,CACd,CAAC,EAED,MAAMI,EAAc,CAClB,OAAQb,EACR,QAAS,CACP,MAAOF,EACP,UAAWC,CACb,EACA,SAAAJ,EACA,UAAAC,EACA,aAAAC,EACA,OAAAH,EACA,WAAYe,CACd,EAGA,OAAO,cAAc,IAAIK,EAAoBD,CAAW,CAAC,EAGrDF,GACF,OAAO,cAAc,IAAII,EAAqBF,CAAW,CAAC,CAE9D,OAASG,EAAK,CACZ,MAAM,IAAIC,EAAU,gCAAiC,CAAE,MAAOD,CAAI,CAAC,CACrE,CACF,CAAC,EACDvC,EACA,CAAE,QAAS,EAAK,CAClB"}
@@ -1,5 +1,5 @@
1
1
  import{b as p,m as T}from"./lit-BEag9MFp.esm.js";import{n as u,l as f,a3 as g,D as O,Q as E,P as N,q as A,d as _}from"./utils-C5hmbxa4.esm.js";const F=t=>Object.entries(t).map(([e,r])=>`${e}: ${r};`).join(`
2
- `);class R{constructor(e,r){this.data=null,this.loading=!1,this.error=null,(this.host=e).addController(this),this.asyncFn=r}async exec(...e){this.lastArgs=e,this.loading=!0,this.host.requestUpdate();try{this.data=await this.asyncFn(...e),this.error=null}catch(r){r instanceof Error&&(this.error=r,this.data=null)}return this.loading=!1,this.host.requestUpdate(),this.data}async retry(){return this.exec(...this.lastArgs||[])}hostDisconnected(){}}var D="1.57.3",L={"@shoelace-style/shoelace":"2.20.1","lucide-static":"0.292.0"};async function y(t,e){const r={method:"GET",...e,headers:{"Content-Type":"application/json",Accept:"application/json","X-Beam-Client":"WebSDK","X-Beam-Client-Version":D,...e?.headers},preflightContinue:!0,mode:e?.mode||"cors",body:e?.body!=null?e.body:void 0};let a;try{a=await fetch(t,r)}catch(n){const o=new u(`Network call failed (${r?.method.toUpperCase()} ${t})`);throw o.cause=n,f.error(o,t),o}let c,l;try{l=await a.text(),l&&(c=JSON.parse(l))}catch(n){let o=n;throw n instanceof SyntaxError&&(o=new g(a,c,`Response invalid. Expected JSON. Received: "${l}"`),o.cause=n),f.error(o),o}if(!a.ok){const n=new g(a,c,"Response was not OK");throw f.error(n),n}return c}const i=(t,e,r)=>({[t]:async function({headers:a={},baseUrl:c=O,apiRoot:l="/api/v3",pathParams:n={},queryParams:o={},requestBody:h}){const d=Object.entries(n).reduce((w,[x,C])=>w.replace(`{${x}}`,C),t),m=JSON.parse(JSON.stringify(o)),s=new URLSearchParams(m).toString(),S=c+l+d+(s&&`?${s}`),v={headers:a,method:e,body:JSON.stringify(h)};return y(S,v)}})[t];i("/chain/{chainId}/nonprofits","get");const M=i("/impact","get"),U=i("/chain/{chainId}/cumulativeImpact","get"),B=i("/selectNonprofit","post");i("/transaction","post"),i("/transaction/{transactionId}","put");const k=i("/cart","post"),J=E(i("/chain/findEligibleNonprofitsForCart","post")),W=i("/logs","post"),j=i("/experimentSession","post"),q=i("/subscriptions/updateSubscriptionNonprofit","post"),z=i("/subscriptions/findOrCreateSubscription","post"),I=i("/productDetailsPage","post"),$={errorTitle:"Beam encountered an error. Please try again.",retry:"Retry"},P=({error:t,retry:e})=>{let r=p``;if(t instanceof g){const a=JSON.stringify({status:t.response.status,statusText:t.response.statusText,url:t.response.url,body:t.body},null,4);r=p`
2
+ `);class R{constructor(e,r){this.data=null,this.loading=!1,this.error=null,(this.host=e).addController(this),this.asyncFn=r}async exec(...e){this.lastArgs=e,this.loading=!0,this.host.requestUpdate();try{this.data=await this.asyncFn(...e),this.error=null}catch(r){r instanceof Error&&(this.error=r,this.data=null)}return this.loading=!1,this.host.requestUpdate(),this.data}async retry(){return this.exec(...this.lastArgs||[])}hostDisconnected(){}}var D="1.57.4",L={"@shoelace-style/shoelace":"2.20.1","lucide-static":"0.292.0"};async function y(t,e){const r={method:"GET",...e,headers:{"Content-Type":"application/json",Accept:"application/json","X-Beam-Client":"WebSDK","X-Beam-Client-Version":D,...e?.headers},preflightContinue:!0,mode:e?.mode||"cors",body:e?.body!=null?e.body:void 0};let a;try{a=await fetch(t,r)}catch(n){const o=new u(`Network call failed (${r?.method.toUpperCase()} ${t})`);throw o.cause=n,f.error(o,t),o}let c,l;try{l=await a.text(),l&&(c=JSON.parse(l))}catch(n){let o=n;throw n instanceof SyntaxError&&(o=new g(a,c,`Response invalid. Expected JSON. Received: "${l}"`),o.cause=n),f.error(o),o}if(!a.ok){const n=new g(a,c,"Response was not OK");throw f.error(n),n}return c}const i=(t,e,r)=>({[t]:async function({headers:a={},baseUrl:c=O,apiRoot:l="/api/v3",pathParams:n={},queryParams:o={},requestBody:h}){const d=Object.entries(n).reduce((w,[x,C])=>w.replace(`{${x}}`,C),t),m=JSON.parse(JSON.stringify(o)),s=new URLSearchParams(m).toString(),S=c+l+d+(s&&`?${s}`),v={headers:a,method:e,body:JSON.stringify(h)};return y(S,v)}})[t];i("/chain/{chainId}/nonprofits","get");const M=i("/impact","get"),U=i("/chain/{chainId}/cumulativeImpact","get"),B=i("/selectNonprofit","post");i("/transaction","post"),i("/transaction/{transactionId}","put");const k=i("/cart","post"),J=E(i("/chain/findEligibleNonprofitsForCart","post")),W=i("/logs","post"),j=i("/experimentSession","post"),q=i("/subscriptions/updateSubscriptionNonprofit","post"),z=i("/subscriptions/findOrCreateSubscription","post"),I=i("/productDetailsPage","post"),$={errorTitle:"Beam encountered an error. Please try again.",retry:"Retry"},P=({error:t,retry:e})=>{let r=p``;if(t instanceof g){const a=JSON.stringify({status:t.response.status,statusText:t.response.statusText,url:t.response.url,body:t.body},null,4);r=p`
3
3
  <p><b>Network Response:</b></p>
4
4
  <p>${a}</p>
5
5
  `}return t instanceof N&&(r=p`
@@ -28,4 +28,4 @@ import{b as p,m as T}from"./lit-BEag9MFp.esm.js";import{n as u,l as f,a3 as g,D
28
28
  color: var(${s}-color, ${d});
29
29
  letter-spacing: var(${s}-letterSpacing, ${m});
30
30
  `)},X=(t,e)=>{if(e.startsWith("{")&&!e.startsWith("{{"))try{const r=JSON.parse(e);return r[t]??r.en??e}catch{return f.error(new u("Failed to extract JSON translation from string"),e),e}return e},Q=t=>t.every(e=>e instanceof HTMLElement),Y=A.CART;async function b(t,e){const{apiKey:r,baseUrl:a}=t;try{await W({baseUrl:a||_,headers:{authorization:`Api-Key ${r}`},requestBody:{...e}})}catch(c){f.error("Failed to send log",c)}}var Z=Object.freeze({__proto__:null,sendLog:b});export{R as A,Y as B,K as _,Q as a,U as b,P as c,X as d,G as e,F as f,M as g,J as h,Z as i,z as j,q as k,I as l,B as m,i as n,k as o,j as p,L as q,y as r,b as s,V as u};
31
- //# sourceMappingURL=index-BpR0FMss.esm.js.map
31
+ //# sourceMappingURL=index-CVHrQ1WC.esm.js.map