@beamimpact/web-sdk 1.57.0 → 1.57.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/_share-dialog-dependencies-BEUnzuWq.esm.js +2 -0
- package/dist/chunks/{_share-dialog-dependencies-U9953n3E.esm.js.map → _share-dialog-dependencies-BEUnzuWq.esm.js.map} +1 -1
- package/dist/chunks/{cart-ChovPXmM.esm.d.ts → cart-CKltrzQt.esm.d.ts} +20 -9
- package/dist/chunks/{css-card-grid-BUidQqf0.esm.js → css-card-grid-CiqEjkwR.esm.js} +2 -2
- package/dist/chunks/{css-card-grid-BUidQqf0.esm.js.map → css-card-grid-CiqEjkwR.esm.js.map} +1 -1
- package/dist/chunks/{index-IQOpw0qx.esm.d.ts → index-BAROgNYE.esm.d.ts} +7 -1
- package/dist/chunks/{index-CdinWvYu.esm.d.ts → index-BH3YaPLG.esm.d.ts} +1 -1
- package/dist/chunks/index-BgalrCS_.esm.js +32 -0
- package/dist/chunks/{index-CTsxQr7R.esm.js.map → index-BgalrCS_.esm.js.map} +1 -1
- package/dist/chunks/index-C60Vejym.esm.js +32 -0
- package/dist/chunks/{index-DBKUxzAl.esm.js.map → index-C60Vejym.esm.js.map} +1 -1
- package/dist/chunks/{index-BG4XJXUa.esm.d.ts → index-C6a13iqC.esm.d.ts} +3 -1
- package/dist/chunks/index-D6aFJ4cU.esm.js +2 -0
- package/dist/chunks/index-D6aFJ4cU.esm.js.map +1 -0
- package/dist/chunks/index-Dm-K2MLY.esm.js +31 -0
- package/dist/chunks/index-Dm-K2MLY.esm.js.map +1 -0
- package/dist/chunks/{index-DTw-q6W4.esm.js → index-DqhM4Yoj.esm.js} +11 -11
- package/dist/chunks/index-DqhM4Yoj.esm.js.map +1 -0
- package/dist/chunks/{index-CVmIOuEY.esm.js → index-HqfLVFOU.esm.js} +11 -11
- package/dist/chunks/index-HqfLVFOU.esm.js.map +1 -0
- package/dist/chunks/index-MAMeVd6l.esm.js +2 -0
- package/dist/chunks/{index--PfL-_nX.esm.js.map → index-MAMeVd6l.esm.js.map} +1 -1
- package/dist/chunks/{index-_0XeyyF9.esm.d.ts → index-OYSJ-2mk.esm.d.ts} +1 -1
- package/dist/chunks/{index-BY5lSRmw.esm.d.ts → index-mBTWm4YP.esm.d.ts} +2 -2
- package/dist/chunks/{promo-pill-label-BdTmmg_U.esm.js → promo-pill-label-5HmbDVmU.esm.js} +2 -2
- package/dist/chunks/{promo-pill-label-BdTmmg_U.esm.js.map → promo-pill-label-5HmbDVmU.esm.js.map} +1 -1
- package/dist/chunks/{share-button-7sI6zg-x.esm.js → share-button-5gfPmeEh.esm.js} +3 -3
- package/dist/chunks/{share-button-7sI6zg-x.esm.js.map → share-button-5gfPmeEh.esm.js.map} +1 -1
- package/dist/chunks/{share-button-BaIbuJOl.esm.js → share-button-C4yPLL_t.esm.js} +3 -3
- package/dist/chunks/{share-button-BaIbuJOl.esm.js.map → share-button-C4yPLL_t.esm.js.map} +1 -1
- package/dist/chunks/{update-cart-CcgzHTEm.esm.d.ts → update-cart-DoJGAdoU.esm.d.ts} +2 -2
- package/dist/chunks/utils-C5hmbxa4.esm.js +2 -0
- package/dist/chunks/utils-C5hmbxa4.esm.js.map +1 -0
- package/dist/chunks/{utils-D8HO_RIu.esm.d.ts → utils-COGFpDER.esm.d.ts} +84 -84
- package/dist/components/beam-partner-logos.d.ts +1 -1
- package/dist/components/community-impact.d.ts +1 -1
- package/dist/components/community-impact.esm.js +4 -4
- package/dist/components/community-impact.esm.js.map +1 -1
- package/dist/components/community-impact.js +4 -4
- package/dist/components/community-impact.js.map +1 -1
- package/dist/components/cumulative-impact.d.ts +1 -1
- package/dist/components/cumulative-impact.esm.js +2 -2
- package/dist/components/cumulative-impact.esm.js.map +1 -1
- package/dist/components/cumulative-impact.js +2 -2
- package/dist/components/cumulative-impact.js.map +1 -1
- package/dist/components/impact-overview.d.ts +1 -1
- package/dist/components/impact-overview.esm.js +4 -4
- package/dist/components/impact-overview.esm.js.map +1 -1
- package/dist/components/impact-overview.js +4 -4
- package/dist/components/impact-overview.js.map +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.esm.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/post-purchase.d.ts +1 -1
- package/dist/components/post-purchase.esm.js +1 -1
- package/dist/components/post-purchase.js +1 -1
- package/dist/components/product-details-page.d.ts +1 -1
- package/dist/components/product-details-page.esm.js +4 -4
- package/dist/components/product-details-page.esm.js.map +1 -1
- package/dist/components/product-details-page.js +4 -4
- package/dist/components/product-details-page.js.map +1 -1
- package/dist/components/redeem-transaction.d.ts +1 -1
- package/dist/components/redeem-transaction.esm.js +1 -1
- package/dist/components/redeem-transaction.js +1 -1
- package/dist/components/select-nonprofit.d.ts +1 -1
- package/dist/components/select-nonprofit.esm.js +12 -12
- package/dist/components/select-nonprofit.esm.js.map +1 -1
- package/dist/components/select-nonprofit.js +12 -12
- package/dist/components/select-nonprofit.js.map +1 -1
- package/dist/components/select-subscription-nonprofit.d.ts +1 -1
- package/dist/components/select-subscription-nonprofit.esm.js +11 -11
- package/dist/components/select-subscription-nonprofit.esm.js.map +1 -1
- package/dist/components/select-subscription-nonprofit.js +11 -11
- package/dist/components/select-subscription-nonprofit.js.map +1 -1
- package/dist/components/shopify.d.ts +4 -4
- package/dist/components/shopify.esm.js +1 -1
- package/dist/components/shopify.esm.js.map +1 -1
- package/dist/components/shopify.js +1 -1
- package/dist/components/shopify.js.map +1 -1
- package/dist/components/social-share.d.ts +1 -1
- package/dist/components/social-share.esm.js +1 -1
- package/dist/components/social-share.esm.js.map +1 -1
- package/dist/components/social-share.js +1 -1
- package/dist/components/social-share.js.map +1 -1
- package/dist/components/subscriber-select-nonprofit.d.ts +1 -1
- package/dist/components/subscriber-select-nonprofit.esm.js +3 -3
- package/dist/components/subscriber-select-nonprofit.js +3 -3
- package/dist/components/subscription-impact.d.ts +1 -1
- package/dist/components/subscription-impact.esm.js +4 -4
- package/dist/components/subscription-impact.esm.js.map +1 -1
- package/dist/components/subscription-impact.js +4 -4
- package/dist/components/subscription-impact.js.map +1 -1
- package/dist/components/subscription-management.d.ts +1 -1
- package/dist/components/subscription-management.esm.js +4 -4
- package/dist/components/subscription-management.js +4 -4
- package/dist/index.d.ts +8 -8
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/integrations/beam.d.ts +1 -1
- package/dist/integrations/beam.esm.js +1 -1
- package/dist/integrations/beam.js +1 -1
- package/dist/integrations/cart.d.ts +2 -2
- package/dist/integrations/cart.esm.js +1 -1
- package/dist/integrations/cart.js +1 -1
- package/dist/integrations/logs.d.ts +2 -2
- package/dist/integrations/logs.esm.js +1 -1
- package/dist/integrations/logs.js +1 -1
- package/dist/integrations/promoManager.d.ts +1 -1
- package/dist/integrations/promoManager.esm.js +1 -1
- package/dist/integrations/promoManager.js +1 -1
- package/dist/integrations/session.d.ts +1 -1
- package/dist/integrations/session.esm.js +1 -1
- package/dist/integrations/session.js +1 -1
- package/dist/integrations/shopify-order.d.ts +1 -1
- package/dist/integrations/shopify-order.esm.js +1 -1
- package/dist/integrations/shopify-order.js +1 -1
- package/dist/integrations/shopify.d.ts +3 -3
- package/dist/integrations/shopify.esm.js +1 -1
- package/dist/integrations/shopify.js +1 -1
- package/dist/integrations/statsig.d.ts +1 -1
- package/dist/integrations/statsig.esm.js +3 -3
- package/dist/integrations/statsig.esm.js.map +1 -1
- package/dist/integrations/statsig.js +3 -3
- package/dist/integrations/statsig.js.map +1 -1
- package/dist/integrations/utils.d.ts +1 -1
- package/dist/integrations/utils.esm.js +1 -1
- package/dist/integrations/utils.js +1 -1
- package/dist/react/beam-partner-logos.d.ts +1 -1
- package/dist/react/community-impact.d.ts +1 -1
- package/dist/react/community-impact.esm.js +1 -1
- package/dist/react/community-impact.js +1 -1
- package/dist/react/cumulative-impact.d.ts +1 -1
- package/dist/react/cumulative-impact.esm.js +1 -1
- package/dist/react/cumulative-impact.js +1 -1
- package/dist/react/impact-overview.d.ts +1 -1
- package/dist/react/impact-overview.esm.js +1 -1
- package/dist/react/impact-overview.js +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.esm.js +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/post-purchase.d.ts +1 -1
- package/dist/react/post-purchase.esm.js +1 -1
- package/dist/react/post-purchase.js +1 -1
- package/dist/react/product-details-page.d.ts +1 -1
- package/dist/react/product-details-page.esm.js +1 -1
- package/dist/react/product-details-page.js +1 -1
- package/dist/react/redeem-transaction.d.ts +1 -1
- package/dist/react/redeem-transaction.esm.js +1 -1
- package/dist/react/redeem-transaction.js +1 -1
- package/dist/react/select-nonprofit.d.ts +1 -1
- package/dist/react/select-nonprofit.esm.js +1 -1
- package/dist/react/select-nonprofit.js +1 -1
- package/dist/react/select-subscription-nonprofit.d.ts +1 -1
- package/dist/react/select-subscription-nonprofit.esm.js +1 -1
- package/dist/react/select-subscription-nonprofit.js +1 -1
- package/dist/react/shopify.esm.js +1 -1
- package/dist/react/shopify.esm.js.map +1 -1
- package/dist/react/shopify.js +1 -1
- package/dist/react/shopify.js.map +1 -1
- package/dist/react/social-share.d.ts +1 -1
- package/dist/react/social-share.esm.js +1 -1
- package/dist/react/social-share.js +1 -1
- package/dist/react/subscriber-select-nonprofit.d.ts +1 -1
- package/dist/react/subscriber-select-nonprofit.esm.js +1 -1
- package/dist/react/subscriber-select-nonprofit.js +1 -1
- package/dist/react/subscription-impact.d.ts +1 -1
- package/dist/react/subscription-impact.esm.js +1 -1
- package/dist/react/subscription-impact.js +1 -1
- package/dist/react/subscription-management.d.ts +1 -1
- package/dist/react/subscription-management.esm.js +1 -1
- package/dist/react/subscription-management.js +1 -1
- package/dist/utils/beam-errors.d.ts +1 -1
- package/dist/utils/beam-errors.esm.js +1 -1
- package/dist/utils/beam-errors.js +1 -1
- package/dist/utils/cart.d.ts +1 -1
- package/dist/utils/cart.esm.js +1 -1
- package/dist/utils/cart.js +1 -1
- package/dist/utils/clear-beam-storage.d.ts +3 -0
- package/dist/utils/clear-beam-storage.esm.js +2 -0
- package/dist/utils/clear-beam-storage.esm.js.map +1 -0
- package/dist/utils/clear-beam-storage.js +2 -0
- package/dist/utils/clear-beam-storage.js.map +1 -0
- package/dist/utils/cookies.d.ts +1 -1
- package/dist/utils/cookies.esm.js +1 -1
- package/dist/utils/cookies.js +1 -1
- package/dist/utils/events.d.ts +1 -1
- package/dist/utils/events.esm.js +1 -1
- package/dist/utils/events.js +1 -1
- package/dist/utils/local-storage.d.ts +1 -1
- package/dist/utils/local-storage.esm.js +1 -1
- package/dist/utils/local-storage.js +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.esm.js +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/makeApiKeyHeader.d.ts +1 -1
- package/dist/utils/makeApiKeyHeader.esm.js +1 -1
- package/dist/utils/makeApiKeyHeader.js +1 -1
- package/dist/utils/memoize-last.d.ts +1 -1
- package/dist/utils/memoize-last.esm.js +1 -1
- package/dist/utils/memoize-last.js +1 -1
- package/dist/utils/network-listeners.d.ts +1 -1
- package/dist/utils/network-listeners.esm.js +1 -1
- package/dist/utils/network-listeners.js +1 -1
- package/dist/utils/promoManager.d.ts +1 -1
- package/dist/utils/promoManager.esm.js +1 -1
- package/dist/utils/promoManager.js +1 -1
- package/dist/utils/remote-session.d.ts +1 -1
- package/dist/utils/remote-session.esm.js +1 -1
- package/dist/utils/remote-session.js +1 -1
- package/dist/utils/wait-for-element.d.ts +1 -1
- package/dist/utils/wait-for-element.esm.js +1 -1
- package/dist/utils/wait-for-element.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/_share-dialog-dependencies-U9953n3E.esm.js +0 -2
- package/dist/chunks/index--PfL-_nX.esm.js +0 -2
- package/dist/chunks/index-CTsxQr7R.esm.js +0 -32
- package/dist/chunks/index-CVmIOuEY.esm.js.map +0 -1
- package/dist/chunks/index-DBKUxzAl.esm.js +0 -32
- package/dist/chunks/index-DTw-q6W4.esm.js.map +0 -1
- package/dist/chunks/index-DhHhFTBE.esm.js +0 -31
- package/dist/chunks/index-DhHhFTBE.esm.js.map +0 -1
- package/dist/chunks/index-cb5vYQx0.esm.js +0 -2
- package/dist/chunks/index-cb5vYQx0.esm.js.map +0 -1
- package/dist/chunks/utils-BjhsDvuU.esm.js +0 -2
- package/dist/chunks/utils-BjhsDvuU.esm.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share-button-BaIbuJOl.esm.js","sources":["../../src/shared/sync-element-heights.ts","../../src/shared/feature-detection.ts","../../src/shared/components/share-button.ts"],"sourcesContent":["import { isAllHtmlElements } from \"./is-all-html-elements\";\n\n/**\n * Synchronize heights of elements\n * @param {Array<HTMLElement|null>} elements - Elements to synchronize\n * @param {'contentLength' | 'currentHeight'} [options.source='contentLength'] -\n * Method used to get the height value to sync across elements. `contentLength`\n * (innerText.length) is reliable for pure text content when responding to\n * window resizing. Otherwise, currentHeight can be used to sync the tallest\n * element's height to all the other elements. Note that this works poorly\n * unless content is allowed to reflow with explicit height attributes removed\n * between synchronization calls.\n */\nexport const syncElementHeights = (\n elements: Array<HTMLElement | null> | NodeList,\n {\n source = \"contentLength\",\n }: {\n source?: \"contentLength\" | \"currentHeight\";\n } = {},\n) => {\n const els = elements instanceof NodeList ? Array.from(elements) : elements;\n\n if (els.length === 0 || !isAllHtmlElements(els)) {\n return;\n }\n\n const heightSource =\n source === \"contentLength\"\n ? els.sort((a, b) => {\n return b.innerText.length - a.innerText.length;\n })[0]\n : els.sort((a, b) => {\n return b.clientHeight - a.clientHeight;\n })[0];\n\n const syncedHeight = heightSource?.clientHeight || 0;\n\n for (const el of els) {\n if (el.clientHeight !== syncedHeight) {\n el.style[\"height\"] = syncedHeight + \"px\";\n }\n }\n};\n","export function isMobile() {\n return /Android|iPhone/i.test(navigator.userAgent);\n}\n\nexport function hasSystemShare() {\n return !!navigator.share;\n}\n","import { LitElement, html, render } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { postSocialShareAnalyticsEvent } from \"../../api-sdk/v2/users/events\";\nimport { DEFAULT_BASE_URL } from \"../../api-sdk/constants\";\nimport \"@shoelace-style/shoelace/dist/components/icon/icon.js\";\nimport { LANGUAGES } from \"../../api-sdk/types\";\nimport { urlToFile } from \"../files\";\nimport { isMobile } from \"../feature-detection\";\nimport { strings } from \"./strings/share-button\";\n\ninterface SlDialogElement extends HTMLElement {\n show: () => void;\n hide: () => void;\n}\n\nexport class BeamShareButton extends LitElement {\n @property({ type: String }) shareIcon: string | null = null;\n @property({ type: String }) imageUrl?: string | null = null;\n @property({ type: String }) brandName: string | null = null;\n @property({ type: String }) buttonText?: string | null = null;\n @property({ type: String }) configLang: LANGUAGES = \"en\";\n @property({ type: String }) baseUrl: string = DEFAULT_BASE_URL;\n @property({ type: String }) nonprofitId?: number | null = null;\n @property({ type: String }) storeId?: number | null = null;\n @property({ type: String }) transactionId?: number | null = null;\n @property({ type: String }) apiKey!: string;\n\n connectedCallback() {\n super.connectedCallback();\n }\n\n async handleShareClick() {\n try {\n if (!this.imageUrl || !this.brandName || !this.configLang) return;\n await import(\"./_share-dialog-dependencies.js\");\n\n const { nonprofitId, storeId, transactionId, baseUrl, apiKey } = this;\n void postSocialShareAnalyticsEvent({\n baseUrl,\n apiKey,\n requestBody: { eventName: \"shareImageButtonClick\", nonprofitId, storeId, timestamp: Date.now(), transactionId },\n }).catch(() => null);\n\n if (isMobile()) {\n this.openSystemShareSheet(this.imageUrl);\n } else {\n this.handleShareDialog(this.imageUrl, this.brandName);\n }\n } catch (err) {\n console.error(\"Error sharing impact:\", err);\n }\n }\n\n async handleShareDialog(imageUrl: string, brandName: string) {\n if (!imageUrl) return;\n\n const existingDialog = this.shadowRoot?.querySelector(\"sl-dialog\") as SlDialogElement;\n\n if (existingDialog) {\n existingDialog.show();\n return;\n }\n\n await import(\"./_share-dialog-dependencies.js\"); // Import libraries async to reduce bundle size if share feature is unused\n\n const modalRoot = this.shadowRoot?.querySelector(\"#modal-root\") as HTMLElement;\n\n const file = await urlToFile(imageUrl);\n\n const dataUrl = URL.createObjectURL(file);\n\n const handleClickClose = () => {\n (this.shadowRoot?.querySelector(\"sl-dialog\") as SlDialogElement)?.hide();\n };\n\n const handleClickCopy = async () => {\n void postSocialShareAnalyticsEvent({\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n requestBody: {\n eventName: \"copyImageButtonClick\",\n nonprofitId: this.nonprofitId,\n storeId: this.storeId,\n timestamp: Date.now(),\n transactionId: this.transactionId,\n },\n }).catch(() => null);\n await navigator.clipboard.write([new ClipboardItem({ \"image/png\": file })]);\n setTimeout(handleClickClose, 250);\n };\n\n const handleClickDownload = () => {\n void postSocialShareAnalyticsEvent({\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n requestBody: {\n eventName: \"downloadImageButtonClick\",\n nonprofitId: this.nonprofitId,\n storeId: this.storeId,\n timestamp: Date.now(),\n transactionId: this.transactionId,\n },\n }).catch(() => null);\n setTimeout(handleClickClose, 250);\n };\n\n const dialogTemplate = html`\n <style>\n .plain-button {\n border: none;\n background: none;\n font-size: inherit;\n font-family: inherit;\n }\n .share-dialog::part(panel) {\n padding: var(--beam-share-dialog-padding);\n text-align: center;\n }\n .share-title {\n font-size: var(--beam-share-title-fontSize);\n font-weight: var(--beam-share-title-fontWeight);\n }\n .share-text {\n font-size: var(--beam-share-text-fontSize);\n line-height: var(--beam-share-text-lineHeight);\n margin-top: var(--beam-share-text-marginTop);\n }\n .share-image {\n border-radius: var(--beam-share-image-borderRadius);\n width: var(--beam-share-image-width);\n display: block;\n margin: var(--beam-share-image-margin) auto;\n }\n .share-actions {\n margin: var(--beam-share-actions-margin);\n }\n .share-action-button {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n padding: 5px;\n }\n .share-action-icon {\n font-size: var(--beam-share-action-icon-size);\n }\n .share-action-button:hover .share-action-icon {\n scale: 1.1;\n }\n .share-action-text {\n font-size: var(--beam-share-action-text-fontSize);\n line-height: var(--beam-share-action-text-lineHeight);\n margin-top: var(--beam-share-text-action-marginTop);\n }\n .plain-button {\n border: none;\n background: none;\n font-size: inherit;\n font-family: inherit;\n }\n .plain-link {\n text-decoration: none;\n color: inherit;\n }\n .share-close {\n display: block;\n background-color: var(--beam-share-close-backgroundColor);\n color: var(--beam-share-close-text-color);\n justify-content: center;\n padding: var(--beam-share-close-padding);\n border-radius: var(--beam-share-close-borderRadius);\n width: 100%;\n font-size: var(--beam-share-close-fontSize);\n font-weight: var(--beam-share-close-fontWeight);\n }\n .share-close:hover {\n outline: 2px solid var(--beam-share-close-focus-borderColor);\n }\n </style>\n <sl-dialog open label=\"${strings[this.configLang].impactShareTitle()}\" no-header class=\"share-dialog\">\n <h2 class=\"share-title\">${strings[this.configLang].impactShareTitle()}</h2>\n <p class=\"share-text\">${strings[this.configLang].impactShareText({ brandName })}</p>\n <img\n data-speedsize-ignore=\"true\"\n src=\"${imageUrl}\"\n alt=\"${strings[this.configLang].impactShareTitle()}\"\n class=\"share-image\"\n />\n <div class=\"share-actions\" style=\"display: flex; justify-content: space-evenly\">\n <div style=\"flex: 1; text-align: center\">\n <button class=\"plain-button button share-action-button\" @click=\"${handleClickCopy}\">\n <sl-icon\n library=\"lucide\"\n name=\"copy\"\n label=\"${strings[this.configLang].impactShareCopy()}\"\n class=\"share-action-icon\"\n ></sl-icon>\n <div class=\"share-action-text\">${strings[this.configLang].impactShareCopy()}</div>\n </button>\n </div>\n <div style=\"flex: 1; text-align: center\">\n <a\n class=\"plain-button button share-action-button plain-link\"\n download=\"${strings[this.configLang].impactShareTitle()}\"\n href=\"${dataUrl}\"\n @click=\"${handleClickDownload}\"\n >\n <sl-icon\n library=\"lucide\"\n name=\"download\"\n label=\"${strings[this.configLang].impactShareDownload()}\"\n class=\"share-action-icon\"\n ></sl-icon>\n <div class=\"share-action-text\">${strings[this.configLang].impactShareDownload()}</div>\n </a>\n </div>\n </div>\n <button class=\"plain-button button share-close\" @click=\"${handleClickClose}\">\n ${strings[this.configLang].impactShareClose()}\n </button>\n </sl-dialog>\n `;\n if (modalRoot) {\n render(dialogTemplate, modalRoot);\n }\n }\n\n async openSystemShareSheet(imageUrl: string) {\n if (!imageUrl) return;\n\n const file = await urlToFile(imageUrl);\n\n if (navigator.share) {\n await navigator\n .share({\n files: [file],\n })\n .then(() => {\n const { nonprofitId, storeId, transactionId, baseUrl, apiKey } = this;\n void postSocialShareAnalyticsEvent({\n baseUrl,\n apiKey,\n requestBody: { eventName: \"shareSheetShare\", nonprofitId, storeId, timestamp: Date.now(), transactionId },\n }).catch(() => null);\n })\n .catch(() => null);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n }\n render() {\n if (!this.imageUrl || !this.brandName || !this.configLang) return html``;\n return html`\n <style>\n .share-button {\n font-family: var(--beam-share-button-fontFamily);\n font-size: var(--beam-share-button-fontSize);\n font-weight: var(--beam-share-button-fontWeight);\n margin-top: var(--beam-share-button-marginTop);\n margin-bottom: var(--beam-share-button-marginBottom);\n text-transform: var(--beam-share-button-textTransform);\n line-height: var(--beam-share-button-lineHeight);\n background-color: var(--beam-share-button-backgroundColor);\n color: var(--beam-share-button-color, inherit);\n border-radius: var(--beam-share-button-borderRadius);\n border-color: var(--beam-share-button-borderColor);\n border-width: var(--beam-share-button-borderWidth);\n /* add extra padding on side without icon for optical alignment */\n padding: var(--beam-share-button-padding);\n width: var(--beam-share-button-width);\n transition: 0.15s;\n }\n .share-button:hover {\n background-color: var(--beam-share-button-hover-backgroundColor);\n color: var(--beam-share-button-hover-color);\n border-color: var(--beam-share-button-hover-borderColor);\n }\n .share-button-text {\n text-decoration: var(--beam-share-button-text-textDecoration);\n margin-left: 0.33em;\n }\n .share-button-icon {\n font-size: var(--beam-share-button-icon-size);\n }\n .button {\n cursor: pointer;\n }\n .icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n </style>\n <button\n @click=\"${this.handleShareClick}\"\n baseUrl=\"${this.baseUrl}\"\n class=\"share-button share-button-inline button icon-button\"\n >\n <sl-icon\n name=\"${this.shareIcon}\"\n library=\"lucide\"\n label=\"${strings[this.configLang].impactShareButton()}\"\n class=\"share-button-icon\"\n ></sl-icon>\n <span class=\"share-button-text\">${this.buttonText || strings[this.configLang].impactShareButton()}</span>\n </button>\n <div id=\"modal-root\"></div>\n `;\n }\n}\n\ncustomElements.get(\"beam-share-button\") || customElements.define(\"beam-share-button\", BeamShareButton);\n\nexport const shareButtonConfigDefaults = {\n \"--beam-share-button-fontFamily\": \"inherit\",\n \"--beam-share-button-fontSize\": \"14px\",\n \"--beam-share-button-fontWeight\": \"600\",\n \"--beam-share-button-textTransform\": \"none\",\n \"--beam-share-button-marginTop\": \"10px\",\n \"--beam-share-button-marginBottom\": \"10px\",\n \"--beam-share-button-padding\": \"8px 18px 8px 16px\",\n \"--beam-share-button-lineHeight\": \"inherit\",\n \"--beam-share-button-color\": \"#0A323C\",\n \"--beam-share-button-backgroundColor\": \"#fff\",\n \"--beam-share-button-borderRadius\": \"30px\",\n \"--beam-share-button-borderColor\": \"#0A323C\",\n \"--beam-share-button-borderWidth\": \"1px\",\n\n \"--beam-share-button-width\": \"auto\",\n\n \"--beam-share-button-hover-borderColor\": \"transparent\",\n \"--beam-share-button-hover-backgroundColor\": \"#0A323C\",\n \"--beam-share-button-hover-color\": \"#fff\",\n\n \"--beam-share-button-icon-size\": \"16px\",\n\n \"--beam-share-button-text-textDecoration\": \"none\",\n\n \"--beam-share-dialog-padding\": \"30px 30px\",\n\n \"--beam-share-title-fontSize\": \"30px\",\n \"--beam-share-title-fontWeight\": \"bold\",\n\n \"--beam-share-text-fontSize\": \"16px\",\n \"--beam-share-text-lineHeight\": \"1.3\",\n \"--beam-share-text-marginTop\": \"10px\",\n\n \"--beam-share-image-borderRadius\": \"4px\",\n \"--beam-share-image-width\": \"200px\",\n \"--beam-share-image-margin\": \"20px\",\n\n \"--beam-share-actions-margin\": \"30px 60px\",\n \"--beam-share-action-icon-size\": \"32px\",\n\n \"--beam-share-action-text-fontSize\": \"16px\",\n \"--beam-share-action-text-lineHeight\": \"1.3\",\n \"--beam-share-text-action-marginTop\": \"10px\",\n\n \"--beam-share-close-backgroundColor\": \"#ffd522\",\n \"--beam-share-close-text-color\": \"#000\",\n \"--beam-share-close-padding\": \"12px\",\n \"--beam-share-close-borderRadius\": \"4px\",\n \"--beam-share-close-fontSize\": \"16px\",\n \"--beam-share-close-fontWeight\": \"bold\",\n\n \"--beam-share-close-focus-borderColor\": \"#c2dcff\",\n} as const;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"beam-share-button\": BeamShareButton;\n }\n}\n"],"names":["syncElementHeights","elements","source","els","isAllHtmlElements","syncedHeight","a","b","el","isMobile","v","o","l","e","n","r","i","BeamShareButton","LitElement","DEFAULT_BASE_URL","nonprofitId","storeId","transactionId","baseUrl","apiKey","postSocialShareAnalyticsEvent","err","imageUrl","brandName","existingDialog","modalRoot","file","urlToFile","dataUrl","handleClickClose","handleClickCopy","handleClickDownload","dialogTemplate","html","strings","render","__decorateClass","property","shareButtonConfigDefaults"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"share-button-C4yPLL_t.esm.js","sources":["../../src/shared/sync-element-heights.ts","../../src/shared/feature-detection.ts","../../src/shared/components/share-button.ts"],"sourcesContent":["import { isAllHtmlElements } from \"./is-all-html-elements\";\n\n/**\n * Synchronize heights of elements\n * @param {Array<HTMLElement|null>} elements - Elements to synchronize\n * @param {'contentLength' | 'currentHeight'} [options.source='contentLength'] -\n * Method used to get the height value to sync across elements. `contentLength`\n * (innerText.length) is reliable for pure text content when responding to\n * window resizing. Otherwise, currentHeight can be used to sync the tallest\n * element's height to all the other elements. Note that this works poorly\n * unless content is allowed to reflow with explicit height attributes removed\n * between synchronization calls.\n */\nexport const syncElementHeights = (\n elements: Array<HTMLElement | null> | NodeList,\n {\n source = \"contentLength\",\n }: {\n source?: \"contentLength\" | \"currentHeight\";\n } = {},\n) => {\n const els = elements instanceof NodeList ? Array.from(elements) : elements;\n\n if (els.length === 0 || !isAllHtmlElements(els)) {\n return;\n }\n\n const heightSource =\n source === \"contentLength\"\n ? els.sort((a, b) => {\n return b.innerText.length - a.innerText.length;\n })[0]\n : els.sort((a, b) => {\n return b.clientHeight - a.clientHeight;\n })[0];\n\n const syncedHeight = heightSource?.clientHeight || 0;\n\n for (const el of els) {\n if (el.clientHeight !== syncedHeight) {\n el.style[\"height\"] = syncedHeight + \"px\";\n }\n }\n};\n","export function isMobile() {\n return /Android|iPhone/i.test(navigator.userAgent);\n}\n\nexport function hasSystemShare() {\n return !!navigator.share;\n}\n","import { LitElement, html, render } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { postSocialShareAnalyticsEvent } from \"../../api-sdk/v2/users/events\";\nimport { DEFAULT_BASE_URL } from \"../../api-sdk/constants\";\nimport \"@shoelace-style/shoelace/dist/components/icon/icon.js\";\nimport { LANGUAGES } from \"../../api-sdk/types\";\nimport { urlToFile } from \"../files\";\nimport { isMobile } from \"../feature-detection\";\nimport { strings } from \"./strings/share-button\";\n\ninterface SlDialogElement extends HTMLElement {\n show: () => void;\n hide: () => void;\n}\n\nexport class BeamShareButton extends LitElement {\n @property({ type: String }) shareIcon: string | null = null;\n @property({ type: String }) imageUrl?: string | null = null;\n @property({ type: String }) brandName: string | null = null;\n @property({ type: String }) buttonText?: string | null = null;\n @property({ type: String }) configLang: LANGUAGES = \"en\";\n @property({ type: String }) baseUrl: string = DEFAULT_BASE_URL;\n @property({ type: String }) nonprofitId?: number | null = null;\n @property({ type: String }) storeId?: number | null = null;\n @property({ type: String }) transactionId?: number | null = null;\n @property({ type: String }) apiKey!: string;\n\n connectedCallback() {\n super.connectedCallback();\n }\n\n async handleShareClick() {\n try {\n if (!this.imageUrl || !this.brandName || !this.configLang) return;\n await import(\"./_share-dialog-dependencies.js\");\n\n const { nonprofitId, storeId, transactionId, baseUrl, apiKey } = this;\n void postSocialShareAnalyticsEvent({\n baseUrl,\n apiKey,\n requestBody: { eventName: \"shareImageButtonClick\", nonprofitId, storeId, timestamp: Date.now(), transactionId },\n }).catch(() => null);\n\n if (isMobile()) {\n this.openSystemShareSheet(this.imageUrl);\n } else {\n this.handleShareDialog(this.imageUrl, this.brandName);\n }\n } catch (err) {\n console.error(\"Error sharing impact:\", err);\n }\n }\n\n async handleShareDialog(imageUrl: string, brandName: string) {\n if (!imageUrl) return;\n\n const existingDialog = this.shadowRoot?.querySelector(\"sl-dialog\") as SlDialogElement;\n\n if (existingDialog) {\n existingDialog.show();\n return;\n }\n\n await import(\"./_share-dialog-dependencies.js\"); // Import libraries async to reduce bundle size if share feature is unused\n\n const modalRoot = this.shadowRoot?.querySelector(\"#modal-root\") as HTMLElement;\n\n const file = await urlToFile(imageUrl);\n\n const dataUrl = URL.createObjectURL(file);\n\n const handleClickClose = () => {\n (this.shadowRoot?.querySelector(\"sl-dialog\") as SlDialogElement)?.hide();\n };\n\n const handleClickCopy = async () => {\n void postSocialShareAnalyticsEvent({\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n requestBody: {\n eventName: \"copyImageButtonClick\",\n nonprofitId: this.nonprofitId,\n storeId: this.storeId,\n timestamp: Date.now(),\n transactionId: this.transactionId,\n },\n }).catch(() => null);\n await navigator.clipboard.write([new ClipboardItem({ \"image/png\": file })]);\n setTimeout(handleClickClose, 250);\n };\n\n const handleClickDownload = () => {\n void postSocialShareAnalyticsEvent({\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n requestBody: {\n eventName: \"downloadImageButtonClick\",\n nonprofitId: this.nonprofitId,\n storeId: this.storeId,\n timestamp: Date.now(),\n transactionId: this.transactionId,\n },\n }).catch(() => null);\n setTimeout(handleClickClose, 250);\n };\n\n const dialogTemplate = html`\n <style>\n .plain-button {\n border: none;\n background: none;\n font-size: inherit;\n font-family: inherit;\n }\n .share-dialog::part(panel) {\n padding: var(--beam-share-dialog-padding);\n text-align: center;\n }\n .share-title {\n font-size: var(--beam-share-title-fontSize);\n font-weight: var(--beam-share-title-fontWeight);\n }\n .share-text {\n font-size: var(--beam-share-text-fontSize);\n line-height: var(--beam-share-text-lineHeight);\n margin-top: var(--beam-share-text-marginTop);\n }\n .share-image {\n border-radius: var(--beam-share-image-borderRadius);\n width: var(--beam-share-image-width);\n display: block;\n margin: var(--beam-share-image-margin) auto;\n }\n .share-actions {\n margin: var(--beam-share-actions-margin);\n }\n .share-action-button {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n padding: 5px;\n }\n .share-action-icon {\n font-size: var(--beam-share-action-icon-size);\n }\n .share-action-button:hover .share-action-icon {\n scale: 1.1;\n }\n .share-action-text {\n font-size: var(--beam-share-action-text-fontSize);\n line-height: var(--beam-share-action-text-lineHeight);\n margin-top: var(--beam-share-text-action-marginTop);\n }\n .plain-button {\n border: none;\n background: none;\n font-size: inherit;\n font-family: inherit;\n }\n .plain-link {\n text-decoration: none;\n color: inherit;\n }\n .share-close {\n display: block;\n background-color: var(--beam-share-close-backgroundColor);\n color: var(--beam-share-close-text-color);\n justify-content: center;\n padding: var(--beam-share-close-padding);\n border-radius: var(--beam-share-close-borderRadius);\n width: 100%;\n font-size: var(--beam-share-close-fontSize);\n font-weight: var(--beam-share-close-fontWeight);\n }\n .share-close:hover {\n outline: 2px solid var(--beam-share-close-focus-borderColor);\n }\n </style>\n <sl-dialog open label=\"${strings[this.configLang].impactShareTitle()}\" no-header class=\"share-dialog\">\n <h2 class=\"share-title\">${strings[this.configLang].impactShareTitle()}</h2>\n <p class=\"share-text\">${strings[this.configLang].impactShareText({ brandName })}</p>\n <img\n data-speedsize-ignore=\"true\"\n src=\"${imageUrl}\"\n alt=\"${strings[this.configLang].impactShareTitle()}\"\n class=\"share-image\"\n />\n <div class=\"share-actions\" style=\"display: flex; justify-content: space-evenly\">\n <div style=\"flex: 1; text-align: center\">\n <button class=\"plain-button button share-action-button\" @click=\"${handleClickCopy}\">\n <sl-icon\n library=\"lucide\"\n name=\"copy\"\n label=\"${strings[this.configLang].impactShareCopy()}\"\n class=\"share-action-icon\"\n ></sl-icon>\n <div class=\"share-action-text\">${strings[this.configLang].impactShareCopy()}</div>\n </button>\n </div>\n <div style=\"flex: 1; text-align: center\">\n <a\n class=\"plain-button button share-action-button plain-link\"\n download=\"${strings[this.configLang].impactShareTitle()}\"\n href=\"${dataUrl}\"\n @click=\"${handleClickDownload}\"\n >\n <sl-icon\n library=\"lucide\"\n name=\"download\"\n label=\"${strings[this.configLang].impactShareDownload()}\"\n class=\"share-action-icon\"\n ></sl-icon>\n <div class=\"share-action-text\">${strings[this.configLang].impactShareDownload()}</div>\n </a>\n </div>\n </div>\n <button class=\"plain-button button share-close\" @click=\"${handleClickClose}\">\n ${strings[this.configLang].impactShareClose()}\n </button>\n </sl-dialog>\n `;\n if (modalRoot) {\n render(dialogTemplate, modalRoot);\n }\n }\n\n async openSystemShareSheet(imageUrl: string) {\n if (!imageUrl) return;\n\n const file = await urlToFile(imageUrl);\n\n if (navigator.share) {\n await navigator\n .share({\n files: [file],\n })\n .then(() => {\n const { nonprofitId, storeId, transactionId, baseUrl, apiKey } = this;\n void postSocialShareAnalyticsEvent({\n baseUrl,\n apiKey,\n requestBody: { eventName: \"shareSheetShare\", nonprofitId, storeId, timestamp: Date.now(), transactionId },\n }).catch(() => null);\n })\n .catch(() => null);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n }\n render() {\n if (!this.imageUrl || !this.brandName || !this.configLang) return html``;\n return html`\n <style>\n .share-button {\n font-family: var(--beam-share-button-fontFamily);\n font-size: var(--beam-share-button-fontSize);\n font-weight: var(--beam-share-button-fontWeight);\n margin-top: var(--beam-share-button-marginTop);\n margin-bottom: var(--beam-share-button-marginBottom);\n text-transform: var(--beam-share-button-textTransform);\n line-height: var(--beam-share-button-lineHeight);\n background-color: var(--beam-share-button-backgroundColor);\n color: var(--beam-share-button-color, inherit);\n border-radius: var(--beam-share-button-borderRadius);\n border-color: var(--beam-share-button-borderColor);\n border-width: var(--beam-share-button-borderWidth);\n /* add extra padding on side without icon for optical alignment */\n padding: var(--beam-share-button-padding);\n width: var(--beam-share-button-width);\n transition: 0.15s;\n }\n .share-button:hover {\n background-color: var(--beam-share-button-hover-backgroundColor);\n color: var(--beam-share-button-hover-color);\n border-color: var(--beam-share-button-hover-borderColor);\n }\n .share-button-text {\n text-decoration: var(--beam-share-button-text-textDecoration);\n margin-left: 0.33em;\n }\n .share-button-icon {\n font-size: var(--beam-share-button-icon-size);\n }\n .button {\n cursor: pointer;\n }\n .icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n </style>\n <button\n @click=\"${this.handleShareClick}\"\n baseUrl=\"${this.baseUrl}\"\n class=\"share-button share-button-inline button icon-button\"\n >\n <sl-icon\n name=\"${this.shareIcon}\"\n library=\"lucide\"\n label=\"${strings[this.configLang].impactShareButton()}\"\n class=\"share-button-icon\"\n ></sl-icon>\n <span class=\"share-button-text\">${this.buttonText || strings[this.configLang].impactShareButton()}</span>\n </button>\n <div id=\"modal-root\"></div>\n `;\n }\n}\n\ncustomElements.get(\"beam-share-button\") || customElements.define(\"beam-share-button\", BeamShareButton);\n\nexport const shareButtonConfigDefaults = {\n \"--beam-share-button-fontFamily\": \"inherit\",\n \"--beam-share-button-fontSize\": \"14px\",\n \"--beam-share-button-fontWeight\": \"600\",\n \"--beam-share-button-textTransform\": \"none\",\n \"--beam-share-button-marginTop\": \"10px\",\n \"--beam-share-button-marginBottom\": \"10px\",\n \"--beam-share-button-padding\": \"8px 18px 8px 16px\",\n \"--beam-share-button-lineHeight\": \"inherit\",\n \"--beam-share-button-color\": \"#0A323C\",\n \"--beam-share-button-backgroundColor\": \"#fff\",\n \"--beam-share-button-borderRadius\": \"30px\",\n \"--beam-share-button-borderColor\": \"#0A323C\",\n \"--beam-share-button-borderWidth\": \"1px\",\n\n \"--beam-share-button-width\": \"auto\",\n\n \"--beam-share-button-hover-borderColor\": \"transparent\",\n \"--beam-share-button-hover-backgroundColor\": \"#0A323C\",\n \"--beam-share-button-hover-color\": \"#fff\",\n\n \"--beam-share-button-icon-size\": \"16px\",\n\n \"--beam-share-button-text-textDecoration\": \"none\",\n\n \"--beam-share-dialog-padding\": \"30px 30px\",\n\n \"--beam-share-title-fontSize\": \"30px\",\n \"--beam-share-title-fontWeight\": \"bold\",\n\n \"--beam-share-text-fontSize\": \"16px\",\n \"--beam-share-text-lineHeight\": \"1.3\",\n \"--beam-share-text-marginTop\": \"10px\",\n\n \"--beam-share-image-borderRadius\": \"4px\",\n \"--beam-share-image-width\": \"200px\",\n \"--beam-share-image-margin\": \"20px\",\n\n \"--beam-share-actions-margin\": \"30px 60px\",\n \"--beam-share-action-icon-size\": \"32px\",\n\n \"--beam-share-action-text-fontSize\": \"16px\",\n \"--beam-share-action-text-lineHeight\": \"1.3\",\n \"--beam-share-text-action-marginTop\": \"10px\",\n\n \"--beam-share-close-backgroundColor\": \"#ffd522\",\n \"--beam-share-close-text-color\": \"#000\",\n \"--beam-share-close-padding\": \"12px\",\n \"--beam-share-close-borderRadius\": \"4px\",\n \"--beam-share-close-fontSize\": \"16px\",\n \"--beam-share-close-fontWeight\": \"bold\",\n\n \"--beam-share-close-focus-borderColor\": \"#c2dcff\",\n} as const;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"beam-share-button\": BeamShareButton;\n }\n}\n"],"names":["syncElementHeights","elements","source","els","isAllHtmlElements","syncedHeight","a","b","el","isMobile","v","o","l","e","n","r","i","BeamShareButton","LitElement","DEFAULT_BASE_URL","nonprofitId","storeId","transactionId","baseUrl","apiKey","postSocialShareAnalyticsEvent","err","imageUrl","brandName","existingDialog","modalRoot","file","urlToFile","dataUrl","handleClickClose","handleClickCopy","handleClickDownload","dialogTemplate","html","strings","render","__decorateClass","property","shareButtonConfigDefaults"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as lodash from 'lodash';
|
|
2
|
-
import { g as BeamBaseAPIConfig, h as TCartApi } from './utils-
|
|
2
|
+
import { g as BeamBaseAPIConfig, h as TCartApi, M as MemoizedLast } from './utils-COGFpDER.esm.js';
|
|
3
3
|
|
|
4
4
|
type BeamCartAPIConfig = BeamBaseAPIConfig & {
|
|
5
5
|
storeId: number;
|
|
@@ -20,7 +20,7 @@ type BeamCartValues = {
|
|
|
20
20
|
* const BeamConfig = { apiKey: 'abc-123' }
|
|
21
21
|
* const { beamCartId } = await updateCart(BeamConfig, { beamCartId, itemCount, subtotal, currencyCode })
|
|
22
22
|
* */
|
|
23
|
-
declare const updateCart: lodash.DebouncedFuncLeading<(config: BeamCartAPIConfig, cartValues: BeamCartValues, isFirstCartUpdateOnPageLoad?: any) => Promise<void
|
|
23
|
+
declare const updateCart: lodash.DebouncedFuncLeading<MemoizedLast<(config: BeamCartAPIConfig, cartValues: BeamCartValues, isFirstCartUpdateOnPageLoad?: any) => Promise<void>>>;
|
|
24
24
|
|
|
25
25
|
export { updateCart as u };
|
|
26
26
|
export type { BeamCartAPIConfig as B, BeamCartValues as a };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as L,d as Me}from"./lodash-CrMU6wKg.esm.js";const Ke="https://api.beamimpact.com",Fe="https://production.beamimpactlogs.com",Ue={en:"en",fr:"fr",de:"de",es:"es",it:"it",pl:"pl",ja:"ja"},Je={select_nonprofit:"select-nonprofit",redeem_transaction:"redeem-transaction",impact_overview:"impact-overview",community_impact:"community-impact",cumulative_impact:"cumulative-impact",product_details_page:"product-details-page",subscription_management:"subscription-management",subscription_impact:"subscription-impact",select_subscription_nonprofit:"select-subscription-nonprofit",social_share:"social-share",subscriber_select_nonprofit:"subscriber-select-nonprofit"},De={subscription_management_widget:"subscription_management_widget",subscriber_select_nonprofit_widget:"subscriber_select_nonprofit_widget"},$e={cart_update:"cart_update"},C={TRANSACTION:"transaction",CART:"cart",PROMO:"promos",NONPROFIT:"nonprofit",NONPROFIT_SELECTED_AT:"nonprofit_selected_at",CHAIN_NONPROFITS:"chainNonprofits",REMOTE_SESSION_ID:"remote_session_id"},f={CART:"beam_cart",PROMO_CODES:"beam_promo_codes",SESSION:"beam_session",STATSIG_STABLE_ID:"beam_statsig_session_id"};class l extends Error{constructor(e,{cause:o,name:a="BeamError"}={}){super(e,{cause:o}),this.name=a,this.supportUrl="https://beamimpact.com"}}class R extends l{constructor(e,o,a){super(a,{name:"BeamNetworkError"}),this.response=e,this.body=o}}class x extends l{constructor(e=[],o){super(o,{name:"BeamMissingConfig"}),this.missingConfigKeyNames=e}}class v extends l{constructor(e){super(e,{name:"BeamLocalStorageError"})}}class k extends l{constructor(e){super(e,{name:"BeamSetupError"})}}var T=Object.freeze({__proto__:null,BeamError:l,LocalStorageError:v,MissingConfig:x,NetworkError:R,SetupError:k});const g="\u{1F308} Beam:",d={error:(...t)=>console.error(g,...t),log:(...t)=>console.log(g,...t),warn:(...t)=>console.warn(g,...t),debug:(...t)=>console.debug(g,...t)},M=class he extends CustomEvent{constructor(e){super(he.eventName,{detail:e,bubbles:!0,composed:!0})}};M.eventName="beamnetworkcall";let E=M;const K=class ye extends CustomEvent{constructor(e){super(ye.eventName,{detail:e,bubbles:!0,composed:!0})}};K.eventName="beamnonprofitselect";let F=K;const U=class we extends CustomEvent{constructor(e){super(we.eventName,{detail:e,bubbles:!0,composed:!0})}};U.eventName="beamcartchange";let J=U;const D=class Oe extends CustomEvent{constructor(e){super(Oe.eventName,{detail:e,bubbles:!0,composed:!0})}};D.eventName="beamcartcreated";let $=D;const j=class Ie extends CustomEvent{constructor(e){super(Ie.eventName,{detail:e,bubbles:!0,composed:!0})}};j.eventName="beamordercreated";let q=j;const z=class Ae extends CustomEvent{constructor(e){super(Ae.eventName,{detail:e,bubbles:!0,composed:!0})}};z.eventName="beamstatuschange";let W=z;const G=class Be extends CustomEvent{constructor(e){super(Be.eventName,{detail:e,bubbles:!0,composed:!0})}};G.eventName="beamnonprofitselectionremoved";let H=G;const V=class Le extends CustomEvent{constructor(e){super(Le.eventName,{detail:e,bubbles:!0,composed:!0})}};V.eventName="beampromocodesstored";let X=V;const Y=class Re extends CustomEvent{constructor(e){super(Re.eventName,{detail:e,bubbles:!0,composed:!0})}};Y.eventName="beamwidgetstoredpromocodes";let Q=Y;const Z=class xe extends CustomEvent{constructor(e){super(xe.eventName,{detail:e,bubbles:!0,composed:!0})}};Z.eventName="beamwidgetinitialnonprofitsync";let ee=Z;const te=class ke extends CustomEvent{constructor(e){super(ke.eventName,{detail:e,bubbles:!0,composed:!0})}};te.eventName="beamwidgetinitialnonprofitsynccancel";let oe=te;const re=class Te extends CustomEvent{constructor(e){super(Te.eventName,{detail:e,bubbles:!0,composed:!0})}};re.eventName="beamstatsiginitialized";let ae=re;var se=Object.freeze({__proto__:null,BeamCartChangeEvent:J,BeamCartCreatedEvent:$,BeamNetworkCallEvent:E,BeamNonprofitSelectEvent:F,BeamNonprofitSelectionRemovedEvent:H,BeamOrderCreatedEvent:q,BeamPromoCodesStoredEvent:X,BeamStatsigInitializedEvent:ae,BeamStatusChangeEvent:W,BeamWidgetInitialNonprofitSyncCancelEvent:oe,BeamWidgetInitialNonprofitSyncEvent:ee,BeamWidgetStoredPromoCodesEvent:Q});const je={apply:function(t,e,o){return t(...o).then(a=>{if(a.ok&&S){const r=a.clone();window.dispatchEvent(new E({url:o[0].toString(),method:(o[1]?.method||"get").toLowerCase(),type:"fetch",response:r}))}return a})}},qe={construct(t,e){const o=new t(...e),a=o.open;let r,s;return o.open=function(n,i){r=n,s=i,a.apply(this,arguments)},o.addEventListener("load",()=>{S&&window.dispatchEvent(new E({url:(s||"").toString(),method:(r||"get").toLowerCase(),type:"xhr",xhr:o}))}),o}};let ne=!1,S=!1;const ie=()=>{S=!0,!ne&&(window.fetch=new Proxy(window.fetch,je),XMLHttpRequest=new Proxy(XMLHttpRequest,qe),ne=!0)},me=()=>{S=!1},c=t=>({get prefix(){return"beam_"},get postfix(){return`_key_${t.apiKey}`},getItem(e){return localStorage.getItem(this.prefix+e+this.postfix)},setItem(e,o){return localStorage.setItem(this.prefix+e+this.postfix,`${o}`)},removeItem(e){return localStorage.removeItem(this.prefix+e+this.postfix)},getItemJson(e){try{const o=this.getItem(e);if(o)return JSON.parse(o)}catch{d.error(new v(`Could not parse JSON: ${e}`))}return null},setItemJson(e,o){return this.setItem(e,JSON.stringify(o))}});function ce(t,{timeout:e=1e4}={}){return new Promise((o,a)=>{let r=document.querySelector(t);if(r){o(r);return}let s;const n=setTimeout(()=>{r||(s?.disconnect(),a(new l(`Timed out waiting for '${t}'`)))},e);new MutationObserver((i,m)=>{s=m,Array.from(document.querySelectorAll(t)).forEach(u=>{r=u,o(u),m.disconnect(),clearTimeout(n)})}).observe(document.documentElement,{childList:!0,subtree:!0})})}const P=(t=document.cookie)=>t.split(";").reduce((e,o)=>{const a=o.trim(),[r,...s]=a.split("="),n=decodeURIComponent(s.join("="));return e.set(r,n)},new Map),p=t=>P().get(t),b=t=>{const{name:e,value:o,expires:a,...r}=t,s=encodeURIComponent(o),n=`${e}=${s}`,i=a!=null?` ;expires=${new Date(a).toUTCString()}`:"",m=Object.entries(r).map(([u,B])=>B!=null?` ;${u}=${B}`:"").join("");document.cookie=n+m+i},_=t=>{const{name:e,domain:o,path:a}=t,r={name:e,value:"",expires:0};return a!==void 0&&(r.path=a),o!==void 0&&(r.domain=o),b(r)},de=C.REMOTE_SESSION_ID;function le({remoteSessionId:t,apiKey:e=""}){c({apiKey:e}).setItem(de,t)}function ue({apiKey:t=""}){return c({apiKey:t}).getItem(de)}function pe(t,{isEqual:e=L}={}){let o=null,a=null,r=!1,s=0;const n=(...i)=>{if(r&&e(o,i))return a;const m=t(...i);if(m instanceof Promise){s++;const u=s;m.catch(()=>{u===s&&(r=!1)})}return o=i,a=m,r=!0,m};return n.reset=()=>{s++,o=null,a=null,r=!1},n}var N=(t=>(t.Manual="manual",t.Url="url",t))(N||{});const h=C.PROMO,y=f.PROMO_CODES,ze=100,We="utm_",Ge="discount_code",ve=()=>{const t=p(y);if(t)try{return JSON.parse(t)}catch(e){d.error("Failed to parse beam_promo_codes cookie:",e);return}},Ce=({validatedPromoCodes:t,domain:e})=>{const o={validatedPromoCodes:t},a=Date.now()+1e3*60*60*24*90;b({name:y,value:JSON.stringify(o),path:"/",domain:e,expires:a})},w=({apiKey:t})=>t?c({apiKey:t}).getItemJson(h)??{unvalidatedPromoCodes:[],validatedPromoCodes:[]}:(d.error(new v("API key is required to get promo codes")),null),O=({apiKey:t,promoCodes:e})=>{if(!t){d.error(new v("API key is required to set promo codes"));return}const o=c({apiKey:t}),a={unvalidatedPromoCodes:e?.unvalidatedPromoCodes||[],validatedPromoCodes:e?.validatedPromoCodes||[]};o.setItemJson(h,a)},I=({newPromos:t,apiKey:e})=>{const o=w({apiKey:e})??{unvalidatedPromoCodes:[],validatedPromoCodes:[]},a=(t?.unvalidatedPromoCodes||[]).filter(s=>!o.unvalidatedPromoCodes.some(n=>JSON.stringify(n)===JSON.stringify(s))),r={unvalidatedPromoCodes:[...o.unvalidatedPromoCodes,...a],validatedPromoCodes:[...o.validatedPromoCodes,...t?.validatedPromoCodes||[]]};return(r.unvalidatedPromoCodes.length>0||r.validatedPromoCodes.length>0)&&O({apiKey:e,promoCodes:r}),{...r}},A=t=>t.reduce((e,o)=>{const a=e||[];return o.url?a.push({type:N.Url,attributes:{url:o.url}}):o.value?a.push({type:N.Manual,attributes:{value:o.value}}):d.error("Invalid PromoAttribute - must contain either 'url' or 'value'",{attr:o}),a},[]),ge=(t,e)=>{const o=A(t);return I({newPromos:{unvalidatedPromoCodes:o},apiKey:e})},Ee=t=>{if(!t?.content)return[];const e=t.content.discounts?.filter(r=>r.applicable)?.map(r=>r.code)||[],o=t.content.items?.flatMap(r=>r.discounts?.filter(s=>s.applicable)?.map(s=>s.code)||[])||[],a=[...e,...o];return[...new Set(a)]},Se=()=>p(Ge)??null,be=t=>{if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)&&e.every(o=>typeof o=="string")?e:[]}catch(e){return d.error("Failed to parse JSON:",e),[]}},fe=()=>{try{const t=new URL(window.location.href);if(!t.search)return;const e=new URL(t.origin+t.pathname);let o=!1;t.searchParams.forEach((r,s)=>{const n=s.startsWith(We),i=r.length<=ze;n&&i&&(e.searchParams.append(s,r),o=!0)});const a=e.toString();return o?{url:a}:void 0}catch{return}},Pe=(t,e)=>{const o=a=>(Array.isArray(a)?a:[]).map(r=>r.type==="manual"?r.attributes?.value:r.type==="url"?r.attributes?.url:"").filter(Boolean).sort().join(",");return o(t?.unvalidatedPromoCodes)===o(e?.unvalidatedPromoCodes)},_e=t=>(!t.unvalidatedPromoCodes||t.unvalidatedPromoCodes.length===0)&&(!t.validatedPromoCodes||t.validatedPromoCodes.length===0);function Ne(t){const e=c(t);Object.values(C).forEach(o=>e.removeItem(o)),Object.values(f).forEach(o=>_({name:o,domain:t.domain,path:"/"}))}var He=Object.freeze({__proto__:null,clearBeamStorage:Ne,createScopedLocalStorage:c,debounce:Me,deleteCookieValue:_,errors:T,events:se,formatStoreAndReturnPromoCodes:ge,getAllPromoCodesFromCookie:ve,getCookieMap:P,getCookieValue:p,getPromoCodeFromShopifyCookie:Se,getPromoCodesFromCart:Ee,getPromoCodesLocalStorage:w,getRemoteSession:ue,getSanitizedUrlForStorage:fe,initNetworkListeners:ie,isEmptyPromoData:_e,isEqual:L,logger:d,mapToUnvalidatedPromoCodes:A,memoizeLast:pe,mergeStoreAndReturnPromos:I,parseJsonStringArray:be,promoCodesAreEqual:Pe,saveRemoteSession:le,setCookieValue:b,setPromoCodeInCookie:Ce,setPromoCodesInLocalStorage:O,teardownNetworkListeners:me,waitForElement:ce});const Ve=(t,e)=>c(e).getItemJson("cart")?.beamCartId??p(t)??null,Xe=(t,e)=>c(e).getItemJson("cart")?.cartId??p(t)??null;function Ye(t){return{authorization:`Api-Key ${t}`}}export{A as $,Ve as A,F as B,_e as C,Ke as D,Q as E,be as F,Ee as G,O as H,Ce as I,Xe as J,H as K,C as L,ee as M,oe as N,J as O,x as P,pe as Q,ue as R,k as S,$e as T,E as U,Ne as V,Je as W,me as X,_ as Y,T as Z,ve as _,P as a,I as a0,h as a1,y as a2,R as a3,v as a4,ie as b,W as c,Fe as d,se as e,w as f,p as g,ge as h,He as i,fe as j,Se as k,d as l,X as m,l as n,b as o,Pe as p,f as q,ae as r,le as s,$ as t,q as u,Ue as v,ce as w,Ye as x,De as y,c as z};
|
|
2
|
+
//# sourceMappingURL=utils-C5hmbxa4.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-C5hmbxa4.esm.js","sources":["../../src/api-sdk/constants.ts","../../src/utils/beam-errors.ts","../../src/utils/logger.ts","../../src/utils/events.ts","../../src/utils/network-listeners.ts","../../src/utils/local-storage.ts","../../src/utils/wait-for-element.ts","../../src/utils/cookies.ts","../../src/utils/remote-session.ts","../../src/utils/memoize-last.ts","../../src/shared/promo-types.ts","../../src/utils/promoManager.ts","../../src/utils/clear-beam-storage.ts","../../src/utils/cart.ts","../../src/utils/makeApiKeyHeader.ts"],"sourcesContent":["import { LANGUAGES, TUrl } from \"./types\";\n\nexport const DEFAULT_BASE_URL: TUrl = \"https://api.beamimpact.com\";\n\nexport const DEFAULT_LOG_URL = \"https://production.beamimpactlogs.com\";\n\nexport const SUPPORTED_LANGUAGES: Record<string, LANGUAGES> = {\n en: \"en\",\n fr: \"fr\",\n de: \"de\",\n es: \"es\",\n it: \"it\",\n pl: \"pl\",\n ja: \"ja\",\n};\n\nexport const WIDGET_NAMES = {\n select_nonprofit: \"select-nonprofit\",\n redeem_transaction: \"redeem-transaction\",\n impact_overview: \"impact-overview\",\n community_impact: \"community-impact\",\n cumulative_impact: \"cumulative-impact\",\n product_details_page: \"product-details-page\",\n subscription_management: \"subscription-management\",\n subscription_impact: \"subscription-impact\",\n select_subscription_nonprofit: \"select-subscription-nonprofit\",\n social_share: \"social-share\",\n subscriber_select_nonprofit: \"subscriber-select-nonprofit\",\n} as const;\n\nexport const SELECTION_METHODS = {\n dashboard: \"dashboard\",\n remote_order: \"remote_order\",\n checkout: \"checkout\",\n subscription_management_widget: \"subscription_management_widget\",\n subscriber_select_nonprofit_widget: \"subscriber_select_nonprofit_widget\",\n} as const;\n\nexport const HELPER_NAMES = {\n cart_update: \"cart_update\",\n};\n\n/**\n * Every localStorage key this SDK writes.\n */\nexport const LOCAL_STORAGE_KEYS = {\n // Last selection id\n TRANSACTION: \"transaction\",\n // Cached cart snapshot used to detect changes across page loads/tabs\n CART: \"cart\",\n // Stored promo codes captured for the current cart\n PROMO: \"promos\",\n // Last-selected nonprofit id\n NONPROFIT: \"nonprofit\",\n // Timestamp of that nonprofit selection\n NONPROFIT_SELECTED_AT: \"nonprofit_selected_at\",\n // Cached chain nonprofit list\n CHAIN_NONPROFITS: \"chainNonprofits\",\n // Statsig stable id, mirrored into localStorage for cart-linking\n REMOTE_SESSION_ID: \"remote_session_id\",\n} as const;\n\n/**\n * Every cookie this SDK sets, across the cart integration and its sibling integrations.\n */\nexport const BEAM_COOKIE_NAMES = {\n // Beam's own cart id, used to identify the cart across subdomains\n CART: \"beam_cart\",\n // Promo codes captured for the current cart\n PROMO_CODES: \"beam_promo_codes\",\n // Cross-subdomain session id set by the separate Session integration\n SESSION: \"beam_session\",\n // Statsig A/B stable id, cached in a cookie to persist across subdomains\n STATSIG_STABLE_ID: \"beam_statsig_session_id\",\n} as const;\n","export class BeamError extends Error {\n supportUrl: string;\n constructor(msg?: string, { cause, name = \"BeamError\" }: { cause?: any; name?: string } = {}) {\n super(msg, { cause });\n this.name = name;\n this.supportUrl = \"https://beamimpact.com\";\n }\n}\n\nexport class NetworkError extends BeamError {\n /** Fetch Response object with .ok, .status, etc.*/\n response: Response;\n /** If network response included JSON payload, it is parsed and available here */\n body?: Record<string, string>;\n constructor(response: Response, body?: Record<string, string>, msg?: string) {\n super(msg, { name: \"BeamNetworkError\" });\n this.response = response;\n this.body = body;\n }\n}\n\nexport class MissingConfig extends BeamError {\n missingConfigKeyNames: string[];\n constructor(missingConfigKeyNames: string[] = [], msg?: string) {\n super(msg, { name: \"BeamMissingConfig\" });\n this.missingConfigKeyNames = missingConfigKeyNames;\n }\n}\n\nexport class LocalStorageError extends BeamError {\n constructor(msg?: string) {\n super(msg, { name: \"BeamLocalStorageError\" });\n }\n}\n\nexport class SetupError extends BeamError {\n constructor(msg?: string) {\n super(msg, { name: \"BeamSetupError\" });\n }\n}\n","const LOG_PREFIX = \"🌈 Beam:\";\n\n// This may eventually log output to Beam servers, control log verbosity, etc.\n// For now it is an alias of the default JS console\nexport const logger = {\n error: (...args: any[]) => console.error(LOG_PREFIX, ...args),\n log: (...args: any[]) => console.log(LOG_PREFIX, ...args),\n warn: (...args: any[]) => console.warn(LOG_PREFIX, ...args),\n debug: (...args: any[]) => console.debug(LOG_PREFIX, ...args),\n};\n","import { TCartApi } from \"../shared/cart-contents\";\nimport { TPromoCodeRequest } from \"../shared/promo-types\";\nimport { HelperName, TId, WidgetName } from \"../shared/types\";\n\n/* ------------------------------------------------------------------------------------------------------------------ */\n\ntype NetworkEventDetail =\n | { url: string; method: string; type: \"fetch\"; response: Response }\n | { url: string; method: string; type: \"xhr\"; xhr: XMLHttpRequest };\n\n/**\n * beamnetworkcall\n * Emitted by the Beam network listener whenever any API calls are made on the page\n */\nexport class BeamNetworkCallEvent extends CustomEvent<NetworkEventDetail> {\n static eventName = \"beamnetworkcall\" as const;\n constructor(detail: NetworkEventDetail) {\n super(BeamNetworkCallEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\n\ntype NonprofitSelectDetail = {\n selectionId?: string;\n selectedNonprofitId?: number | null;\n nonprofitName?: string | null;\n source?: WidgetName | null;\n timestamp?: Date;\n};\n\n/**\n * beamnonprofitselect\n * Emitted when the end user selects a nonprofit in the Beam widget, and when the previous selection was restored\n * automatically\n */\nexport class BeamNonprofitSelectEvent extends CustomEvent<NonprofitSelectDetail> {\n static eventName = \"beamnonprofitselect\" as const;\n constructor(detail: NonprofitSelectDetail) {\n super(BeamNonprofitSelectEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\n\ntype CartChangeDetail = TCartApi & {\n cartId?: string;\n subtotal?: number;\n itemCount?: number;\n currencyCode?: string;\n};\n\n/**\n * beamcartchange\n * Emitted when Beam detects that cart contents have changed, and when items are added to the cart for the first time\n */\nexport class BeamCartChangeEvent extends CustomEvent<CartChangeDetail> {\n static eventName = \"beamcartchange\" as const;\n constructor(detail: CartChangeDetail) {\n super(BeamCartChangeEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\n\ntype CartCreatedDetail = CartChangeDetail;\n\n/**\n * beamcartcreated\n * Emitted when a cart is created in Beam for the first time, but NOT when the cart is updated\n * Beam's cart expiration rules are used to determine when a returning visit counts as the same cart\n */\nexport class BeamCartCreatedEvent extends CustomEvent<CartCreatedDetail> {\n static eventName = \"beamcartcreated\" as const;\n constructor(detail: CartCreatedDetail) {\n super(BeamCartCreatedEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\n\ntype OrderCreatedDetail = {\n orderId: TId;\n transactionId: TId;\n cartTotal: number;\n currencyCode: string;\n};\n\n/**\n * beamordercreated\n * Emitted when an order is registered with Beam for the first time, but NOT on repeat visits, page refreshes, etc.\n */\nexport class BeamOrderCreatedEvent extends CustomEvent<OrderCreatedDetail> {\n static eventName = \"beamordercreated\" as const;\n\n constructor(detail: OrderCreatedDetail) {\n super(BeamOrderCreatedEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\n\n/**\n * beamstatuschange\n * Emitted when the Beam config object has finished initializing along with all plugins\n */\ntype BeamStatusChangeEventDetail = { status: \"pending\" } | { status: \"error\"; error: Error } | { status: \"ready\" };\nexport class BeamStatusChangeEvent extends CustomEvent<BeamStatusChangeEventDetail> {\n static eventName = \"beamstatuschange\" as const;\n\n constructor(detail: BeamStatusChangeEventDetail) {\n super(BeamStatusChangeEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\ntype NonprofitSelectionRemovedDetail = {\n previousNonprofitId?: number | null;\n newNonprofitId?: number | null;\n selectionId?: string;\n timestamp?: Date;\n};\n\n/**\n * beamnonprofitselectionremoved\n * Emitted when the nonprofit selection is removed from deselection or due to nonprofit cohort change\n */\nexport class BeamNonprofitSelectionRemovedEvent extends CustomEvent<NonprofitSelectionRemovedDetail> {\n static eventName = \"beamnonprofitselectionremoved\" as const;\n constructor(detail: NonprofitSelectionRemovedDetail) {\n super(BeamNonprofitSelectionRemovedEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\ntype PromoStoredDetail = {\n promoCodes: TPromoCodeRequest;\n};\n/**\n * Emitted when a URL with query parameters is sanitized and stored in localStorage\n *\n * @event beampromocodesstored\n */\nexport class BeamPromoCodesStoredEvent extends CustomEvent<PromoStoredDetail> {\n static eventName = \"beampromocodesstored\";\n\n constructor(detail: PromoStoredDetail) {\n super(BeamPromoCodesStoredEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\n\ntype WidgetStoredPromosDetail = {\n source?: WidgetName | HelperName | null;\n};\n/**\n * Emitted when a widget stores the url or manual promoCodes in local storage\n *\n * @event beamwidgetstoredpromocodes\n */\nexport class BeamWidgetStoredPromoCodesEvent extends CustomEvent<WidgetStoredPromosDetail> {\n static eventName = \"beamwidgetstoredpromocodes\" as const;\n\n constructor(detail: WidgetStoredPromosDetail) {\n super(BeamWidgetStoredPromoCodesEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\ntype WidgetInitialNonprofitSyncDetail = {\n nonprofitId?: number | null;\n nonprofitIdChanged?: boolean;\n selectionId?: string;\n selectionIdChanged?: boolean;\n};\n\n/**\n * [Shopify Specific] - Emitted the first time a widget restores nonprofit selection from custom attributes\n *\n * @event beamwidgetinitialnonprofitsync\n */\nexport class BeamWidgetInitialNonprofitSyncEvent extends CustomEvent<WidgetInitialNonprofitSyncDetail> {\n static eventName = \"beamwidgetinitialnonprofitsync\" as const;\n\n constructor(detail: WidgetInitialNonprofitSyncDetail) {\n super(BeamWidgetInitialNonprofitSyncEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\ntype BeamWidgetInitialNonprofitSyncCancelDetail = {\n cancelled?: boolean;\n};\n\n/**\n * [Shopify Specific] - Allows WidgetInitialNonprofitSyncDetail to be cancelled asynchronously\n *\n * @event beamwidgetinitialnonprofitsynccancel\n */\nexport class BeamWidgetInitialNonprofitSyncCancelEvent extends CustomEvent<BeamWidgetInitialNonprofitSyncCancelDetail> {\n static eventName = \"beamwidgetinitialnonprofitsynccancel\" as const;\n\n constructor(detail: BeamWidgetInitialNonprofitSyncCancelDetail) {\n super(BeamWidgetInitialNonprofitSyncCancelEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n\n/* ------------------------------------------------------------------------------------------------------------------ */\ntype BeamStatsigInitializedDetail = {\n showBeam: boolean;\n stableId?: string;\n};\n\n/**\n * Fired when Statsig experiment assignments for Beam are initialized\n *\n * @event beamstatsiginitialized\n */\nexport class BeamStatsigInitializedEvent extends CustomEvent<BeamStatsigInitializedDetail> {\n static eventName = \"beamstatsiginitialized\" as const;\n\n constructor(detail: BeamStatsigInitializedDetail) {\n super(BeamStatsigInitializedEvent.eventName, { detail, bubbles: true, composed: true });\n }\n}\n","import { BeamNetworkCallEvent } from \"./events\";\n\n/**\n * Fetch Listener\n */\n\nconst fetchHandler = {\n apply: function (target: any, _thisArg: any, args: any[]) {\n return target(...args).then((response: Response) => {\n if (response.ok && networkListenersEnabled) {\n const responseCopy = response.clone();\n window.dispatchEvent(\n new BeamNetworkCallEvent({\n url: args[0].toString(),\n method: (args[1]?.method || \"get\").toLowerCase(),\n type: \"fetch\",\n response: responseCopy,\n }),\n );\n }\n return response;\n });\n },\n};\n\n/**\n * XMLHTTPRequest Listener\n */\nconst xhrHandler = {\n construct(TargetConstructor: any, args: any[]) {\n const xhr: XMLHttpRequest = new TargetConstructor(...args);\n const _open: (method: string, url: string | URL) => void = xhr.open;\n let _method: string;\n let _url: string | URL;\n\n xhr.open = function (method: string, url: string | URL) {\n _method = method;\n _url = url;\n // @ts-expect-error arguments is untyped since xhr.open is an overloaded method\n // eslint-disable-next-line prefer-rest-params\n _open.apply(this, arguments);\n };\n\n // The enabled flag is checked at dispatch time (inside the load callback),\n // so XHRs constructed before an opt-out also go quiet once torn down.\n xhr.addEventListener(\"load\", () => {\n if (!networkListenersEnabled) return;\n window.dispatchEvent(\n new BeamNetworkCallEvent({\n url: (_url || \"\").toString(),\n method: (_method || \"get\").toLowerCase(),\n type: \"xhr\",\n xhr,\n }),\n );\n });\n\n return xhr;\n },\n};\n\n/**\n * Side-Effects Setup (initialize listeners)\n */\n\nlet initializedListeners = false; // Proxies installed once, ever (never un-patched)\nlet networkListenersEnabled = false; // whether the Proxies currently dispatch Beam events\n\nexport const initNetworkListeners = () => {\n networkListenersEnabled = true;\n\n if (initializedListeners) return; // Proxies already installed; dispatching just re-enabled\n window.fetch = new Proxy(window.fetch, fetchHandler);\n XMLHttpRequest = new Proxy(XMLHttpRequest, xhrHandler);\n initializedListeners = true;\n};\n\n/**\n * Disables Beam event dispatching from the fetch/XHR Proxies without\n * un-patching them (un-patching is unsafe if another script wrapped\n * fetch/XHR after us — restoring our saved reference would remove\n * their wrapper too).\n */\nexport const teardownNetworkListeners = () => {\n networkListenersEnabled = false;\n};\n","import { LocalStorageError } from \"./beam-errors\";\nimport { logger } from \"./logger\";\n\n/**\n * Creates an object that has the same API as normal localStorage, but adds a beam_ prefix and apiKey postfix to keys\n * Also adds helper methods for JSON (de-)serialization\n */\nexport const createScopedLocalStorage = (config: { apiKey: string }) => {\n return {\n get prefix() {\n return `beam_`;\n },\n get postfix() {\n return `_key_${config.apiKey}`;\n },\n getItem(key: string): string | null {\n return localStorage.getItem(this.prefix + key + this.postfix);\n },\n setItem(key: string, value: unknown) {\n return localStorage.setItem(this.prefix + key + this.postfix, `${value}`);\n },\n removeItem(key: string) {\n return localStorage.removeItem(this.prefix + key + this.postfix);\n },\n /** Safely parses value as JSON and return JS object */\n getItemJson<T = Record<string, unknown>>(key: string) {\n try {\n const json = this.getItem(key);\n if (json) {\n return JSON.parse(json) as T;\n }\n } catch (err) {\n logger.error(new LocalStorageError(`Could not parse JSON: ${key}`));\n }\n return null;\n },\n /** Safely stringifies value as JSON */\n setItemJson(key: string, value: object) {\n return this.setItem(key, JSON.stringify(value));\n },\n };\n};\n","// Based on https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e (MIT License, JWilson)\n\nimport { BeamError } from \"./beam-errors\";\n\nexport function waitForElement(selector: string, { timeout = 10000 } = {}): Promise<Element> {\n return new Promise((resolve, reject) => {\n let el = document.querySelector(selector);\n if (el) {\n resolve(el);\n return;\n }\n\n let mutationObserver: MutationObserver;\n\n const timer = setTimeout(() => {\n if (el) return; // no need to reject\n mutationObserver?.disconnect();\n reject(new BeamError(`Timed out waiting for '${selector}'`));\n }, timeout);\n\n new MutationObserver((_mutationRecords, observer) => {\n mutationObserver = observer;\n // Query for elements matching the specified selector\n Array.from(document.querySelectorAll(selector)).forEach((element) => {\n el = element;\n resolve(element);\n // Once we have resolved we don't need the observer anymore.\n observer.disconnect();\n clearTimeout(timer);\n });\n }).observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n });\n}\n","/*\n * Wrapper functions for CookieStore using document.cookie as a fallback if not supported\n */\n\nexport const getCookieMap = (cookieString = document.cookie) => {\n // document.cookie has the format: \"key1=value1; key2=value2; key3=value3\"\n return cookieString.split(\";\").reduce((result: Map<string, string>, next: string) => {\n const cookieKeyValuePair = next.trim(); // \" key=value \" => \"key=value\"\n const [key, ...restOfString] = cookieKeyValuePair.split(\"=\"); // [\"key\", [\"value\"]]\n const value = decodeURIComponent(restOfString.join(\"=\")); // .join() handles if value contained \"=\"\n return result.set(key, value);\n }, new Map<string, string>());\n};\n\nexport const getCookieValue = (name: string): string | undefined => {\n // New Async API, not supported in FF/Safari:\n // if (window.cookieStore) {\n // return (await window.cookieStore.get(name))?.value;\n // }\n return getCookieMap().get(name);\n};\n\nexport const setCookieValue = (options: CookieInit): undefined => {\n // New Async API, not supported in FF/Safari:\n // if (window.cookieStore) {\n // const { domain, ...rest } = options;\n // const validatedDomain = domain === \"localhost\" ? undefined : domain;\n // return await window.cookieStore.set({ ...rest, domain: validatedDomain });\n // }\n // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#write_a_new_cookie\n const { name, value, expires, ...rest } = options;\n const encodedValue = encodeURIComponent(value);\n const base = `${name}=${encodedValue}`;\n const expiration = expires != null ? ` ;expires=${new Date(expires).toUTCString()}` : \"\";\n const modifiers = Object.entries(rest)\n .map(([key, val]) => (val != null ? ` ;${key}=${val}` : \"\"))\n .join(\"\");\n document.cookie = base + modifiers + expiration;\n return;\n};\n\nexport const deleteCookieValue = (options: { name: string; domain?: string; path?: string }): undefined => {\n const { name, domain, path } = options;\n const cookieOptions: any = {\n name: name,\n value: \"\",\n expires: 0,\n };\n if (path !== undefined) {\n cookieOptions.path = path;\n }\n if (domain !== undefined) {\n cookieOptions.domain = domain;\n }\n return setCookieValue(cookieOptions);\n};\n\ninterface CookieInit {\n name: string;\n value: string;\n path?: string;\n domain?: string;\n expires?: number; // timestamp, unix time in ms\n sameSite?: \"strict\" | \"lax\" | \"none\";\n}\n","import { LOCAL_STORAGE_KEYS } from \"../api-sdk/constants\";\nimport { createScopedLocalStorage } from \"./local-storage\";\n\nconst REMOTE_SESSION_ID_KEY = LOCAL_STORAGE_KEYS.REMOTE_SESSION_ID;\n\nexport function saveRemoteSession({ remoteSessionId, apiKey = \"\" }: { remoteSessionId: string; apiKey?: string }) {\n const beamLocalStorage = createScopedLocalStorage({\n apiKey,\n });\n beamLocalStorage.setItem(REMOTE_SESSION_ID_KEY, remoteSessionId);\n}\n\nexport function getRemoteSession({ apiKey = \"\" }: { apiKey?: string }) {\n const beamLocalStorage = createScopedLocalStorage({\n apiKey,\n });\n return beamLocalStorage.getItem(REMOTE_SESSION_ID_KEY);\n}\n","import { isEqual as defaultIsEqual } from \"./is-equal\";\n\ntype Func<T extends any[], R> = (...args: T) => R;\n\n/**\n * Takes a function and returns a new memoized function.\n * If the same arguments are passed to the memoized function, it will return the previously computed result.\n * This is a \"memoize once\" function meaning it only compares the previous and current arguments, not historic values.\n * Results that throw errors or return rejected Promises are not cached.\n *\n * @param {Function} fn - The function to be memoized.\n * @param {(value: any) => boolean} [isEqual]- The equality function used to compare arguments.\n * @returns {Function} - The memoized function.\n * @param func\n */\nexport function memoizeLast<T extends any[], R>(\n func: Func<T, R>,\n { isEqual = defaultIsEqual } = {},\n): MemoizedLast<Func<T, R>> {\n let lastArgs: T | null = null;\n let lastResult: R | null = null;\n let hasResult = false; // Separate variable to track whether lastResult exists because lastResult could be falsy\n let promiseCounter = 0; // Used to keep track of result order in async invocation so we know to replace cache or not\n\n const memoized = (...args: T): R => {\n if (hasResult && isEqual(lastArgs, args)) {\n return lastResult as R;\n }\n\n const result = func(...args); // Errors here are not caught, so result will not cache if there is an error\n\n if (result instanceof Promise) {\n promiseCounter++;\n const promiseCounterAtStart = promiseCounter;\n result.catch(() => {\n // Don't return cached result next time if the Promise rejects, unless a new Promise has already replaced\n // the one that rejected\n if (promiseCounterAtStart === promiseCounter) {\n hasResult = false;\n }\n });\n }\n\n // Cache the latest args and result.\n lastArgs = args;\n lastResult = result;\n hasResult = true;\n\n return result;\n };\n\n memoized.reset = () => {\n // Bump the counter so a rejection from a still-in-flight call can't clear a fresher cache entry\n promiseCounter++;\n lastArgs = null;\n lastResult = null;\n hasResult = false;\n };\n\n return memoized;\n}\n\nexport type MemoizedLast<T extends (...args: any[]) => any> = T & {\n /** Clears the cached args/result so the next call always executes. */\n reset: () => void;\n};\n","import { paths } from \"../api-sdk/openapi-spec\";\nimport { LOCAL_STORAGE_KEYS, BEAM_COOKIE_NAMES } from \"../api-sdk/constants\";\nexport type TPromoCodeRequest =\n paths[\"/productDetailsPage\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"][\"promos\"];\nexport type TUnvalidatedPromoRequest = NonNullable<TPromoCodeRequest>[\"unvalidatedPromoCodes\"];\n\nexport type TPromoCodeAttribute = { value: string; url?: never } | { url: string; value?: never };\n\nexport type TPromoCodeResponse =\n paths[\"/productDetailsPage\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"][\"promos\"];\nexport type TValidatedPromoResponse = NonNullable<TPromoCodeResponse>[\"validatedPromoCodes\"];\n\nexport enum PromoCodeSource {\n Manual = \"manual\",\n Url = \"url\",\n}\n\ntype TManualPromoCode = {\n type: \"manual\";\n attributes: { value: string };\n};\n\ntype TUrlPromoCode = {\n type: \"url\";\n attributes: { url: string };\n};\n\nexport type TUnvalidatedPromoCode = TManualPromoCode | TUrlPromoCode;\n\nexport const PROMO_LOCAL_STORAGE_KEY = LOCAL_STORAGE_KEYS.PROMO;\nexport const PROMO_CODES_COOKIE_NAME = BEAM_COOKIE_NAMES.PROMO_CODES;\n","import { Discount, TBeamCartLocalStorage } from \"../shared/cart-contents\";\nimport {\n TPromoCodeAttribute,\n PromoCodeSource,\n TPromoCodeRequest,\n TPromoCodeResponse,\n TValidatedPromoResponse,\n TUnvalidatedPromoRequest,\n PROMO_LOCAL_STORAGE_KEY,\n PROMO_CODES_COOKIE_NAME,\n TUnvalidatedPromoCode,\n} from \"../shared/promo-types\";\nimport { LocalStorageError } from \"./beam-errors\";\nimport { getCookieValue, setCookieValue } from \"./cookies\";\nimport { createScopedLocalStorage } from \"./local-storage\";\nimport { logger } from \"./logger\";\n\nconst URL_QUERY_PARAM_CHAR_LIMIT = 100;\nconst ALLOWED_URL_PREFIX = \"utm_\";\n// Standard name for Shopify's discount tracking cookie\nconst DISCOUNT_CODE_COOKIE_NAME = \"discount_code\";\n// < --------- Cookie ------- >\n\n/**\n * Retrieves all validated promo codes stored in the \"beam_promo_codes\" cookie and parses it\n *\n * @returns {TPromoCodeResponse | undefined} An array of `ValidatedPromoCode` objects if found and parsed successfully, otherwise `undefined`\n */\nexport const getAllPromoCodesFromCookie = (): TPromoCodeResponse | undefined => {\n const promoCodesString = getCookieValue(PROMO_CODES_COOKIE_NAME);\n\n if (!promoCodesString) return undefined;\n\n try {\n const promoCodes: TPromoCodeResponse = JSON.parse(promoCodesString);\n return promoCodes;\n } catch (error) {\n logger.error(\"Failed to parse beam_promo_codes cookie:\", error);\n return undefined;\n }\n};\n\n/**\n * Stores the validated promo codes in the \"beam_promo_codes\" cookie, replaces and does not merge\n *\n * @param {TValidatedPromoResponse} validatedPromoCodes\n * @param {string} domain\n */\nexport const setPromoCodeInCookie = ({\n validatedPromoCodes,\n domain,\n}: {\n validatedPromoCodes: TValidatedPromoResponse;\n domain?: string;\n}) => {\n const promoCodeData = {\n validatedPromoCodes: validatedPromoCodes,\n };\n const threeMonthsFromNow = Date.now() + 1000 * 60 * 60 * 24 * 90;\n\n setCookieValue({\n name: PROMO_CODES_COOKIE_NAME,\n value: JSON.stringify(promoCodeData),\n path: \"/\",\n domain,\n // If we don't set an expiration, the cookie will be cleared when the tab is closed\n expires: threeMonthsFromNow,\n });\n};\n\n// < --------- Local Storage ------- >\n/**\n * Retrieves promo codes from localStorage, scoped by API key\n * @param {string} apiKey API key used for storage scoping\n * @returns {TPromoCodeRequest | null} - Returns stored promo codes object containing both\n * validated and unvalidated codes\n * - If no codes exist, returns a fresh object with empty arrays\n *\n */\nexport const getPromoCodesLocalStorage = ({ apiKey }: { apiKey: string }): TPromoCodeRequest | null => {\n if (!apiKey) {\n logger.error(new LocalStorageError(\"API key is required to get promo codes\"));\n return null;\n }\n\n const storage = createScopedLocalStorage({ apiKey });\n const allPromos = storage.getItemJson<TPromoCodeRequest>(PROMO_LOCAL_STORAGE_KEY) ?? {\n unvalidatedPromoCodes: [],\n validatedPromoCodes: [],\n };\n\n return allPromos;\n};\n\n/**\n * Sets promo codes in localStorage\n * @param {TPromoCodeRequest} promoCodes New promo codes to add\n * @param {string} apiKey API key for storage scoping\n */\nexport const setPromoCodesInLocalStorage = ({\n apiKey,\n promoCodes,\n}: {\n apiKey?: string;\n promoCodes: Partial<TPromoCodeRequest>;\n}): void => {\n if (!apiKey) {\n logger.error(new LocalStorageError(\"API key is required to set promo codes\"));\n return;\n }\n const storage = createScopedLocalStorage({ apiKey });\n const completePromoCodes: TPromoCodeRequest = {\n unvalidatedPromoCodes: promoCodes?.unvalidatedPromoCodes || [],\n validatedPromoCodes: promoCodes?.validatedPromoCodes || [],\n };\n storage.setItemJson(PROMO_LOCAL_STORAGE_KEY, completePromoCodes);\n};\n\n/**\n * Merges new promo codes with existing ones and returns the combined result\n * @param {Partial<TPromoCodeRequest>} newPromos New promo codes to add\n * @param {string} apiKey API key for storage scoping\n * @returns {TPromoCodeRequest} An object containing both validated and unvalidated promo codes\n * @example\n * const result = mergePromoCodes({\n * apiKey: 'beam_123',\n * newPromos: {\n * unvalidatedPromoCodes: [\n * { type: 'manual', attributes: { value: 'WINTER20' } },\n * { type: 'url', attributes: { url: 'www.example.com/?promo=HOLIDAY25' } }\n * ]\n * }\n * });\n */\nexport const mergeStoreAndReturnPromos = ({\n newPromos,\n apiKey,\n}: {\n newPromos: Partial<TPromoCodeRequest>;\n apiKey: string;\n}): TPromoCodeRequest => {\n const existing = getPromoCodesLocalStorage({ apiKey }) ?? {\n unvalidatedPromoCodes: [],\n validatedPromoCodes: [],\n };\n\n const uniqueNewUnvalidatedPromos = (newPromos?.unvalidatedPromoCodes || []).filter((newPromo) => {\n const isDuplicate = existing.unvalidatedPromoCodes.some((existingPromo) => {\n return JSON.stringify(existingPromo) === JSON.stringify(newPromo);\n });\n return !isDuplicate;\n });\n\n const mergedCodes: TPromoCodeRequest = {\n unvalidatedPromoCodes: [...existing.unvalidatedPromoCodes, ...uniqueNewUnvalidatedPromos],\n validatedPromoCodes: [...existing.validatedPromoCodes, ...(newPromos?.validatedPromoCodes || [])],\n };\n\n const shouldStore = mergedCodes.unvalidatedPromoCodes.length > 0 || mergedCodes.validatedPromoCodes.length > 0;\n\n if (shouldStore) {\n setPromoCodesInLocalStorage({ apiKey, promoCodes: mergedCodes });\n }\n return {\n ...mergedCodes,\n };\n};\n\n/**\n * Formats unvalidated promo codes by determining their source and attributes\n * The function will assign `QueryParam` as the source if a `url` exists,\n * otherwise, it will assign `Manual` as the source\n *\n * @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted\n * @returns {TUnvalidatedPromoRequest} - An array of UnvalidatedPromoCode objects,\n * each with a source and attributes object\n */\nexport const mapToUnvalidatedPromoCodes = (promoAttributes: TPromoCodeAttribute[]): TUnvalidatedPromoRequest => {\n return promoAttributes.reduce<TUnvalidatedPromoRequest>((acc, attr) => {\n const result: TUnvalidatedPromoRequest = acc || [];\n if (attr.url) {\n result.push({\n type: PromoCodeSource.Url,\n attributes: { url: attr.url },\n });\n } else if (attr.value) {\n result.push({\n type: PromoCodeSource.Manual,\n attributes: { value: attr.value },\n });\n } else {\n logger.error(\"Invalid PromoAttribute - must contain either 'url' or 'value'\", { attr });\n }\n return result;\n }, []);\n};\n\n/**\n * @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted\n * @param {string} apiKey API key for storage scoping\n * @returns {TPromoCodeRequest} An object containing both validated and unvalidated promo codes\n */\nexport const formatStoreAndReturnPromoCodes = (\n promoAttributes: TPromoCodeAttribute[],\n apiKey: string,\n): TPromoCodeRequest => {\n const unvalidatedPromoCodes = mapToUnvalidatedPromoCodes(promoAttributes);\n return mergeStoreAndReturnPromos({ newPromos: { unvalidatedPromoCodes }, apiKey });\n};\n\n/**\n * Extracts applicable promo codes from the cart object\n * This function retrieves discounts stored in the cart's `content.discounts` array,\n * filters out only the applicable promo codes, and returns them as an array of strings\n *\n * @param {TBeamCartLocalStorage} cart The cart object retrieved from local storage\n * @returns {string[]} An array of applicable promo codes\n */\nexport const getPromoCodesFromCart = (cart: TBeamCartLocalStorage): string[] => {\n if (!cart?.content) return [];\n\n const cartLevelCodes = cart.content.discounts?.filter((d) => d.applicable)?.map((d) => d.code) || [];\n\n const itemLevelCodes =\n cart.content.items?.flatMap(\n (item) => item.discounts?.filter((d: Discount) => d.applicable)?.map((d: Discount) => d.code) || [],\n ) || [];\n\n const allCodes = [...cartLevelCodes, ...itemLevelCodes];\n\n return [...new Set(allCodes)];\n};\n\n/**\n * Gets promo code exclusively from Shopify discount cookie\n * @returns {string | null} Single discount code or null if not found\n */\nexport const getPromoCodeFromShopifyCookie = (): string | null => {\n return getCookieValue(DISCOUNT_CODE_COOKIE_NAME) ?? null;\n};\n\n/**\n * Safely parses a JSON string into an array of strings\n * If parsing fails or the input is not a valid JSON array, it returns an empty array\n *\n * @param {string | undefined | null} jsonString The JSON string to parse\n * @returns {string[]} The parsed array of strings or an empty array if parsing fails\n */\nexport const parseJsonStringArray = (jsonString: string | undefined | null): string[] => {\n if (!jsonString) return [];\n try {\n const parsed = JSON.parse(jsonString);\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\")) {\n return parsed;\n }\n return [];\n } catch (error) {\n logger.error(\"Failed to parse JSON:\", error);\n return [];\n }\n};\n\n/**\n * Retrieves and sanitizes the current URL for storage, preserving only safe query parameters\n *\n * @returns {TPromoCodeAttribute} Returns an object with only the `url` property set\n */\nexport const getSanitizedUrlForStorage = (): TPromoCodeAttribute | undefined => {\n try {\n const url = new URL(window.location.href);\n\n if (!url.search) return undefined;\n\n // Create NEW URL instead of modifying existing one\n const cleanUrl = new URL(url.origin + url.pathname);\n let hasValidParams = false;\n\n // Process all parameters\n url.searchParams.forEach((value, key) => {\n const isAllowed = key.startsWith(ALLOWED_URL_PREFIX);\n const isValidLength = value.length <= URL_QUERY_PARAM_CHAR_LIMIT;\n\n if (isAllowed && isValidLength) {\n cleanUrl.searchParams.append(key, value);\n hasValidParams = true;\n }\n });\n\n const finalUrl = cleanUrl.toString();\n return hasValidParams ? { url: finalUrl } : undefined;\n } catch (error) {\n return undefined;\n }\n};\n\nexport const promoCodesAreEqual = (a: TPromoCodeRequest, b: TPromoCodeRequest): boolean => {\n const extract = (codes: unknown): string => {\n const validCodes = (Array.isArray(codes) ? codes : []) as TUnvalidatedPromoCode[];\n\n const flattened = validCodes\n .map((c) => {\n if (c.type === \"manual\") {\n return c.attributes?.value;\n }\n if (c.type === \"url\") {\n return c.attributes?.url;\n }\n return \"\";\n })\n .filter(Boolean)\n .sort()\n .join(\",\");\n return flattened;\n };\n\n return extract(a?.unvalidatedPromoCodes) === extract(b?.unvalidatedPromoCodes);\n};\n\nexport const isEmptyPromoData = (promos: {\n unvalidatedPromoCodes?: unknown[];\n validatedPromoCodes?: unknown[];\n}): boolean => {\n return (\n (!promos.unvalidatedPromoCodes || promos.unvalidatedPromoCodes.length === 0) &&\n (!promos.validatedPromoCodes || promos.validatedPromoCodes.length === 0)\n );\n};\n","import { LOCAL_STORAGE_KEYS, BEAM_COOKIE_NAMES } from \"../api-sdk/constants\";\nimport { createScopedLocalStorage } from \"./local-storage\";\nimport { deleteCookieValue } from \"./cookies\";\n\n/**\n * Clears every piece of Beam-related browser state this SDK writes, by iterating the\n * LOCAL_STORAGE_KEYS/BEAM_COOKIE_NAMES registries (src/api-sdk/constants.ts) directly —\n * anything added to those objects is cleared automatically, with nothing to update here.\n *\n * Not tied to any one integration's lifecycle (e.g. registerCartIntegration/\n * unregisterCartIntegration) — safe to call on its own, from any integration or directly,\n * whenever a full reset of Beam's local footprint is needed.\n */\nexport function clearBeamStorage(config: { apiKey: string; domain?: string }) {\n const localStorage = createScopedLocalStorage(config);\n Object.values(LOCAL_STORAGE_KEYS).forEach((key) => localStorage.removeItem(key));\n Object.values(BEAM_COOKIE_NAMES).forEach((name) => deleteCookieValue({ name, domain: config.domain, path: \"/\" }));\n}\n","import { TBeamCartLocalStorage } from \"../shared/cart-contents\";\nimport { getCookieValue } from \"./cookies\";\nimport { createScopedLocalStorage } from \"./local-storage\";\n\n/**\n * Retrieves the Beam cart ID from cookies\n * @param CART_COOKIE_NAME - The name of the cookie that stores the Beam cart ID\n * @returns The Beam cart ID if present in cookies or local storage, otherwise null\n */\nexport const getBeamCartId = (CART_COOKIE_NAME: string, config: { apiKey: string }): string | null => {\n const localStorage = createScopedLocalStorage(config);\n\n // The cart cache is used to detect changes after page refreshes / across tabs\n const cachedCart: TBeamCartLocalStorage | null = localStorage.getItemJson(\"cart\");\n\n // Get the Beam cart cookie\n const beamCartId: string | null = cachedCart?.beamCartId ?? getCookieValue(CART_COOKIE_NAME) ?? null;\n return beamCartId;\n};\n\n/**\n * Retrieves the external cart ID\n * @param CART_COOKIE_NAME - The name of the cookie that stores the external cart ID\n * @returns The external cart ID if available or null if neither is available\n */\nexport const getExternalCartId = (CART_COOKIE_NAME: string, config: { apiKey: string }): string | null => {\n const localStorage = createScopedLocalStorage(config);\n\n // The cart cache is used to detect changes after page refreshes / across tabs\n const cachedCart: TBeamCartLocalStorage | null = localStorage.getItemJson(\"cart\");\n\n // Get external cart cookie\n const externalCartId: string | null = cachedCart?.cartId ?? getCookieValue(CART_COOKIE_NAME) ?? null;\n return externalCartId;\n};\n","export function makeApiKeyHeader(apiKey: string) {\n return {\n authorization: `Api-Key ${apiKey}`,\n };\n}\n"],"names":["DEFAULT_BASE_URL","DEFAULT_LOG_URL","SUPPORTED_LANGUAGES","WIDGET_NAMES","SELECTION_METHODS","HELPER_NAMES","LOCAL_STORAGE_KEYS","BEAM_COOKIE_NAMES","BeamError","msg","cause","name","NetworkError","response","body","MissingConfig","missingConfigKeyNames","LocalStorageError","SetupError","LOG_PREFIX","logger","args","_BeamNetworkCallEvent","detail","BeamNetworkCallEvent","_BeamNonprofitSelectEvent","BeamNonprofitSelectEvent","_BeamCartChangeEvent","BeamCartChangeEvent","_BeamCartCreatedEvent","BeamCartCreatedEvent","_BeamOrderCreatedEvent","BeamOrderCreatedEvent","_BeamStatusChangeEvent","BeamStatusChangeEvent","_BeamNonprofitSelectionRemovedEvent","BeamNonprofitSelectionRemovedEvent","_BeamPromoCodesStoredEvent","BeamPromoCodesStoredEvent","_BeamWidgetStoredPromoCodesEvent","BeamWidgetStoredPromoCodesEvent","_BeamWidgetInitialNonprofitSyncEvent","BeamWidgetInitialNonprofitSyncEvent","_BeamWidgetInitialNonprofitSyncCancelEvent","BeamWidgetInitialNonprofitSyncCancelEvent","_BeamStatsigInitializedEvent","BeamStatsigInitializedEvent","fetchHandler","target","_thisArg","networkListenersEnabled","responseCopy","xhrHandler","TargetConstructor","xhr","_open","_method","_url","method","url","initializedListeners","initNetworkListeners","teardownNetworkListeners","createScopedLocalStorage","config","key","value","json","waitForElement","selector","timeout","resolve","reject","el","mutationObserver","timer","_mutationRecords","observer","element","getCookieMap","cookieString","result","next","cookieKeyValuePair","restOfString","getCookieValue","setCookieValue","options","expires","rest","encodedValue","base","expiration","modifiers","val","deleteCookieValue","domain","path","cookieOptions","REMOTE_SESSION_ID_KEY","saveRemoteSession","remoteSessionId","apiKey","getRemoteSession","memoizeLast","func","isEqual","defaultIsEqual","lastArgs","lastResult","hasResult","promiseCounter","memoized","promiseCounterAtStart","PromoCodeSource","PROMO_LOCAL_STORAGE_KEY","PROMO_CODES_COOKIE_NAME","URL_QUERY_PARAM_CHAR_LIMIT","ALLOWED_URL_PREFIX","DISCOUNT_CODE_COOKIE_NAME","getAllPromoCodesFromCookie","promoCodesString","error","setPromoCodeInCookie","validatedPromoCodes","promoCodeData","threeMonthsFromNow","getPromoCodesLocalStorage","setPromoCodesInLocalStorage","promoCodes","storage","completePromoCodes","mergeStoreAndReturnPromos","newPromos","existing","uniqueNewUnvalidatedPromos","newPromo","existingPromo","mergedCodes","mapToUnvalidatedPromoCodes","promoAttributes","acc","attr","formatStoreAndReturnPromoCodes","unvalidatedPromoCodes","getPromoCodesFromCart","cart","cartLevelCodes","d","itemLevelCodes","item","allCodes","getPromoCodeFromShopifyCookie","parseJsonStringArray","jsonString","parsed","getSanitizedUrlForStorage","cleanUrl","hasValidParams","isAllowed","isValidLength","finalUrl","promoCodesAreEqual","a","b","extract","codes","c","isEmptyPromoData","promos","clearBeamStorage","localStorage","getBeamCartId","CART_COOKIE_NAME","getExternalCartId","makeApiKeyHeader"],"mappings":"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"}
|
|
@@ -8149,6 +8149,51 @@ type TBeamCartLocalStorage = {
|
|
|
8149
8149
|
currencyCode: string;
|
|
8150
8150
|
} & TCart;
|
|
8151
8151
|
|
|
8152
|
+
declare class BeamError extends Error {
|
|
8153
|
+
supportUrl: string;
|
|
8154
|
+
constructor(msg?: string, { cause, name }?: {
|
|
8155
|
+
cause?: any;
|
|
8156
|
+
name?: string;
|
|
8157
|
+
});
|
|
8158
|
+
}
|
|
8159
|
+
declare class NetworkError extends BeamError {
|
|
8160
|
+
/** Fetch Response object with .ok, .status, etc.*/
|
|
8161
|
+
response: Response;
|
|
8162
|
+
/** If network response included JSON payload, it is parsed and available here */
|
|
8163
|
+
body?: Record<string, string>;
|
|
8164
|
+
constructor(response: Response, body?: Record<string, string>, msg?: string);
|
|
8165
|
+
}
|
|
8166
|
+
declare class MissingConfig extends BeamError {
|
|
8167
|
+
missingConfigKeyNames: string[];
|
|
8168
|
+
constructor(missingConfigKeyNames?: string[], msg?: string);
|
|
8169
|
+
}
|
|
8170
|
+
declare class LocalStorageError extends BeamError {
|
|
8171
|
+
constructor(msg?: string);
|
|
8172
|
+
}
|
|
8173
|
+
declare class SetupError extends BeamError {
|
|
8174
|
+
constructor(msg?: string);
|
|
8175
|
+
}
|
|
8176
|
+
|
|
8177
|
+
type beamErrors_BeamError = BeamError;
|
|
8178
|
+
declare const beamErrors_BeamError: typeof BeamError;
|
|
8179
|
+
type beamErrors_LocalStorageError = LocalStorageError;
|
|
8180
|
+
declare const beamErrors_LocalStorageError: typeof LocalStorageError;
|
|
8181
|
+
type beamErrors_MissingConfig = MissingConfig;
|
|
8182
|
+
declare const beamErrors_MissingConfig: typeof MissingConfig;
|
|
8183
|
+
type beamErrors_NetworkError = NetworkError;
|
|
8184
|
+
declare const beamErrors_NetworkError: typeof NetworkError;
|
|
8185
|
+
type beamErrors_SetupError = SetupError;
|
|
8186
|
+
declare const beamErrors_SetupError: typeof SetupError;
|
|
8187
|
+
declare namespace beamErrors {
|
|
8188
|
+
export {
|
|
8189
|
+
beamErrors_BeamError as BeamError,
|
|
8190
|
+
beamErrors_LocalStorageError as LocalStorageError,
|
|
8191
|
+
beamErrors_MissingConfig as MissingConfig,
|
|
8192
|
+
beamErrors_NetworkError as NetworkError,
|
|
8193
|
+
beamErrors_SetupError as SetupError,
|
|
8194
|
+
};
|
|
8195
|
+
}
|
|
8196
|
+
|
|
8152
8197
|
type TPromoCodeRequest = paths["/productDetailsPage"]["post"]["requestBody"]["content"]["application/json"]["promos"];
|
|
8153
8198
|
type TUnvalidatedPromoRequest = NonNullable<TPromoCodeRequest>["unvalidatedPromoCodes"];
|
|
8154
8199
|
type TPromoCodeAttribute = {
|
|
@@ -8370,57 +8415,6 @@ declare namespace events {
|
|
|
8370
8415
|
};
|
|
8371
8416
|
}
|
|
8372
8417
|
|
|
8373
|
-
declare function waitForElement(selector: string, { timeout }?: {
|
|
8374
|
-
timeout?: number | undefined;
|
|
8375
|
-
}): Promise<Element>;
|
|
8376
|
-
|
|
8377
|
-
declare const initNetworkListeners: () => void;
|
|
8378
|
-
|
|
8379
|
-
declare class BeamError extends Error {
|
|
8380
|
-
supportUrl: string;
|
|
8381
|
-
constructor(msg?: string, { cause, name }?: {
|
|
8382
|
-
cause?: any;
|
|
8383
|
-
name?: string;
|
|
8384
|
-
});
|
|
8385
|
-
}
|
|
8386
|
-
declare class NetworkError extends BeamError {
|
|
8387
|
-
/** Fetch Response object with .ok, .status, etc.*/
|
|
8388
|
-
response: Response;
|
|
8389
|
-
/** If network response included JSON payload, it is parsed and available here */
|
|
8390
|
-
body?: Record<string, string>;
|
|
8391
|
-
constructor(response: Response, body?: Record<string, string>, msg?: string);
|
|
8392
|
-
}
|
|
8393
|
-
declare class MissingConfig extends BeamError {
|
|
8394
|
-
missingConfigKeyNames: string[];
|
|
8395
|
-
constructor(missingConfigKeyNames?: string[], msg?: string);
|
|
8396
|
-
}
|
|
8397
|
-
declare class LocalStorageError extends BeamError {
|
|
8398
|
-
constructor(msg?: string);
|
|
8399
|
-
}
|
|
8400
|
-
declare class SetupError extends BeamError {
|
|
8401
|
-
constructor(msg?: string);
|
|
8402
|
-
}
|
|
8403
|
-
|
|
8404
|
-
type beamErrors_BeamError = BeamError;
|
|
8405
|
-
declare const beamErrors_BeamError: typeof BeamError;
|
|
8406
|
-
type beamErrors_LocalStorageError = LocalStorageError;
|
|
8407
|
-
declare const beamErrors_LocalStorageError: typeof LocalStorageError;
|
|
8408
|
-
type beamErrors_MissingConfig = MissingConfig;
|
|
8409
|
-
declare const beamErrors_MissingConfig: typeof MissingConfig;
|
|
8410
|
-
type beamErrors_NetworkError = NetworkError;
|
|
8411
|
-
declare const beamErrors_NetworkError: typeof NetworkError;
|
|
8412
|
-
type beamErrors_SetupError = SetupError;
|
|
8413
|
-
declare const beamErrors_SetupError: typeof SetupError;
|
|
8414
|
-
declare namespace beamErrors {
|
|
8415
|
-
export {
|
|
8416
|
-
beamErrors_BeamError as BeamError,
|
|
8417
|
-
beamErrors_LocalStorageError as LocalStorageError,
|
|
8418
|
-
beamErrors_MissingConfig as MissingConfig,
|
|
8419
|
-
beamErrors_NetworkError as NetworkError,
|
|
8420
|
-
beamErrors_SetupError as SetupError,
|
|
8421
|
-
};
|
|
8422
|
-
}
|
|
8423
|
-
|
|
8424
8418
|
declare const logger: {
|
|
8425
8419
|
error: (...args: any[]) => void;
|
|
8426
8420
|
log: (...args: any[]) => void;
|
|
@@ -8428,6 +8422,15 @@ declare const logger: {
|
|
|
8428
8422
|
debug: (...args: any[]) => void;
|
|
8429
8423
|
};
|
|
8430
8424
|
|
|
8425
|
+
declare const initNetworkListeners: () => void;
|
|
8426
|
+
/**
|
|
8427
|
+
* Disables Beam event dispatching from the fetch/XHR Proxies without
|
|
8428
|
+
* un-patching them (un-patching is unsafe if another script wrapped
|
|
8429
|
+
* fetch/XHR after us — restoring our saved reference would remove
|
|
8430
|
+
* their wrapper too).
|
|
8431
|
+
*/
|
|
8432
|
+
declare const teardownNetworkListeners: () => void;
|
|
8433
|
+
|
|
8431
8434
|
/**
|
|
8432
8435
|
* Creates an object that has the same API as normal localStorage, but adds a beam_ prefix and apiKey postfix to keys
|
|
8433
8436
|
* Also adds helper methods for JSON (de-)serialization
|
|
@@ -8446,6 +8449,10 @@ declare const createScopedLocalStorage: (config: {
|
|
|
8446
8449
|
setItemJson(key: string, value: object): void;
|
|
8447
8450
|
};
|
|
8448
8451
|
|
|
8452
|
+
declare function waitForElement(selector: string, { timeout }?: {
|
|
8453
|
+
timeout?: number | undefined;
|
|
8454
|
+
}): Promise<Element>;
|
|
8455
|
+
|
|
8449
8456
|
declare const getCookieMap: (cookieString?: string) => Map<string, string>;
|
|
8450
8457
|
declare const getCookieValue: (name: string) => string | undefined;
|
|
8451
8458
|
declare const setCookieValue: (options: CookieInit) => undefined;
|
|
@@ -8485,7 +8492,11 @@ type Func<T extends any[], R> = (...args: T) => R;
|
|
|
8485
8492
|
*/
|
|
8486
8493
|
declare function memoizeLast<T extends any[], R>(func: Func<T, R>, { isEqual }?: {
|
|
8487
8494
|
isEqual?: ((value: any, other: any) => boolean) | undefined;
|
|
8488
|
-
}): Func<T, R
|
|
8495
|
+
}): MemoizedLast<Func<T, R>>;
|
|
8496
|
+
type MemoizedLast<T extends (...args: any[]) => any> = T & {
|
|
8497
|
+
/** Clears the cached args/result so the next call always executes. */
|
|
8498
|
+
reset: () => void;
|
|
8499
|
+
};
|
|
8489
8500
|
|
|
8490
8501
|
/**
|
|
8491
8502
|
* Retrieves all validated promo codes stored in the "beam_promo_codes" cookie and parses it
|
|
@@ -8593,6 +8604,22 @@ declare const isEmptyPromoData: (promos: {
|
|
|
8593
8604
|
validatedPromoCodes?: unknown[];
|
|
8594
8605
|
}) => boolean;
|
|
8595
8606
|
|
|
8607
|
+
/**
|
|
8608
|
+
* Clears every piece of Beam-related browser state this SDK writes, by iterating the
|
|
8609
|
+
* LOCAL_STORAGE_KEYS/BEAM_COOKIE_NAMES registries (src/api-sdk/constants.ts) directly —
|
|
8610
|
+
* anything added to those objects is cleared automatically, with nothing to update here.
|
|
8611
|
+
*
|
|
8612
|
+
* Not tied to any one integration's lifecycle (e.g. registerCartIntegration/
|
|
8613
|
+
* unregisterCartIntegration) — safe to call on its own, from any integration or directly,
|
|
8614
|
+
* whenever a full reset of Beam's local footprint is needed.
|
|
8615
|
+
*/
|
|
8616
|
+
declare function clearBeamStorage(config: {
|
|
8617
|
+
apiKey: string;
|
|
8618
|
+
domain?: string;
|
|
8619
|
+
}): void;
|
|
8620
|
+
|
|
8621
|
+
type index_MemoizedLast<T extends (...args: any[]) => any> = MemoizedLast<T>;
|
|
8622
|
+
declare const index_clearBeamStorage: typeof clearBeamStorage;
|
|
8596
8623
|
declare const index_createScopedLocalStorage: typeof createScopedLocalStorage;
|
|
8597
8624
|
declare const index_debounce: typeof debounce;
|
|
8598
8625
|
declare const index_deleteCookieValue: typeof deleteCookieValue;
|
|
@@ -8619,38 +8646,11 @@ declare const index_saveRemoteSession: typeof saveRemoteSession;
|
|
|
8619
8646
|
declare const index_setCookieValue: typeof setCookieValue;
|
|
8620
8647
|
declare const index_setPromoCodeInCookie: typeof setPromoCodeInCookie;
|
|
8621
8648
|
declare const index_setPromoCodesInLocalStorage: typeof setPromoCodesInLocalStorage;
|
|
8649
|
+
declare const index_teardownNetworkListeners: typeof teardownNetworkListeners;
|
|
8622
8650
|
declare const index_waitForElement: typeof waitForElement;
|
|
8623
8651
|
declare namespace index {
|
|
8624
|
-
export {
|
|
8625
|
-
|
|
8626
|
-
index_debounce as debounce,
|
|
8627
|
-
index_deleteCookieValue as deleteCookieValue,
|
|
8628
|
-
beamErrors as errors,
|
|
8629
|
-
index_events as events,
|
|
8630
|
-
index_formatStoreAndReturnPromoCodes as formatStoreAndReturnPromoCodes,
|
|
8631
|
-
index_getAllPromoCodesFromCookie as getAllPromoCodesFromCookie,
|
|
8632
|
-
index_getCookieMap as getCookieMap,
|
|
8633
|
-
index_getCookieValue as getCookieValue,
|
|
8634
|
-
index_getPromoCodeFromShopifyCookie as getPromoCodeFromShopifyCookie,
|
|
8635
|
-
index_getPromoCodesFromCart as getPromoCodesFromCart,
|
|
8636
|
-
index_getPromoCodesLocalStorage as getPromoCodesLocalStorage,
|
|
8637
|
-
index_getRemoteSession as getRemoteSession,
|
|
8638
|
-
index_getSanitizedUrlForStorage as getSanitizedUrlForStorage,
|
|
8639
|
-
index_initNetworkListeners as initNetworkListeners,
|
|
8640
|
-
index_isEmptyPromoData as isEmptyPromoData,
|
|
8641
|
-
index_isEqual as isEqual,
|
|
8642
|
-
index_logger as logger,
|
|
8643
|
-
index_mapToUnvalidatedPromoCodes as mapToUnvalidatedPromoCodes,
|
|
8644
|
-
index_memoizeLast as memoizeLast,
|
|
8645
|
-
index_mergeStoreAndReturnPromos as mergeStoreAndReturnPromos,
|
|
8646
|
-
index_parseJsonStringArray as parseJsonStringArray,
|
|
8647
|
-
index_promoCodesAreEqual as promoCodesAreEqual,
|
|
8648
|
-
index_saveRemoteSession as saveRemoteSession,
|
|
8649
|
-
index_setCookieValue as setCookieValue,
|
|
8650
|
-
index_setPromoCodeInCookie as setPromoCodeInCookie,
|
|
8651
|
-
index_setPromoCodesInLocalStorage as setPromoCodesInLocalStorage,
|
|
8652
|
-
index_waitForElement as waitForElement,
|
|
8653
|
-
};
|
|
8652
|
+
export { index_clearBeamStorage as clearBeamStorage, index_createScopedLocalStorage as createScopedLocalStorage, index_debounce as debounce, index_deleteCookieValue as deleteCookieValue, beamErrors as errors, index_events as events, index_formatStoreAndReturnPromoCodes as formatStoreAndReturnPromoCodes, index_getAllPromoCodesFromCookie as getAllPromoCodesFromCookie, index_getCookieMap as getCookieMap, index_getCookieValue as getCookieValue, index_getPromoCodeFromShopifyCookie as getPromoCodeFromShopifyCookie, index_getPromoCodesFromCart as getPromoCodesFromCart, index_getPromoCodesLocalStorage as getPromoCodesLocalStorage, index_getRemoteSession as getRemoteSession, index_getSanitizedUrlForStorage as getSanitizedUrlForStorage, index_initNetworkListeners as initNetworkListeners, index_isEmptyPromoData as isEmptyPromoData, index_isEqual as isEqual, index_logger as logger, index_mapToUnvalidatedPromoCodes as mapToUnvalidatedPromoCodes, index_memoizeLast as memoizeLast, index_mergeStoreAndReturnPromos as mergeStoreAndReturnPromos, index_parseJsonStringArray as parseJsonStringArray, index_promoCodesAreEqual as promoCodesAreEqual, index_saveRemoteSession as saveRemoteSession, index_setCookieValue as setCookieValue, index_setPromoCodeInCookie as setPromoCodeInCookie, index_setPromoCodesInLocalStorage as setPromoCodesInLocalStorage, index_teardownNetworkListeners as teardownNetworkListeners, index_waitForElement as waitForElement };
|
|
8653
|
+
export type { index_MemoizedLast as MemoizedLast };
|
|
8654
8654
|
}
|
|
8655
8655
|
|
|
8656
8656
|
/**
|
|
@@ -8674,5 +8674,5 @@ declare function makeApiKeyHeader(apiKey: string): {
|
|
|
8674
8674
|
authorization: string;
|
|
8675
8675
|
};
|
|
8676
8676
|
|
|
8677
|
-
export {
|
|
8678
|
-
export type { paths as
|
|
8677
|
+
export { BeamStatusChangeEvent as $, memoizeLast as A, BeamNonprofitSelectEvent as B, mergeStoreAndReturnPromos as C, parseJsonStringArray as D, promoCodesAreEqual as E, saveRemoteSession as F, setCookieValue as G, setPromoCodeInCookie as H, setPromoCodesInLocalStorage as I, teardownNetworkListeners as J, BeamError as O, LocalStorageError as P, MissingConfig as Q, NetworkError as R, SetupError as S, BeamCartChangeEvent as U, BeamCartCreatedEvent as V, BeamNetworkCallEvent as W, BeamNonprofitSelectionRemovedEvent as X, BeamOrderCreatedEvent as Y, BeamPromoCodesStoredEvent as Z, BeamStatsigInitializedEvent as _, index as a, BeamWidgetInitialNonprofitSyncCancelEvent as a0, BeamWidgetInitialNonprofitSyncEvent as a1, BeamWidgetStoredPromoCodesEvent as a2, getBeamCartId as a3, getExternalCartId as a4, makeApiKeyHeader as a5, events as e, initNetworkListeners as i, clearBeamStorage as j, createScopedLocalStorage as k, deleteCookieValue as l, beamErrors as m, formatStoreAndReturnPromoCodes as n, getAllPromoCodesFromCookie as o, getCookieMap as p, getCookieValue as q, getPromoCodeFromShopifyCookie as r, getPromoCodesFromCart as s, getPromoCodesLocalStorage as t, getRemoteSession as u, getSanitizedUrlForStorage as v, waitForElement as w, isEmptyPromoData as x, logger as y, mapToUnvalidatedPromoCodes as z };
|
|
8678
|
+
export type { paths as K, LANGUAGES as L, MemoizedLast as M, TApiKey as N, TUrl$1 as T, TNumericId as b, TId as c, TCart as d, TUrl as f, BeamBaseAPIConfig as g, TCartApi as h };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as lit from 'lit';
|
|
2
2
|
import { LitElement } from 'lit';
|
|
3
3
|
import * as lit_html from 'lit-html';
|
|
4
|
-
import { T as TUrl } from '../chunks/utils-
|
|
4
|
+
import { T as TUrl } from '../chunks/utils-COGFpDER.esm.js';
|
|
5
5
|
import 'lodash-es/debounce';
|
|
6
6
|
import 'lodash-es/isEqual';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as lit from 'lit';
|
|
2
2
|
import { LitElement } from 'lit';
|
|
3
3
|
import * as lit_html from 'lit-html';
|
|
4
|
-
import { b as TNumericId, L as LANGUAGES } from '../chunks/utils-
|
|
4
|
+
import { b as TNumericId, L as LANGUAGES } from '../chunks/utils-COGFpDER.esm.js';
|
|
5
5
|
import 'lodash-es/debounce';
|
|
6
6
|
import 'lodash-es/isEqual';
|
|
7
7
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{i as x,n as d,r as I,a as v,h as u,b as g,j as b}from"../chunks/lit-BEag9MFp.esm.js";import{c as $,a as f,d as T,e as k}from"../chunks/css-card-grid-
|
|
1
|
+
import{i as x,n as d,r as I,a as v,h as u,b as g,j as b}from"../chunks/lit-BEag9MFp.esm.js";import{c as $,a as f,d as T,e as k}from"../chunks/css-card-grid-CiqEjkwR.esm.js";import{u as n,g as w,A as S,d as s,_ as L,c as C,e as m,f as A}from"../chunks/index-Dm-K2MLY.esm.js";import{D as z,W as F,v as D,n as M}from"../chunks/utils-C5hmbxa4.esm.js";import{a as E}from"../chunks/share-button-5gfPmeEh.esm.js";import{partnerLogosConfigDefaults as U}from"./beam-partner-logos.esm.js";import"../chunks/lodash-CrMU6wKg.esm.js";const y={en:{fundedTimes:({times:e=0})=>`Funded <b>${e}</b> ${e>1?"times":"time"} so far`,learnMore:()=>"Learn more",seeAll:()=>"See All"},fr:{fundedTimes:({times:e=0})=>`Financ\xE9 <b>${e}</b> fois pour l'instant`,learnMore:()=>"En savoir plus",seeAll:()=>"Voir tout"},de:{fundedTimes:({times:e=0})=>`<b>${e}</b> Mal finanziert`,learnMore:()=>"Mehr erfahren",seeAll:()=>"Alle anzeigen"},es:{fundedTimes:({times:e=0})=>`Financiado <b>${e}</b> ${e>1?"vez":"veces"}`,learnMore:()=>"Saber m\xE1s",seeAll:()=>"Ver Todo"},it:{fundedTimes:({times:e=0})=>`Finanziato <b>${e}</b> ${e>1?"volta":"volte"}`,learnMore:()=>"Scopri di pi\xF9",seeAll:()=>"Vedi Tutto"},pl:{fundedTimes:({times:e=0})=>`Udzielono wsparcia <b>${e}</b> ${e>1?"razy":"raz"}`,learnMore:()=>"Dowiedz si\u0119 wi\u0119cej",seeAll:()=>"Zobacz wszystko"},ja:{fundedTimes:({times:e=0})=>`\u73FE\u5728\u307E\u3067\u306B<b>${e}</b>\u56DE\u3001\u3092\u9054\u6210`,learnMore:()=>"\u8A73\u3057\u304F\u898B\u308B",seeAll:()=>"\u3059\u3079\u3066\u898B\u308B"}};var B=Object.defineProperty,l=(e,a,t,r)=>{for(var o=void 0,i=e.length-1,p;i>=0;i--)(p=e[i])&&(o=p(a,t,o)||o);return o&&B(a,t,o),o};class c extends v{constructor(){super(...arguments),this.baseUrl=z,this.cardStyle="image",this.lang="en",this.debug=!1,this.draftConfig=!1,this.selectedFilter=null,this.getImpactData=async()=>(k(["apiKey","chainId"],this),w({baseUrl:this.baseUrl,headers:{authorization:`Api-Key ${this.apiKey}`},queryParams:{chainId:this.chainId,personalImpactLimit:0,widgetName:F.community_impact,version:"1.0.0",lang:this.configLang,draftConfig:this.draftConfig}})),this.impactDataController=new S(this,this.getImpactData),this.renderImageCard=a=>{const t=`${a.nonprofit?.name} image`,r=`Learn more about ${a.nonprofit?.name}`;return g`
|
|
2
2
|
<div class="image-card" part="nonprofit-card" style="display: flex; flex-direction: column;">
|
|
3
3
|
<div
|
|
4
4
|
class="image-card-image-box"
|
|
@@ -76,7 +76,7 @@ import{i as x,n as d,r as I,a as v,h as u,b as g,j as b}from"../chunks/lit-BEag9
|
|
|
76
76
|
<div class="beam-nonprofit-${this.cardStyle}-cards" part="nonprofit-cards">
|
|
77
77
|
${a?.map(this.cardStyle==="image"?this.renderImageCard:this.renderIconCard)}
|
|
78
78
|
</div>
|
|
79
|
-
`}get configLang(){return
|
|
79
|
+
`}get configLang(){return D[this.lang]||"en"}async updated(a){const t=["chainId","baseUrl","lang"];for(const r of t)if(a.has(r)){this.impactDataController.exec();break}}renderFilterTabs({nonprofits:a}){const t=Array.from(new Set(a.flatMap(i=>i.filters||[])));if(t.length===0)return"";const r=()=>{this.selectedFilter=null},o=i=>{this.selectedFilter===i?this.selectedFilter=null:this.selectedFilter=i};return g` <div
|
|
80
80
|
class="beam-filter-tabs"
|
|
81
81
|
part="filters"
|
|
82
82
|
style="display: inline-flex; flex-wrap: wrap; gap: 0.5em 1em"
|
|
@@ -95,7 +95,7 @@ import{i as x,n as d,r as I,a as v,h as u,b as g,j as b}from"../chunks/lit-BEag9
|
|
|
95
95
|
style="${b({"padding-bottom":"1px","border-bottom-width":"2px","border-bottom-style":"solid","border-bottom-color":this.selectedFilter===i?"currentColor":"transparent",cursor:"pointer"})}"
|
|
96
96
|
>${i}</span
|
|
97
97
|
>`)}
|
|
98
|
-
</div>`}render(){const{selectedFilter:a}=this,{data:t,error:r,loading:o}=this.impactDataController;if(o)return
|
|
98
|
+
</div>`}render(){const{selectedFilter:a}=this,{data:t,error:r,loading:o}=this.impactDataController;if(o)return L();if(r)return this.debug?C({error:r}):"";if(t==null)return this.debug?C({error:new M("Missing data")}):"";const{community:i}=t,p=a?i.filter(h=>h.filters?.includes(a)):i;return g`
|
|
99
99
|
<style>
|
|
100
100
|
:host {
|
|
101
101
|
${this.cssVariables.toCSS()}
|
|
@@ -108,7 +108,7 @@ import{i as x,n as d,r as I,a as v,h as u,b as g,j as b}from"../chunks/lit-BEag9
|
|
|
108
108
|
></beam-partner-logos>
|
|
109
109
|
|
|
110
110
|
${this.renderFilterTabs({nonprofits:i})} ${this.renderCards({nonprofits:p})}
|
|
111
|
-
`}get cssVariables(){const a={"--beam-fontFamily":"inherit","--beam-fontStyle":"inherit","--beam-fontSize":"14px","--beam-lineHeight":"1","--beam-textColor":"inherit","--beam-backgroundColor":"inherit",...U,...E,"--beam-CommunityImpact-filterTabs-textalign":"left","--beam-CommunityImpact-filterTabs-marginBottom":"20px","--beam-CommunityImpact-imageCard-borderColor":"currentColor","--beam-CommunityImpact-imageCard-borderRadius":"0","--beam-CommunityImpact-imageCard-borderWidth":"1px","--beam-CommunityImpact-imageCard-backgroundColor":"inherit","--beam-CommunityImpact-imageCard-foregroundColor":"inherit",...m("--beam-CommunityImpact-filterTabs",{fontSize:"16px",marginTop:"10px",fontWeight:"bold"}),...m("--beam-CommunityImpact-imageCard-cause",{fontSize:"14px",textTransform:"uppercase",color:"#fff"}),...m("--beam-CommunityImpact-imageCard-name",{fontSize:"22px",marginTop:"0",color:"#fff"}),...m("--beam-CommunityImpact-imageCard-description",{marginTop:"10px",lineHeight:"1.3"}),"--beam-CommunityImpact-imageCard-link-color":"inherit","--beam-CommunityImpact-imageCard-linkArrow-display":"none",...m("--beam-CommunityImpact-imageCard-link",{fontSize:"12px"}),...m("--beam-CommunityImpact-imageCard-goalCompletion",{fontSize:"12px"}),"--beam-CommunityImpact-imageCard-goalCompletion-fontStyle":"italic","--beam-CommunityImpact-imageCard-progress-marginTop":"10px",...m("--beam-CommunityImpact-imageCard-progressText"),"--beam-CommunityImpact-imageCard-footer-marginTop":"10px",...m("--beam-CommunityImpact-iconCard-cause",{marginTop:"10px"}),...m("--beam-CommunityImpact-iconCard-name",{marginTop:"5px",fontWeight:"bold"}),"--beam-CommunityImpact-iconCard-progress-marginTop":"10px",...m("--beam-CommunityImpact-iconCard-progressText"),...m("--beam-CommunityImpact-iconCard-description",{marginTop:"10px",lineHeight:"1.3"}),"--beam-CommunityImpact-iconCard-description-textAlign":"left",...m("--beam-CommunityImpact-iconCard-goalCompletion",{marginTop:"10px"}),"--beam-CommunityImpact-iconCard-link-color":"inherit","--beam-CommunityImpact-iconCard-linkArrow-display":"none",...m("--beam-CommunityImpact-iconCard-link",{marginTop:"5px"})},t=(this.impactDataController.data?.community.length||0)===3?3:this.cardStyle==="icon"?4:2;a["--beam-CommunityImpact-columns"]=t.toString(),a["--beam-CommunityImpact-columns-minWidth"]=this.cardStyle==="image"?"300px":"200px";const r=this.impactDataController?.data?.config?.web?.theme||{},o={...a,...r};return Object.assign(Object.create({toCSS(){return
|
|
111
|
+
`}get cssVariables(){const a={"--beam-fontFamily":"inherit","--beam-fontStyle":"inherit","--beam-fontSize":"14px","--beam-lineHeight":"1","--beam-textColor":"inherit","--beam-backgroundColor":"inherit",...U,...E,"--beam-CommunityImpact-filterTabs-textalign":"left","--beam-CommunityImpact-filterTabs-marginBottom":"20px","--beam-CommunityImpact-imageCard-borderColor":"currentColor","--beam-CommunityImpact-imageCard-borderRadius":"0","--beam-CommunityImpact-imageCard-borderWidth":"1px","--beam-CommunityImpact-imageCard-backgroundColor":"inherit","--beam-CommunityImpact-imageCard-foregroundColor":"inherit",...m("--beam-CommunityImpact-filterTabs",{fontSize:"16px",marginTop:"10px",fontWeight:"bold"}),...m("--beam-CommunityImpact-imageCard-cause",{fontSize:"14px",textTransform:"uppercase",color:"#fff"}),...m("--beam-CommunityImpact-imageCard-name",{fontSize:"22px",marginTop:"0",color:"#fff"}),...m("--beam-CommunityImpact-imageCard-description",{marginTop:"10px",lineHeight:"1.3"}),"--beam-CommunityImpact-imageCard-link-color":"inherit","--beam-CommunityImpact-imageCard-linkArrow-display":"none",...m("--beam-CommunityImpact-imageCard-link",{fontSize:"12px"}),...m("--beam-CommunityImpact-imageCard-goalCompletion",{fontSize:"12px"}),"--beam-CommunityImpact-imageCard-goalCompletion-fontStyle":"italic","--beam-CommunityImpact-imageCard-progress-marginTop":"10px",...m("--beam-CommunityImpact-imageCard-progressText"),"--beam-CommunityImpact-imageCard-footer-marginTop":"10px",...m("--beam-CommunityImpact-iconCard-cause",{marginTop:"10px"}),...m("--beam-CommunityImpact-iconCard-name",{marginTop:"5px",fontWeight:"bold"}),"--beam-CommunityImpact-iconCard-progress-marginTop":"10px",...m("--beam-CommunityImpact-iconCard-progressText"),...m("--beam-CommunityImpact-iconCard-description",{marginTop:"10px",lineHeight:"1.3"}),"--beam-CommunityImpact-iconCard-description-textAlign":"left",...m("--beam-CommunityImpact-iconCard-goalCompletion",{marginTop:"10px"}),"--beam-CommunityImpact-iconCard-link-color":"inherit","--beam-CommunityImpact-iconCard-linkArrow-display":"none",...m("--beam-CommunityImpact-iconCard-link",{marginTop:"5px"})},t=(this.impactDataController.data?.community.length||0)===3?3:this.cardStyle==="icon"?4:2;a["--beam-CommunityImpact-columns"]=t.toString(),a["--beam-CommunityImpact-columns-minWidth"]=this.cardStyle==="image"?"300px":"200px";const r=this.impactDataController?.data?.config?.web?.theme||{},o={...a,...r};return Object.assign(Object.create({toCSS(){return A(this)}}),o)}}c.tagName="beam-community-impact",c.styles=[$,x`
|
|
112
112
|
:host {
|
|
113
113
|
display: block;
|
|
114
114
|
font-family: var(--beam-fontFamily, inherit);
|