@anker-in/headless-ui 1.3.1 → 1.3.3
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/cjs/biz-components/AccordionCards/index.js +1 -1
- package/dist/cjs/biz-components/AccordionCards/index.js.map +2 -2
- package/dist/cjs/biz-components/EventSchedule/index.js +1 -1
- package/dist/cjs/biz-components/EventSchedule/index.js.map +2 -2
- package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js +1 -1
- package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js.map +2 -2
- package/dist/cjs/biz-components/Listing/utils/index.js +1 -1
- package/dist/cjs/biz-components/Listing/utils/index.js.map +2 -2
- package/dist/cjs/biz-components/SceneShelf/ProductCard.js +1 -1
- package/dist/cjs/biz-components/SceneShelf/ProductCard.js.map +3 -3
- package/dist/cjs/biz-components/WebPushPopup/index.d.ts +44 -0
- package/dist/cjs/biz-components/WebPushPopup/index.js +2 -0
- package/dist/cjs/biz-components/WebPushPopup/index.js.map +7 -0
- package/dist/cjs/biz-components/index.d.ts +4 -0
- package/dist/cjs/biz-components/index.js +1 -1
- package/dist/cjs/biz-components/index.js.map +3 -3
- package/dist/cjs/hooks/useEmarsysWebPush.d.ts +111 -0
- package/dist/cjs/hooks/useEmarsysWebPush.js +2 -0
- package/dist/cjs/hooks/useEmarsysWebPush.js.map +7 -0
- package/dist/cjs/shared/LocalizedLink.d.ts +6 -0
- package/dist/cjs/shared/LocalizedLink.js +2 -0
- package/dist/cjs/shared/LocalizedLink.js.map +7 -0
- package/dist/esm/biz-components/AccordionCards/index.js +1 -1
- package/dist/esm/biz-components/AccordionCards/index.js.map +2 -2
- package/dist/esm/biz-components/EventSchedule/index.js +1 -1
- package/dist/esm/biz-components/EventSchedule/index.js.map +2 -2
- package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js +1 -1
- package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js.map +2 -2
- package/dist/esm/biz-components/Listing/utils/index.js +1 -1
- package/dist/esm/biz-components/Listing/utils/index.js.map +2 -2
- package/dist/esm/biz-components/SceneShelf/ProductCard.js +1 -1
- package/dist/esm/biz-components/SceneShelf/ProductCard.js.map +3 -3
- package/dist/esm/biz-components/WebPushPopup/index.d.ts +44 -0
- package/dist/esm/biz-components/WebPushPopup/index.js +2 -0
- package/dist/esm/biz-components/WebPushPopup/index.js.map +7 -0
- package/dist/esm/biz-components/index.d.ts +4 -0
- package/dist/esm/biz-components/index.js +1 -1
- package/dist/esm/biz-components/index.js.map +3 -3
- package/dist/esm/hooks/useEmarsysWebPush.d.ts +111 -0
- package/dist/esm/hooks/useEmarsysWebPush.js +2 -0
- package/dist/esm/hooks/useEmarsysWebPush.js.map +7 -0
- package/dist/esm/shared/LocalizedLink.d.ts +6 -0
- package/dist/esm/shared/LocalizedLink.js +2 -0
- package/dist/esm/shared/LocalizedLink.js.map +7 -0
- package/package.json +4 -2
- package/static/emarsys-service-worker.js +31 -0
- package/style.css +52 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/biz-components/SceneShelf/ProductCard.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { Checkbox, Badge, Heading, Text, Picture } from '../../components/index.js'\nimport { useSceneShelfContext } from './context.js'\nimport type { SceneProductCardSemanticName, SceneProductCardData } from './types.js'\n\nexport interface SceneProductCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4EA7\u54C1\u6570\u636E */\n product: SceneProductCardData\n /** \u662F\u5426\u9009\u4E2D */\n selected?: boolean\n /** \u9009\u4E2D\u72B6\u6001\u53D8\u5316\u56DE\u8C03 */\n onSelectChange?: (selected: boolean, product: SceneProductCardData) => void\n /** \u662F\u5426\u663E\u793A\u6807\u7B7E */\n showTags?: boolean\n /** \u662F\u5426\u663E\u793A\u539F\u4EF7 */\n showOriginalPrice?: boolean\n /** \u4EA7\u54C1\u56FE\u7247\u70B9\u51FB\u56DE\u8C03 */\n onProductImageClick?: (product: SceneProductCardData) => void\n /** \u8BED\u4E49\u5316\u7C7B\u540D */\n classNames?: Partial<Record<SceneProductCardSemanticName, string>>\n}\n\n/**\n * SceneProductCard - \u573A\u666F\u63A8\u8350\u8D27\u67B6\u4EA7\u54C1\u5361\u7247\n *\n * @description \u7528\u4E8E\u573A\u666F\u63A8\u8350\u8D27\u67B6\u7684\u53EF\u9009\u4E2D\u4EA7\u54C1\u5361\u7247\u7EC4\u4EF6\n */\nconst SceneProductCard = React.forwardRef<HTMLDivElement, SceneProductCardProps>(\n (\n {\n className,\n classNames: classNamesProp,\n product,\n selected: selectedProp,\n onSelectChange: onSelectChangeProp,\n showTags: showTagsProp,\n showOriginalPrice: showOriginalPriceProp,\n onProductImageClick,\n ...props\n },\n ref\n ) => {\n // \u4ECE Context \u8BFB\u53D6\u914D\u7F6E\n const context = useSceneShelfContext()\n\n // Props \u4F18\u5148\u7EA7\u9AD8\u4E8E Context\n const showTags = showTagsProp ?? context?.showTags ?? true\n const showOriginalPrice = showOriginalPriceProp ?? context?.showOriginalPrice ?? true\n const classNames = classNamesProp ?? context?.classNames ?? {}\n\n // \u9009\u4E2D\u72B6\u6001\u548C\u56DE\u8C03\u4ECE Context \u83B7\u53D6\n const selected = selectedProp ?? (context ? context.selectedIds.has(product.id) : false)\n const onSelectChange = onSelectChangeProp ?? context?.onSelectChange\n const resolvedOnProductImageClick = onProductImageClick ?? context?.onProductImageClick\n const disabled = product.soldOut ?? false\n\n const handleCheckboxChange = (checked: boolean | 'indeterminate') => {\n if (disabled) return\n if (typeof checked === 'boolean') {\n onSelectChange?.(checked, product)\n }\n }\n\n const handleCardClick = () => {\n if (disabled) return\n onSelectChange?.(!selected, product)\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'lg-desktop:gap-2 lg-desktop:h-[362px] lg-desktop:px-6 lg-desktop:pb-6 lg-desktop:pt-4 rounded-box box-border flex h-[284px] flex-col justify-between gap-2 border-2 border-solid p-4 pb-6 transition-colors',\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n selected\n ? cn('border-brand-0 bg-container-secondary-0', classNames?.cardSelected)\n : cn('border-lines bg-container-primary', classNames?.card),\n className\n )}\n onClick={handleCardClick}\n data-headless-type-name=\"SceneShelf#ProductCard\"\n data-headless-title-desc-button={`${product.custom_name ?? product.title}##Select`}\n data-headless-sku={product.id}\n {...props}\n >\n {/* \u6807\u7B7E\u533A\u57DF */}\n <div\n className={cn(\n 'lg-desktop:left-6 lg-desktop:top-6 flex max-h-[24px] min-h-[24px] flex-wrap gap-1 overflow-visible pr-9',\n classNames?.tags\n )}\n >\n {showTags &&\n product.tags?.map((tag, index) => (\n <Badge key={index} variant={tag.variant || 'outline'} size=\"sm\">\n {tag.label}\n </Badge>\n ))}\n </div>\n\n {/* Checkbox */}\n <Checkbox\n checked={selected}\n disabled={disabled}\n onCheckedChange={handleCheckboxChange}\n onClick={e => e.stopPropagation()}\n className={cn(\n 'text-brand-0 border-brand-0 lg-desktop:right-6 lg-desktop:top-6 absolute right-4 top-4 size-5 shrink-0',\n classNames?.checkbox\n )}\n />\n\n {/* \u4EA7\u54C1\u56FE\u7247 */}\n <div className={cn('flex flex-1 grow-0 items-center justify-center', classNames?.image)}>\n {resolvedOnProductImageClick
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["jsx", "jsxs", "React", "cn", "Checkbox", "Badge", "Heading", "Text", "Picture", "useSceneShelfContext", "SceneProductCard", "className", "classNamesProp", "product", "selectedProp", "onSelectChangeProp", "showTagsProp", "showOriginalPriceProp", "onProductImageClick", "props", "ref", "context", "showTags", "showOriginalPrice", "classNames", "selected", "onSelectChange", "resolvedOnProductImageClick", "disabled", "handleCheckboxChange", "checked", "handleCardClick", "tag", "index", "e"]
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { Checkbox, Badge, Heading, Text, Picture } from '../../components/index.js'\nimport { useSceneShelfContext } from './context.js'\nimport { LocalizedLink } from '../../shared/LocalizedLink.js'\nimport type { SceneProductCardSemanticName, SceneProductCardData } from './types.js'\n\nexport interface SceneProductCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4EA7\u54C1\u6570\u636E */\n product: SceneProductCardData\n /** \u662F\u5426\u9009\u4E2D */\n selected?: boolean\n /** \u9009\u4E2D\u72B6\u6001\u53D8\u5316\u56DE\u8C03 */\n onSelectChange?: (selected: boolean, product: SceneProductCardData) => void\n /** \u662F\u5426\u663E\u793A\u6807\u7B7E */\n showTags?: boolean\n /** \u662F\u5426\u663E\u793A\u539F\u4EF7 */\n showOriginalPrice?: boolean\n /** \u4EA7\u54C1\u56FE\u7247\u70B9\u51FB\u56DE\u8C03 */\n onProductImageClick?: (product: SceneProductCardData) => void\n /** \u8BED\u4E49\u5316\u7C7B\u540D */\n classNames?: Partial<Record<SceneProductCardSemanticName, string>>\n}\n\n/**\n * SceneProductCard - \u573A\u666F\u63A8\u8350\u8D27\u67B6\u4EA7\u54C1\u5361\u7247\n *\n * @description \u7528\u4E8E\u573A\u666F\u63A8\u8350\u8D27\u67B6\u7684\u53EF\u9009\u4E2D\u4EA7\u54C1\u5361\u7247\u7EC4\u4EF6\n */\nconst SceneProductCard = React.forwardRef<HTMLDivElement, SceneProductCardProps>(\n (\n {\n className,\n classNames: classNamesProp,\n product,\n selected: selectedProp,\n onSelectChange: onSelectChangeProp,\n showTags: showTagsProp,\n showOriginalPrice: showOriginalPriceProp,\n onProductImageClick,\n ...props\n },\n ref\n ) => {\n // \u4ECE Context \u8BFB\u53D6\u914D\u7F6E\n const context = useSceneShelfContext()\n\n // Props \u4F18\u5148\u7EA7\u9AD8\u4E8E Context\n const showTags = showTagsProp ?? context?.showTags ?? true\n const showOriginalPrice = showOriginalPriceProp ?? context?.showOriginalPrice ?? true\n const classNames = classNamesProp ?? context?.classNames ?? {}\n\n // \u9009\u4E2D\u72B6\u6001\u548C\u56DE\u8C03\u4ECE Context \u83B7\u53D6\n const selected = selectedProp ?? (context ? context.selectedIds.has(product.id) : false)\n const onSelectChange = onSelectChangeProp ?? context?.onSelectChange\n const resolvedOnProductImageClick = onProductImageClick ?? context?.onProductImageClick\n const disabled = product.soldOut ?? false\n\n const handleCheckboxChange = (checked: boolean | 'indeterminate') => {\n if (disabled) return\n if (typeof checked === 'boolean') {\n onSelectChange?.(checked, product)\n }\n }\n\n const handleCardClick = () => {\n if (disabled) return\n onSelectChange?.(!selected, product)\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'lg-desktop:gap-2 lg-desktop:h-[362px] lg-desktop:px-6 lg-desktop:pb-6 lg-desktop:pt-4 rounded-box box-border flex h-[284px] flex-col justify-between gap-2 border-2 border-solid p-4 pb-6 transition-colors',\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n selected\n ? cn('border-brand-0 bg-container-secondary-0', classNames?.cardSelected)\n : cn('border-lines bg-container-primary', classNames?.card),\n className\n )}\n onClick={handleCardClick}\n data-headless-type-name=\"SceneShelf#ProductCard\"\n data-headless-title-desc-button={`${product.custom_name ?? product.title}##Select`}\n data-headless-sku={product.id}\n {...props}\n >\n {/* \u6807\u7B7E\u533A\u57DF */}\n <div\n className={cn(\n 'lg-desktop:left-6 lg-desktop:top-6 flex max-h-[24px] min-h-[24px] flex-wrap gap-1 overflow-visible pr-9',\n classNames?.tags\n )}\n >\n {showTags &&\n product.tags?.map((tag, index) => (\n <Badge key={index} variant={tag.variant || 'outline'} size=\"sm\">\n {tag.label}\n </Badge>\n ))}\n </div>\n\n {/* Checkbox */}\n <Checkbox\n checked={selected}\n disabled={disabled}\n onCheckedChange={handleCheckboxChange}\n onClick={e => e.stopPropagation()}\n className={cn(\n 'text-brand-0 border-brand-0 lg-desktop:right-6 lg-desktop:top-6 absolute right-4 top-4 size-5 shrink-0',\n classNames?.checkbox\n )}\n />\n\n {/* \u4EA7\u54C1\u56FE\u7247 */}\n <div className={cn('flex flex-1 grow-0 items-center justify-center', classNames?.image)}>\n {resolvedOnProductImageClick ? (\n <a onClick={() => resolvedOnProductImageClick(product)} role=\"button\">\n <Picture\n source={product.imageUrl}\n alt={product.imageAlt || product.title}\n className=\"lg-desktop:size-[175px] aspect-square size-[124px] \"\n imgClassName=\"object-contain\"\n />\n </a>\n ) : product?.href ? (\n <LocalizedLink href={product.href}>\n <Picture\n source={product.imageUrl}\n alt={product.imageAlt || product.title}\n className=\"lg-desktop:size-[175px] aspect-square size-[124px] \"\n imgClassName=\"object-contain\"\n />\n </LocalizedLink>\n ) : (\n <Picture\n source={product.imageUrl}\n alt={product.imageAlt || product.title}\n className=\"lg-desktop:size-[175px] aspect-square size-[124px] \"\n imgClassName=\"object-contain\"\n />\n )}\n </div>\n\n {/* \u4EA7\u54C1\u4FE1\u606F */}\n <div className=\"flex grow flex-col justify-start gap-4\">\n {/* \u4EA7\u54C1\u540D\u79F0 */}\n <Heading\n as=\"h3\"\n size={2}\n className={cn('text-info-primary line-clamp-2 h-[2.2em]', classNames?.title)}\n html={product.custom_name ?? product.title}\n />\n\n {/* \u4EF7\u683C\u533A\u57DF */}\n <div className={cn('flex flex-wrap items-center gap-1', classNames?.priceWrapper)}>\n <Text\n as=\"span\"\n size={2}\n className={cn('text-info-primary lg-desktop:text-[24px] text-[20px]', classNames?.currentPrice)}\n >\n {product.currentPrice.formatted}\n </Text>\n {showOriginalPrice && product.originalPrice && product.originalPrice.value > product.currentPrice.value && (\n <Text\n as=\"span\"\n size={2}\n className={cn(\n 'text-info-quaternary lg-desktop:text-[24px] text-[20px] line-through',\n classNames?.originalPrice\n )}\n >\n {product.originalPrice.formatted}\n </Text>\n )}\n </div>\n </div>\n </div>\n )\n }\n)\n\nSceneProductCard.displayName = 'SceneShelf.ProductCard'\n\nexport { SceneProductCard }\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["jsx", "jsxs", "React", "cn", "Checkbox", "Badge", "Heading", "Text", "Picture", "useSceneShelfContext", "LocalizedLink", "SceneProductCard", "className", "classNamesProp", "product", "selectedProp", "onSelectChangeProp", "showTagsProp", "showOriginalPriceProp", "onProductImageClick", "props", "ref", "context", "showTags", "showOriginalPrice", "classNames", "selected", "onSelectChange", "resolvedOnProductImageClick", "disabled", "handleCheckboxChange", "checked", "handleCardClick", "tag", "index", "e"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface WebPushPopupProps {
|
|
3
|
+
/** 弹窗标题,不传则不渲染标题 */
|
|
4
|
+
title?: string;
|
|
5
|
+
/** 弹窗描述文案,不传则不渲染描述 */
|
|
6
|
+
description?: string;
|
|
7
|
+
/** "稍后"按钮文案,默认 'Later' */
|
|
8
|
+
dismissText?: string;
|
|
9
|
+
/** "订阅"按钮文案,默认 'Allow' */
|
|
10
|
+
subscribeText?: string;
|
|
11
|
+
/** 图标区域内容,默认渲染 🔔 */
|
|
12
|
+
icon?: React.ReactNode;
|
|
13
|
+
/** 用户点击"订阅"按钮时触发 */
|
|
14
|
+
onSubscribe: () => void;
|
|
15
|
+
/** 用户点击"稍后"按钮时触发 */
|
|
16
|
+
onDismiss: () => void;
|
|
17
|
+
/** 额外的容器 className */
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* WebPushPopup
|
|
22
|
+
*
|
|
23
|
+
* Emarsys Web Push 订阅引导弹窗(非侵入式,固定在右上角)。
|
|
24
|
+
* 所有文案、图标均通过 props 传入,不硬编码,支持多品牌自定义。
|
|
25
|
+
*
|
|
26
|
+
* 配合 `useEmarsysWebPush` Hook 使用:
|
|
27
|
+
*
|
|
28
|
+
* ```tsx
|
|
29
|
+
* import { useEmarsysWebPush, WebPushPopup } from '@anker-in/headless-ui/biz'
|
|
30
|
+
*
|
|
31
|
+
* const { shouldShowPopup, subscribe, dismissPopup } = useEmarsysWebPush({ ... })
|
|
32
|
+
*
|
|
33
|
+
* {shouldShowPopup && (
|
|
34
|
+
* <WebPushPopup
|
|
35
|
+
* title="Welcome to Anker"
|
|
36
|
+
* description="Get the latest deals and product updates."
|
|
37
|
+
* onSubscribe={subscribe}
|
|
38
|
+
* onDismiss={dismissPopup}
|
|
39
|
+
* />
|
|
40
|
+
* )}
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
declare const WebPushPopup: React.NamedExoticComponent<WebPushPopupProps>;
|
|
44
|
+
export default WebPushPopup;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";import{jsx as e,jsxs as i}from"react/jsx-runtime";import f,{useCallback as n}from"react";import{cn as s}from"../../helpers/utils.js";const u=f.memo(function({title:t,description:o,dismissText:r="Later",subscribeText:p="Allow",icon:d="\u{1F514}",onSubscribe:a,onDismiss:l,className:c}){const b=n(()=>{a()},[a]),m=n(()=>{l()},[l]);return i("div",{role:"dialog","aria-modal":"false","aria-labelledby":t?"web-push-popup-title":void 0,className:s("fixed right-4 top-4 z-[9999]","laptop:w-80 w-72","flex items-start gap-3","rounded-xl bg-white shadow-lg","border border-black/5","p-4",c),children:[e("span",{className:"mt-0.5 shrink-0 text-2xl leading-none","aria-hidden":"true",children:d}),i("div",{className:"flex min-w-0 flex-1 flex-col gap-2",children:[t&&e("p",{id:"web-push-popup-title",className:"truncate text-sm font-semibold leading-snug text-gray-900",children:t}),o&&e("p",{className:"text-xs leading-relaxed text-gray-500",children:o}),i("div",{className:"flex items-center justify-end gap-2 pt-0.5",children:[e("button",{type:"button",onClick:m,className:s("rounded-md px-3 py-1.5","text-xs font-medium text-gray-400","transition-colors duration-150","hover:bg-gray-100 hover:text-gray-600","focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400"),children:r}),e("button",{type:"button",onClick:b,className:s("rounded-md px-3 py-1.5","text-xs font-medium text-white","bg-gray-900","transition-colors duration-150","hover:bg-gray-700","focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-900"),children:p})]})]})]})});u.displayName="WebPushPopup";var h=u;export{h as default};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/biz-components/WebPushPopup/index.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport React, { useCallback } from 'react'\nimport { cn } from '../../helpers/utils.js'\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Types\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface WebPushPopupProps {\n /** \u5F39\u7A97\u6807\u9898\uFF0C\u4E0D\u4F20\u5219\u4E0D\u6E32\u67D3\u6807\u9898 */\n title?: string\n /** \u5F39\u7A97\u63CF\u8FF0\u6587\u6848\uFF0C\u4E0D\u4F20\u5219\u4E0D\u6E32\u67D3\u63CF\u8FF0 */\n description?: string\n /** \"\u7A0D\u540E\"\u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'Later' */\n dismissText?: string\n /** \"\u8BA2\u9605\"\u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'Allow' */\n subscribeText?: string\n /** \u56FE\u6807\u533A\u57DF\u5185\u5BB9\uFF0C\u9ED8\u8BA4\u6E32\u67D3 \uD83D\uDD14 */\n icon?: React.ReactNode\n /** \u7528\u6237\u70B9\u51FB\"\u8BA2\u9605\"\u6309\u94AE\u65F6\u89E6\u53D1 */\n onSubscribe: () => void\n /** \u7528\u6237\u70B9\u51FB\"\u7A0D\u540E\"\u6309\u94AE\u65F6\u89E6\u53D1 */\n onDismiss: () => void\n /** \u989D\u5916\u7684\u5BB9\u5668 className */\n className?: string\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Component\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * WebPushPopup\n *\n * Emarsys Web Push \u8BA2\u9605\u5F15\u5BFC\u5F39\u7A97\uFF08\u975E\u4FB5\u5165\u5F0F\uFF0C\u56FA\u5B9A\u5728\u53F3\u4E0A\u89D2\uFF09\u3002\n * \u6240\u6709\u6587\u6848\u3001\u56FE\u6807\u5747\u901A\u8FC7 props \u4F20\u5165\uFF0C\u4E0D\u786C\u7F16\u7801\uFF0C\u652F\u6301\u591A\u54C1\u724C\u81EA\u5B9A\u4E49\u3002\n *\n * \u914D\u5408 `useEmarsysWebPush` Hook \u4F7F\u7528\uFF1A\n *\n * ```tsx\n * import { useEmarsysWebPush, WebPushPopup } from '@anker-in/headless-ui/biz'\n *\n * const { shouldShowPopup, subscribe, dismissPopup } = useEmarsysWebPush({ ... })\n *\n * {shouldShowPopup && (\n * <WebPushPopup\n * title=\"Welcome to Anker\"\n * description=\"Get the latest deals and product updates.\"\n * onSubscribe={subscribe}\n * onDismiss={dismissPopup}\n * />\n * )}\n * ```\n */\nconst WebPushPopup = React.memo(function WebPushPopup({\n title,\n description,\n dismissText = 'Later',\n subscribeText = 'Allow',\n icon = '\uD83D\uDD14',\n onSubscribe,\n onDismiss,\n className,\n}: WebPushPopupProps) {\n const handleSubscribe = useCallback(() => {\n onSubscribe()\n }, [onSubscribe])\n\n const handleDismiss = useCallback(() => {\n onDismiss()\n }, [onDismiss])\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={title ? 'web-push-popup-title' : undefined}\n className={cn(\n 'fixed right-4 top-4 z-[9999]',\n 'laptop:w-80 w-72',\n 'flex items-start gap-3',\n 'rounded-xl bg-white shadow-lg',\n 'border border-black/5',\n 'p-4',\n className\n )}\n >\n {/* Icon */}\n <span className=\"mt-0.5 shrink-0 text-2xl leading-none\" aria-hidden=\"true\">\n {icon}\n </span>\n\n {/* Content */}\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n {title && (\n <p id=\"web-push-popup-title\" className=\"truncate text-sm font-semibold leading-snug text-gray-900\">\n {title}\n </p>\n )}\n\n {description && <p className=\"text-xs leading-relaxed text-gray-500\">{description}</p>}\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-2 pt-0.5\">\n <button\n type=\"button\"\n onClick={handleDismiss}\n className={cn(\n 'rounded-md px-3 py-1.5',\n 'text-xs font-medium text-gray-400',\n 'transition-colors duration-150',\n 'hover:bg-gray-100 hover:text-gray-600',\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400'\n )}\n >\n {dismissText}\n </button>\n\n <button\n type=\"button\"\n onClick={handleSubscribe}\n className={cn(\n 'rounded-md px-3 py-1.5',\n 'text-xs font-medium text-white',\n 'bg-gray-900',\n 'transition-colors duration-150',\n 'hover:bg-gray-700',\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-900'\n )}\n >\n {subscribeText}\n </button>\n </div>\n </div>\n </div>\n )\n})\n\nWebPushPopup.displayName = 'WebPushPopup'\n\nexport default WebPushPopup\n"],
|
|
5
|
+
"mappings": "aAyFM,cAAAA,EAeE,QAAAC,MAfF,oBAvFN,OAAOC,GAAS,eAAAC,MAAmB,QACnC,OAAS,MAAAC,MAAU,yBAoDnB,MAAMC,EAAeH,EAAM,KAAK,SAAsB,CACpD,MAAAI,EACA,YAAAC,EACA,YAAAC,EAAc,QACd,cAAAC,EAAgB,QAChB,KAAAC,EAAO,YACP,YAAAC,EACA,UAAAC,EACA,UAAAC,CACF,EAAsB,CACpB,MAAMC,EAAkBX,EAAY,IAAM,CACxCQ,EAAY,CACd,EAAG,CAACA,CAAW,CAAC,EAEVI,EAAgBZ,EAAY,IAAM,CACtCS,EAAU,CACZ,EAAG,CAACA,CAAS,CAAC,EAEd,OACEX,EAAC,OACC,KAAK,SACL,aAAW,QACX,kBAAiBK,EAAQ,uBAAyB,OAClD,UAAWF,EACT,+BACA,mBACA,yBACA,gCACA,wBACA,MACAS,CACF,EAGA,UAAAb,EAAC,QAAK,UAAU,wCAAwC,cAAY,OACjE,SAAAU,EACH,EAGAT,EAAC,OAAI,UAAU,qCACZ,UAAAK,GACCN,EAAC,KAAE,GAAG,uBAAuB,UAAU,4DACpC,SAAAM,EACH,EAGDC,GAAeP,EAAC,KAAE,UAAU,wCAAyC,SAAAO,EAAY,EAGlFN,EAAC,OAAI,UAAU,6CACb,UAAAD,EAAC,UACC,KAAK,SACL,QAASe,EACT,UAAWX,EACT,yBACA,oCACA,iCACA,wCACA,6GACF,EAEC,SAAAI,EACH,EAEAR,EAAC,UACC,KAAK,SACL,QAASc,EACT,UAAWV,EACT,yBACA,iCACA,cACA,iCACA,oBACA,6GACF,EAEC,SAAAK,EACH,GACF,GACF,GACF,CAEJ,CAAC,EAEDJ,EAAa,YAAc,eAE3B,IAAOW,EAAQX",
|
|
6
|
+
"names": ["jsx", "jsxs", "React", "useCallback", "cn", "WebPushPopup", "title", "description", "dismissText", "subscribeText", "icon", "onSubscribe", "onDismiss", "className", "handleSubscribe", "handleDismiss", "WebPushPopup_default"]
|
|
7
|
+
}
|
|
@@ -140,6 +140,10 @@ export { default as MiniCartCircleProgress } from './MiniCart/CircleProgress.js'
|
|
|
140
140
|
export type { CircleProgressProps as MiniCartCircleProgressProps } from './MiniCart/CircleProgress.js';
|
|
141
141
|
export { default as MiniCartDialog, MiniCartDialog as MiniCartDialogComponent } from './MiniCart/MiniCartDialog.js';
|
|
142
142
|
export type { MiniCartDialogProps, MiniCartDialogCopy, MiniCartDialogSemanticName, CartData, } from './MiniCart/MiniCartDialog.js';
|
|
143
|
+
export { default as WebPushPopup } from './WebPushPopup/index.js';
|
|
144
|
+
export type { WebPushPopupProps } from './WebPushPopup/index.js';
|
|
145
|
+
export { useEmarsysWebPush } from '../hooks/useEmarsysWebPush.js';
|
|
146
|
+
export type { UseEmarsysWebPushOptions, UseEmarsysWebPushReturn, EmarsysContactInfo, EmarsysInitConfig, } from '../hooks/useEmarsysWebPush.js';
|
|
143
147
|
/**
|
|
144
148
|
* 组件映射对象
|
|
145
149
|
*/
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{default as a}from"./ActivitySchedule/index.js";import{default as i}from"./GiftShelf/index.js";import{default as s}from"./GiftTierShelf/index.js";import{default as d}from"./ActivityMechanism/index.js";import{default as l}from"./BrandEquity/index.js";import{default as m}from"./MemberEquity/index.js";import{default as x}from"./Slogan/index.js";import{default as h}from"./Title/index.js";import{default as P}from"./Spacer/index.js";import{default as g}from"./ShelfDisplay/index.js";import{default as v}from"./Evaluate/index.js";import{default as B}from"./Category/index.js";import{default as j}from"./HeroBanner/index.js";import{default as
|
|
1
|
+
import{default as a}from"./ActivitySchedule/index.js";import{default as i}from"./GiftShelf/index.js";import{default as s}from"./GiftTierShelf/index.js";import{default as d}from"./ActivityMechanism/index.js";import{default as l}from"./BrandEquity/index.js";import{default as m}from"./MemberEquity/index.js";import{default as x}from"./Slogan/index.js";import{default as h}from"./Title/index.js";import{default as P}from"./Spacer/index.js";import{default as g}from"./ShelfDisplay/index.js";import{default as v}from"./Evaluate/index.js";import{default as B}from"./Category/index.js";import{default as j}from"./HeroBanner/index.js";import{default as D}from"./AccordionCards/index.js";import{default as G}from"./Graphic/index.js";import{default as k}from"./MediaPlayerBase/index.js";import{default as L}from"./MediaPlayerSticky/index.js";import{default as V}from"./MediaPlayerMulti/index.js";import{default as W}from"./Marquee/index.js";import{default as N}from"./MarqueeReview/index.js";import{default as H}from"./WhyChoose/index.js";import{default as _}from"./Faq/index.js";import{MarqueeItem as z,MarqueeImageContent as Y,MarqueeTextContent as J}from"./Marquee/index.js";import{default as X}from"./MultiLayoutGraphicBlock/index.js";import{default as $}from"./GraphicAttractionBlock/index.js";import{default as te}from"./HeaderNavigation/index.js";import{default as ae}from"./FooterNavigation/index.js";import{default as ie}from"./SearchPage/index.js";import{IPC_SEARCH_PAGE as se,SearchPageTabType as fe}from"./SearchPage/types.js";import{withLayout as ce}from"../shared/Styles.js";import{default as ue}from"./AiuiProvider/index.js";import{default as ne}from"./Tabs/index.js";import{default as ye}from"./CreativeModule/index.js";import{default as Se}from"./GraphicOverlay/index.js";import{default as Ce}from"./Specs/index.js";import{default as Me}from"./TabsGroup/index.js";import{default as Te}from"./Listing/BizProductProvider.js";import{default as Ie}from"./Listing/components/PurchaseBar/index.js";import{default as be}from"./Listing/components/PurchaseBar/ProductActions/index.js";import{default as Fe}from"./Listing/components/ProductCard/index.js";import{default as Ae}from"./Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js";import{default as we}from"./Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js";import{default as Oe}from"./Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js";import{default as Ee}from"./Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js";import{default as qe}from"./Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.js";import{default as Re}from"./Listing/components/ProductCard/ProductDetail/ProductOptions/index.js";import{default as Ke}from"./Listing/components/ProductCard/ProductDetail/ProductBundle/index.js";import{default as Ue}from"./Listing/components/ProductCard/ProductDetail/ProductCoupon/index.js";import{default as Ye}from"./Listing/components/ProductCard/ProductDetail/ProductBanner/index.js";import{default as Qe}from"./Listing/components/ProductCard/ProductGridBox.js";import{default as Ze}from"./Listing/components/ProductCard/ProductGallery/index.js";import{default as et}from"./Listing/components/ProductCard/ProductDetail/index.js";import{default as rt}from"./Listing/components/ProductCard/ProductSummary/index.js";import{default as ot}from"./Listing/components/ProductCard/ProductDetail/BenefitsTab.js";import{default as pt}from"./Listing/components/PaidShipping/index.js";import{default as ft}from"./Listing/components/ProductCard/ProductPaidShipping/index.js";import{default as ct}from"./GraphicMore/index.js";import{default as ut}from"./Features/index.js";import{default as nt}from"./AplusDesc/index.js";import{default as yt}from"./GiftBox/index.js";import{default as St}from"./SelectStore/index.js";import{default as Ct}from"./DownLoad/index.js";import{default as Mt}from"./FootCharger/index.js";import{default as Tt}from"./BrandCardLink/index.js";import*as Bt from"./IPRedirect/index.js";import{default as jt}from"./WheelLottery/index.js";import{default as Dt}from"./ProductLottery/index.js";import{default as Gt}from"./ProductCompare/index.js";import{default as kt}from"./Ksp/index.js";import{default as Lt}from"./ImageTextFeature/index.js";import{default as Vt}from"./FeatureCards/index.js";import{default as Wt}from"./FeaturedBlogPosts/index.js";import{default as Nt}from"./ImageWithText/index.js";import{default as Ht}from"./VideoFeature/index.js";import{default as _t}from"./TabsWithMedia/index.js";import{default as zt}from"./TabWithImage/index.js";import{default as Jt}from"./FeatureShowcase/index.js";import{default as Xt}from"./ProductHero/index.js";import{default as $t}from"./SpecsComparison/index.js";import{default as tr}from"./MediaSceneSwitcher/index.js";import{default as ar}from"./MediaSceneSwitcherV2/index.js";import{default as ir}from"./ThreeDCarousel/index.js";import{default as sr}from"./ProductNav/index.js";import{default as dr}from"./AnchorNavigation/index.js";import{default as lr}from"./PromotionalBar/index.js";import{default as mr}from"./EventSchedule/index.js";import{default as xr}from"./SecondaryBanner/index.js";import{default as hr}from"./BuyOneGetOneShelf/index.js";import{default as Pr}from"./ActiveShelf/index.js";import{default as gr}from"./MediaShelf/index.js";import{default as vr,CreditsProductCard as Tr}from"./CreditsShelf/index.js";import{default as Ir,SceneProductCard as jr}from"./SceneShelf/index.js";import{default as Dr,SceneShelfV2ProductCard as Fr}from"./SceneShelfV2/index.js";import{default as Ar}from"./SceneShelfV3/index.js";import{default as wr}from"./MediaEndorsement/index.js";import{default as Or}from"./MediaTextOverlay/index.js";import{default as Er}from"./ImageOverlayShelf/index.js";import{default as qr}from"./ImageTextOverlay/index.js";import{default as Rr}from"./MiniCart/index.js";import{default as Kr}from"./MiniCart/CircleProgress.js";import{default as Ur,MiniCartDialog as zr}from"./MiniCart/MiniCartDialog.js";import{default as Jr}from"./WebPushPopup/index.js";import{useEmarsysWebPush as Xr}from"../hooks/useEmarsysWebPush.js";const e={"ipc-accordioncards":"AccordionCards","ipc-aplusdesc":"AplusDesc","ipc-banner":"HeroBanner","ipc-brand-equity":"BrandEquity","ipc-category":"Category","ipc-collection-banner":"CollectionBanner","ipc-collection-shelves":"CollectionShelves","ipc-creativemodule":"CreativeModule","ipc-download":"DownLoad","ipc-evaluate":"Evaluate","ipc-faq":"Faq","ipc-features":"Features","ipc-footcharger":"FootCharger","ipc-ga-block":"GraphicAttractionBlock","ipc-giftbox":"GiftBox","ipc-giftshelf":"GiftShelf","ipc-graphic":"Graphic","ipc-graphicmore":"GraphicMore","ipc-graphicoverlay":"GraphicOverlay","ipc-marquee":"Marquee","ipc-mediaplayerbase":"MediaPlayerBase","ipc-mediaplayermulti":"MediaPlayerMulti","ipc-mediaplayersticky":"MediaPlayerSticky","ipc-member-equity":"MemberEquity","ipc-mlg-block":"MultiLayoutGraphicBlock","ipc-search-page-tabs":"SearchPageBlock","ipc-selectstore":"SelectStore","ipc-shelfdisplay":"ShelfDisplay","ipc-slogan":"Slogan","ipc-spacer":"Spacer","ipc-specs":"Specs","ipc-tabs":"TabsBlock","ipc-text-marquee":"TextMarquee","ipc-title":"Title","ipc-whychoose":"WhyChoose","ipc-product-nav":"ProductNav","ipc-brand-card-link":"BrandCardLink","ipc-ipredirect":"IPRedirect",ksp:"Ksp","ipc-secondary-banner":"SecondaryBanner","ipc-active-shelf":"ActiveShelf","ipc-media-shelf":"MediaShelf","ipc-bogo-shelf":"BuyOneGetOneShelf","ipc-media-endorsement":"MediaEndorsement","ipc-media-scene-switcher-v2":"MediaSceneSwitcherV2","ipc-featured-blog-posts":"FeaturedBlogPosts"};export{D as AccordionCards,Pr as ActiveShelf,d as ActivityMechanism,a as ActivitySchedule,ue as AiuiProvider,dr as AnchorNavigation,nt as AplusDesc,ot as BenefitsTab,Te as BizProductProvider,Tt as BrandCardLink,l as BrandEquity,hr as BuyOneGetOneShelf,B as Category,ye as CreativeModule,Tr as CreditsProductCard,vr as CreditsShelf,Ct as DownLoad,v as Evaluate,mr as EventSchedule,_ as Faq,Vt as FeatureCards,Jt as FeatureShowcase,Wt as FeaturedBlogPosts,ut as Features,Mt as FootCharger,ae as FooterNavigation,yt as GiftBox,i as GiftShelf,s as GiftTierShelf,G as Graphic,$ as GraphicAttractionBlock,ct as GraphicMore,Se as GraphicOverlay,te as HeaderNavigation,j as HeroBanner,se as IPC_SEARCH_PAGE,Bt as IPRedirect,Er as ImageOverlayShelf,Lt as ImageTextFeature,qr as ImageTextOverlay,Nt as ImageWithText,kt as Ksp,W as Marquee,Y as MarqueeImageContent,z as MarqueeItem,N as MarqueeReview,J as MarqueeTextContent,wr as MediaEndorsement,k as MediaPlayerBase,V as MediaPlayerMulti,L as MediaPlayerSticky,tr as MediaSceneSwitcher,ar as MediaSceneSwitcherV2,gr as MediaShelf,Or as MediaTextOverlay,m as MemberEquity,Rr as MiniCart,Kr as MiniCartCircleProgress,Ur as MiniCartDialog,zr as MiniCartDialogComponent,X as MultiLayoutGraphicBlock,e as PAYLOAD_COMPONENT_MAP,pt as PaidShipping,be as ProductActions,Ye as ProductBanner,we as ProductBenefits,Ae as ProductBenefitsTabs,Ke as ProductBundle,Fe as ProductCard,Gt as ProductCompare,Ue as ProductCoupon,et as ProductDetail,qe as ProductExchangePurchase,Ee as ProductFreeGift,Ze as ProductGallery,Qe as ProductGridBox,Xt as ProductHero,Oe as ProductHighlight,Dt as ProductLottery,sr as ProductNav,Re as ProductOptions,ft as ProductPaidShipping,rt as ProductSummary,lr as PromotionalBar,Ie as PurchaseBar,jr as SceneProductCard,Ir as SceneShelf,Dr as SceneShelfV2,Fr as SceneShelfV2ProductCard,Ar as SceneShelfV3,ie as SearchPage,fe as SearchPageTabType,xr as SecondaryBanner,St as SelectStore,g as ShelfDisplay,x as Slogan,P as Spacer,Ce as Specs,$t as SpecsComparison,Me as TabGroup,zt as TabWithImage,ne as Tabs,_t as TabsWithMedia,ir as ThreeDCarousel,h as Title,Ht as VideoFeature,Jr as WebPushPopup,jt as WheelLottery,H as WhyChoose,Xr as useEmarsysWebPush,ce as withLayout};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/biz-components/index.ts"],
|
|
4
|
-
"sourcesContent": ["export { default as ActivitySchedule } from './ActivitySchedule/index.js'\nexport type { ActivityScheduleProps, ActivityScheduleData, ActivityScheduleItem } from './ActivitySchedule/types.js'\nexport { default as GiftShelf } from './GiftShelf/index.js'\nexport type {\n GiftShelfProps,\n GiftShelfData,\n GiftShelfItem,\n CountdownConfig,\n ResponsiveBackgroundImage as GiftShelfResponsiveBackgroundImage,\n} from './GiftShelf/types.js'\nexport { default as GiftTierShelf } from './GiftTierShelf/index.js'\nexport type { GiftTierShelfProps, GiftTierShelfData, GiftTierItem, GiftTierProduct } from './GiftTierShelf/types.js'\nexport { default as ActivityMechanism } from './ActivityMechanism/index.js'\nexport type {\n ActivityMechanismProps,\n ActivityMechanismItem,\n ActivityMechanismSemanticName,\n ResponsiveBackgroundImage,\n} from './ActivityMechanism/types.js'\nexport { default as BrandEquity } from './BrandEquity/index.js'\nexport { default as MemberEquity } from './MemberEquity/index.js'\nexport { default as Slogan } from './Slogan/index.js'\nexport { default as Title } from './Title/index.js'\nexport { default as Spacer } from './Spacer/index.js'\nexport { default as ShelfDisplay } from './ShelfDisplay/index.js'\nexport { default as Evaluate } from './Evaluate/index.js'\nexport { default as Category } from './Category/index.js'\nexport { default as HeroBanner } from './HeroBanner/index.js'\nexport { default as AccordionCards } from './AccordionCards/index.js'\nexport { default as Graphic } from './Graphic/index.js'\nexport { default as MediaPlayerBase } from './MediaPlayerBase/index.js'\nexport { default as MediaPlayerSticky } from './MediaPlayerSticky/index.js'\nexport { default as MediaPlayerMulti } from './MediaPlayerMulti/index.js'\nexport { default as Marquee } from './Marquee/index.js'\nexport { default as MarqueeReview } from './MarqueeReview/index.js'\nexport type { MarqueeReviewProps, MarqueeReviewData, ReviewItem } from './MarqueeReview/index.js'\nexport { default as WhyChoose } from './WhyChoose/index.js'\nexport { default as Faq } from './Faq/index.js'\nexport { MarqueeItem, MarqueeImageContent, MarqueeTextContent } from './Marquee/index.js'\nexport { default as MultiLayoutGraphicBlock } from './MultiLayoutGraphicBlock/index.js'\nexport type { MultiLayoutGraphicBlockProps } from './MultiLayoutGraphicBlock/index.js'\nexport { default as GraphicAttractionBlock } from './GraphicAttractionBlock/index.js'\nexport type { GraphicAttractionBlockProps } from './GraphicAttractionBlock/index.js'\nexport { default as HeaderNavigation } from './HeaderNavigation/index.js'\nexport { default as FooterNavigation } from './FooterNavigation/index.js'\nexport { default as SearchPage } from './SearchPage/index.js'\nexport type { SearchPageProps } from './SearchPage/types.js'\nexport { IPC_SEARCH_PAGE, SearchPageTabType } from './SearchPage/types.js'\n\nexport { withLayout } from '../shared/Styles.js'\nexport { default as AiuiProvider } from './AiuiProvider/index.js'\nexport { default as Tabs } from './Tabs/index.js'\nexport { default as CreativeModule } from './CreativeModule/index.js'\nexport { default as GraphicOverlay } from './GraphicOverlay/index.js'\nexport { default as Specs } from './Specs/index.js'\nexport { default as TabGroup } from './TabsGroup/index.js'\n\nexport { default as BizProductProvider } from './Listing/BizProductProvider.js'\nexport { default as PurchaseBar } from './Listing/components/PurchaseBar/index.js'\nexport { default as ProductActions } from './Listing/components/PurchaseBar/ProductActions/index.js'\nexport type { ProductActionsProps } from './Listing/components/PurchaseBar/ProductActions/index.js'\nexport { default as ProductCard } from './Listing/components/ProductCard/index.js'\nexport { default as ProductBenefitsTabs } from './Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js'\nexport { default as ProductBenefits } from './Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js'\nexport { default as ProductHighlight } from './Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js'\nexport { default as ProductFreeGift } from './Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js'\nexport { default as ProductExchangePurchase } from './Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.js'\nexport { default as ProductOptions } from './Listing/components/ProductCard/ProductDetail/ProductOptions/index.js'\nexport { default as ProductBundle } from './Listing/components/ProductCard/ProductDetail/ProductBundle/index.js'\nexport { default as ProductCoupon } from './Listing/components/ProductCard/ProductDetail/ProductCoupon/index.js'\nexport { default as ProductBanner } from './Listing/components/ProductCard/ProductDetail/ProductBanner/index.js'\nexport { default as ProductGridBox } from './Listing/components/ProductCard/ProductGridBox.js'\nexport { default as ProductGallery } from './Listing/components/ProductCard/ProductGallery/index.js'\nexport { default as ProductDetail } from './Listing/components/ProductCard/ProductDetail/index.js'\nexport { default as ProductSummary } from './Listing/components/ProductCard/ProductSummary/index.js'\nexport { default as BenefitsTab } from './Listing/components/ProductCard/ProductDetail/BenefitsTab.js'\nexport { default as PaidShipping } from './Listing/components/PaidShipping/index.js'\nexport { default as ProductPaidShipping } from './Listing/components/ProductCard/ProductPaidShipping/index.js'\n\nexport { default as GraphicMore } from './GraphicMore/index.js'\nexport { default as Features } from './Features/index.js'\nexport { default as AplusDesc } from './AplusDesc/index.js'\nexport { default as GiftBox } from './GiftBox/index.js'\nexport { default as SelectStore } from './SelectStore/index.js'\nexport { default as DownLoad } from './DownLoad/index.js'\nexport { default as FootCharger } from './FootCharger/index.js'\nexport { default as BrandCardLink } from './BrandCardLink/index.js'\nexport type { BrandCardLinkProps, BrandCardLinkItemProps } from './BrandCardLink/types.js'\n\nexport * as IPRedirect from './IPRedirect/index.js'\n\nexport { default as WheelLottery } from './WheelLottery/index.js'\nexport type {\n WheelLotteryProps,\n WheelLotteryHandle,\n Prize,\n ChanceMethod,\n WinningInfo,\n UserData,\n} from './WheelLottery/types.js'\nexport { default as ProductLottery } from './ProductLottery/index.js'\nexport type { ProductLotteryProps, ProductLotteryHandle, MediaConfig, CtaButtonConfig } from './ProductLottery/types.js'\nexport { default as ProductCompare } from './ProductCompare/index.js'\nexport type { ProductCompareProps, ProductItemData } from './ProductCompare/index.js'\nexport { default as Ksp } from './Ksp/index.js'\nexport type { KspProps, KspData, KspCardItem } from './Ksp/index.js'\nexport { default as ImageTextFeature } from './ImageTextFeature/index.js'\nexport type { ImageTextFeatureProps, ImageTextFeatureItem } from './ImageTextFeature/index.js'\nexport { default as FeatureCards } from './FeatureCards/index.js'\nexport type { FeatureCardsProps, FeatureCardItem } from './FeatureCards/index.js'\nexport { default as FeaturedBlogPosts } from './FeaturedBlogPosts/index.js'\nexport type {\n FeaturedBlogPostsProps,\n FeaturedBlogPostsData,\n FeaturedBlogPostItem,\n FeaturedBlogPostSpan,\n} from './FeaturedBlogPosts/index.js'\nexport { default as ImageWithText } from './ImageWithText/index.js'\nexport type { ImageWithTextProps } from './ImageWithText/index.js'\nexport { default as VideoFeature } from './VideoFeature/index.js'\nexport type { VideoFeatureProps } from './VideoFeature/index.js'\nexport { default as TabsWithMedia } from './TabsWithMedia/index.js'\nexport type { TabsWithMediaProps, TabItem, TimeIndex } from './TabsWithMedia/index.js'\nexport { default as TabWithImage } from './TabWithImage/index.js'\nexport type { TabWithImageProps, TabWithImageDataItem } from './TabWithImage/index.js'\nexport { default as FeatureShowcase } from './FeatureShowcase/index.js'\nexport type { FeatureShowcaseProps, FeatureShowcaseItem } from './FeatureShowcase/index.js'\nexport { default as ProductHero } from './ProductHero/index.js'\nexport type { ProductHeroProps } from './ProductHero/index.js'\nexport { default as SpecsComparison } from './SpecsComparison/index.js'\nexport type {\n SpecsComparisonProps,\n SpecsComparisonMenuItem,\n SpecsComparisonLeftMenuItem,\n} from './SpecsComparison/index.js'\nexport { default as MediaSceneSwitcher } from './MediaSceneSwitcher/index.js'\nexport type { MediaSceneSwitcherProps } from './MediaSceneSwitcher/types.js'\nexport { default as MediaSceneSwitcherV2 } from './MediaSceneSwitcherV2/index.js'\nexport type {\n MediaSceneSwitcherV2Props,\n MediaSceneSwitcherV2Data,\n MediaSceneSwitcherV2Item,\n MediaSceneSwitcherV2Layout,\n} from './MediaSceneSwitcherV2/index.js'\nexport { default as ThreeDCarousel } from './ThreeDCarousel/index.js'\nexport type { ThreeDCarouselProps } from './ThreeDCarousel/index.js'\nexport { default as ProductNav } from './ProductNav/index.js'\nexport type { ProductNavProps, TabLink, AnchorItem, BuyButton } from './ProductNav/index.js'\nexport { default as AnchorNavigation } from './AnchorNavigation/index.js'\nexport { default as PromotionalBar } from './PromotionalBar/index.js'\nexport { default as EventSchedule } from './EventSchedule/index.js'\nexport { default as SecondaryBanner } from './SecondaryBanner/index.js'\nexport { default as BuyOneGetOneShelf } from './BuyOneGetOneShelf/index.js'\nexport { default as ActiveShelf } from './ActiveShelf/index.js'\nexport { default as MediaShelf } from './MediaShelf/index.js'\nexport { default as CreditsShelf, CreditsProductCard } from './CreditsShelf/index.js'\nexport type {\n CreditsShelfSemanticName,\n CreditsProductCardData,\n CopyConfig as CreditsShelfCopyConfig,\n ButtonFunctionType as CreditsShelfButtonFunctionType,\n} from './CreditsShelf/index.js'\nexport { default as SceneShelf, SceneProductCard } from './SceneShelf/index.js'\nexport type { SceneShelfSemanticName, SceneProductCardData, SceneProductCardSemanticName } from './SceneShelf/index.js'\nexport { default as SceneShelfV2, SceneShelfV2ProductCard } from './SceneShelfV2/index.js'\nexport type {\n SceneShelfV2SemanticName,\n SceneShelfV2Data,\n SceneShelfV2Product,\n SceneShelfV2Props,\n} from './SceneShelfV2/index.js'\nexport { default as SceneShelfV3 } from './SceneShelfV3/index.js'\nexport type { SceneShelfV3Data, SceneShelfV3Props, ProductTab as SceneShelfV3ProductTab } from './SceneShelfV3/index.js'\nexport type {\n SceneShelfV3SemanticName,\n ProductCardData as SceneShelfV3ProductCardData,\n} from './SceneShelfV3/ProductCard.js'\n\nexport { default as MediaEndorsement } from './MediaEndorsement/index.js'\nexport type {\n MediaEndorsementProps,\n MediaEndorsementData,\n MediaEndorsementItem,\n MediaEndorsementSemanticName,\n} from './MediaEndorsement/index.js'\n\nexport { default as MediaTextOverlay } from './MediaTextOverlay/index.js'\nexport type {\n MediaTextOverlayProps,\n MediaTextOverlayData,\n MediaTextOverlayItem,\n MediaTextOverlaySemanticName,\n ResponsiveMedia,\n} from './MediaTextOverlay/index.js'\n\n// Copy configuration types and defaults\nexport type {\n CopyConfig as MediaShelfCopyConfig,\n ButtonFunctionType as MediaShelfButtonFunctionType,\n} from './MediaShelf/types.js'\nexport type { CopyConfig as ActiveShelfCopyConfig, ButtonFunctionType } from './ActiveShelf/types.js'\n\nexport {\n default as ImageOverlayShelf,\n type ButtonFunctionType as ImageOverlayShelfButtonFunctionType,\n} from './ImageOverlayShelf/index.js'\n\nexport { default as ImageTextOverlay } from './ImageTextOverlay/index.js'\nexport type {\n ImageTextOverlayProps,\n ImageTextOverlayData,\n ImageTextOverlayItem,\n ImageTextOverlaySemanticName,\n ImageTextOverlayBackgroundImage,\n} from './ImageTextOverlay/types.js'\n\n// MiniCart \u7EC4\u4EF6\u53CA\u7C7B\u578B\u5BFC\u51FA\nexport { default as MiniCart } from './MiniCart/index.js'\nexport type { Cart, CartLineItem, MiniCartData, MiniCartProps, CircleProgressConfig } from './MiniCart/index.js'\nexport { default as MiniCartCircleProgress } from './MiniCart/CircleProgress.js'\nexport type { CircleProgressProps as MiniCartCircleProgressProps } from './MiniCart/CircleProgress.js'\nexport { default as MiniCartDialog, MiniCartDialog as MiniCartDialogComponent } from './MiniCart/MiniCartDialog.js'\nexport type {\n MiniCartDialogProps,\n MiniCartDialogCopy,\n MiniCartDialogSemanticName,\n CartData,\n} from './MiniCart/MiniCartDialog.js'\n\n/**\n * \u7EC4\u4EF6\u6620\u5C04\u5BF9\u8C61\n */\n\nexport const PAYLOAD_COMPONENT_MAP = {\n 'ipc-accordioncards': 'AccordionCards',\n 'ipc-aplusdesc': 'AplusDesc',\n 'ipc-banner': 'HeroBanner',\n 'ipc-brand-equity': 'BrandEquity',\n 'ipc-category': 'Category',\n 'ipc-collection-banner': 'CollectionBanner',\n 'ipc-collection-shelves': 'CollectionShelves',\n 'ipc-creativemodule': 'CreativeModule',\n 'ipc-download': 'DownLoad',\n 'ipc-evaluate': 'Evaluate',\n 'ipc-faq': 'Faq',\n 'ipc-features': 'Features',\n 'ipc-footcharger': 'FootCharger',\n 'ipc-ga-block': 'GraphicAttractionBlock',\n 'ipc-giftbox': 'GiftBox',\n 'ipc-giftshelf': 'GiftShelf',\n 'ipc-graphic': 'Graphic',\n 'ipc-graphicmore': 'GraphicMore',\n 'ipc-graphicoverlay': 'GraphicOverlay',\n 'ipc-marquee': 'Marquee',\n 'ipc-mediaplayerbase': 'MediaPlayerBase',\n 'ipc-mediaplayermulti': 'MediaPlayerMulti',\n 'ipc-mediaplayersticky': 'MediaPlayerSticky',\n 'ipc-member-equity': 'MemberEquity',\n 'ipc-mlg-block': 'MultiLayoutGraphicBlock',\n 'ipc-search-page-tabs': 'SearchPageBlock',\n 'ipc-selectstore': 'SelectStore',\n 'ipc-shelfdisplay': 'ShelfDisplay',\n 'ipc-slogan': 'Slogan',\n 'ipc-spacer': 'Spacer',\n 'ipc-specs': 'Specs',\n 'ipc-tabs': 'TabsBlock',\n 'ipc-text-marquee': 'TextMarquee',\n 'ipc-title': 'Title',\n 'ipc-whychoose': 'WhyChoose',\n 'ipc-product-nav': 'ProductNav',\n 'ipc-brand-card-link': 'BrandCardLink',\n 'ipc-ipredirect': 'IPRedirect',\n ksp: 'Ksp',\n 'ipc-secondary-banner': 'SecondaryBanner',\n /**\n * \u6D3B\u52A8\u8D27\u67B6\n */\n 'ipc-active-shelf': 'ActiveShelf',\n 'ipc-media-shelf': 'MediaShelf',\n /**\n * \u6D3B\u52A8\u4E70\u8D60\u8D27\u67B6\n */\n 'ipc-bogo-shelf': 'BuyOneGetOneShelf',\n 'ipc-media-endorsement': 'MediaEndorsement',\n 'ipc-media-scene-switcher-v2': 'MediaSceneSwitcherV2',\n 'ipc-featured-blog-posts': 'FeaturedBlogPosts',\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAAoB,WAAXA,MAAmC,8BAE5C,OAAoB,WAAXA,MAA4B,uBAQrC,OAAoB,WAAXA,MAAgC,2BAEzC,OAAoB,WAAXA,MAAoC,+BAO7C,OAAoB,WAAXA,MAA8B,yBACvC,OAAoB,WAAXA,MAA+B,0BACxC,OAAoB,WAAXA,MAAyB,oBAClC,OAAoB,WAAXA,MAAwB,mBACjC,OAAoB,WAAXA,MAAyB,oBAClC,OAAoB,WAAXA,MAA+B,0BACxC,OAAoB,WAAXA,MAA2B,sBACpC,OAAoB,WAAXA,MAA2B,sBACpC,OAAoB,WAAXA,MAA6B,wBACtC,OAAoB,WAAXA,MAAiC,4BAC1C,OAAoB,WAAXA,MAA0B,qBACnC,OAAoB,WAAXA,MAAkC,6BAC3C,OAAoB,WAAXA,MAAoC,+BAC7C,OAAoB,WAAXA,MAAmC,8BAC5C,OAAoB,WAAXA,MAA0B,qBACnC,OAAoB,WAAXA,MAAgC,2BAEzC,OAAoB,WAAXA,MAA4B,uBACrC,OAAoB,WAAXA,MAAsB,iBAC/B,OAAS,eAAAC,EAAa,uBAAAC,EAAqB,sBAAAC,MAA0B,qBACrE,OAAoB,WAAXH,MAA0C,qCAEnD,OAAoB,WAAXA,MAAyC,oCAElD,OAAoB,WAAXA,OAAmC,8BAC5C,OAAoB,WAAXA,OAAmC,8BAC5C,OAAoB,WAAXA,OAA6B,wBAEtC,OAAS,mBAAAI,GAAiB,qBAAAC,OAAyB,wBAEnD,OAAS,cAAAC,OAAkB,sBAC3B,OAAoB,WAAXN,OAA+B,0BACxC,OAAoB,WAAXA,OAAuB,kBAChC,OAAoB,WAAXA,OAAiC,4BAC1C,OAAoB,WAAXA,OAAiC,4BAC1C,OAAoB,WAAXA,OAAwB,mBACjC,OAAoB,WAAXA,OAA2B,uBAEpC,OAAoB,WAAXA,OAAqC,kCAC9C,OAAoB,WAAXA,OAA8B,4CACvC,OAAoB,WAAXA,OAAiC,2DAE1C,OAAoB,WAAXA,OAA8B,4CACvC,OAAoB,WAAXA,OAAsC,8EAC/C,OAAoB,WAAXA,OAAkC,0EAC3C,OAAoB,WAAXA,OAAmC,2EAC5C,OAAoB,WAAXA,OAAkC,0EAC3C,OAAoB,WAAXA,OAA0C,kFACnD,OAAoB,WAAXA,OAAiC,yEAC1C,OAAoB,WAAXA,OAAgC,wEACzC,OAAoB,WAAXA,OAAgC,wEACzC,OAAoB,WAAXA,OAAgC,wEACzC,OAAoB,WAAXA,OAAiC,qDAC1C,OAAoB,WAAXA,OAAiC,2DAC1C,OAAoB,WAAXA,OAAgC,0DACzC,OAAoB,WAAXA,OAAiC,2DAC1C,OAAoB,WAAXA,OAA8B,gEACvC,OAAoB,WAAXA,OAA+B,6CACxC,OAAoB,WAAXA,OAAsC,gEAE/C,OAAoB,WAAXA,OAA8B,yBACvC,OAAoB,WAAXA,OAA2B,sBACpC,OAAoB,WAAXA,OAA4B,uBACrC,OAAoB,WAAXA,OAA0B,qBACnC,OAAoB,WAAXA,OAA8B,yBACvC,OAAoB,WAAXA,OAA2B,sBACpC,OAAoB,WAAXA,OAA8B,yBACvC,OAAoB,WAAXA,OAAgC,2BAGzC,UAAYO,OAAgB,wBAE5B,OAAoB,WAAXP,OAA+B,0BASxC,OAAoB,WAAXA,OAAiC,4BAE1C,OAAoB,WAAXA,OAAiC,4BAE1C,OAAoB,WAAXA,OAAsB,iBAE/B,OAAoB,WAAXA,OAAmC,8BAE5C,OAAoB,WAAXA,OAA+B,0BAExC,OAAoB,WAAXA,OAAoC,+BAO7C,OAAoB,WAAXA,OAAgC,2BAEzC,OAAoB,WAAXA,OAA+B,0BAExC,OAAoB,WAAXA,OAAgC,2BAEzC,OAAoB,WAAXA,OAA+B,0BAExC,OAAoB,WAAXA,OAAkC,6BAE3C,OAAoB,WAAXA,OAA8B,yBAEvC,OAAoB,WAAXA,OAAkC,6BAM3C,OAAoB,WAAXA,OAAqC,gCAE9C,OAAoB,WAAXA,OAAuC,kCAOhD,OAAoB,WAAXA,OAAiC,4BAE1C,OAAoB,WAAXA,OAA6B,wBAEtC,OAAoB,WAAXA,OAAmC,8BAC5C,OAAoB,WAAXA,OAAiC,4BAC1C,OAAoB,WAAXA,OAAgC,2BACzC,OAAoB,WAAXA,OAAkC,6BAC3C,OAAoB,WAAXA,OAAoC,+BAC7C,OAAoB,WAAXA,OAA8B,yBACvC,OAAoB,WAAXA,OAA6B,wBACtC,OAAoB,WAAXA,GAAyB,sBAAAQ,OAA0B,0BAO5D,OAAoB,WAAXR,GAAuB,oBAAAS,OAAwB,wBAExD,OAAoB,WAAXT,GAAyB,2BAAAU,OAA+B,0BAOjE,OAAoB,WAAXV,OAA+B,0BAOxC,OAAoB,WAAXA,OAAmC,8BAQ5C,OAAoB,WAAXA,OAAmC,8BAgB5C,OACa,WAAXA,OAEK,+BAEP,OAAoB,WAAXA,OAAmC,8BAU5C,OAAoB,WAAXA,OAA2B,sBAEpC,OAAoB,WAAXA,OAAyC,+BAElD,OAAoB,WAAXA,GAA6C,kBAAlBW,OAAiD,+
|
|
6
|
-
"names": ["default", "MarqueeItem", "MarqueeImageContent", "MarqueeTextContent", "IPC_SEARCH_PAGE", "SearchPageTabType", "withLayout", "IPRedirect", "CreditsProductCard", "SceneProductCard", "SceneShelfV2ProductCard", "MiniCartDialog", "PAYLOAD_COMPONENT_MAP"]
|
|
4
|
+
"sourcesContent": ["export { default as ActivitySchedule } from './ActivitySchedule/index.js'\nexport type { ActivityScheduleProps, ActivityScheduleData, ActivityScheduleItem } from './ActivitySchedule/types.js'\nexport { default as GiftShelf } from './GiftShelf/index.js'\nexport type {\n GiftShelfProps,\n GiftShelfData,\n GiftShelfItem,\n CountdownConfig,\n ResponsiveBackgroundImage as GiftShelfResponsiveBackgroundImage,\n} from './GiftShelf/types.js'\nexport { default as GiftTierShelf } from './GiftTierShelf/index.js'\nexport type { GiftTierShelfProps, GiftTierShelfData, GiftTierItem, GiftTierProduct } from './GiftTierShelf/types.js'\nexport { default as ActivityMechanism } from './ActivityMechanism/index.js'\nexport type {\n ActivityMechanismProps,\n ActivityMechanismItem,\n ActivityMechanismSemanticName,\n ResponsiveBackgroundImage,\n} from './ActivityMechanism/types.js'\nexport { default as BrandEquity } from './BrandEquity/index.js'\nexport { default as MemberEquity } from './MemberEquity/index.js'\nexport { default as Slogan } from './Slogan/index.js'\nexport { default as Title } from './Title/index.js'\nexport { default as Spacer } from './Spacer/index.js'\nexport { default as ShelfDisplay } from './ShelfDisplay/index.js'\nexport { default as Evaluate } from './Evaluate/index.js'\nexport { default as Category } from './Category/index.js'\nexport { default as HeroBanner } from './HeroBanner/index.js'\nexport { default as AccordionCards } from './AccordionCards/index.js'\nexport { default as Graphic } from './Graphic/index.js'\nexport { default as MediaPlayerBase } from './MediaPlayerBase/index.js'\nexport { default as MediaPlayerSticky } from './MediaPlayerSticky/index.js'\nexport { default as MediaPlayerMulti } from './MediaPlayerMulti/index.js'\nexport { default as Marquee } from './Marquee/index.js'\nexport { default as MarqueeReview } from './MarqueeReview/index.js'\nexport type { MarqueeReviewProps, MarqueeReviewData, ReviewItem } from './MarqueeReview/index.js'\nexport { default as WhyChoose } from './WhyChoose/index.js'\nexport { default as Faq } from './Faq/index.js'\nexport { MarqueeItem, MarqueeImageContent, MarqueeTextContent } from './Marquee/index.js'\nexport { default as MultiLayoutGraphicBlock } from './MultiLayoutGraphicBlock/index.js'\nexport type { MultiLayoutGraphicBlockProps } from './MultiLayoutGraphicBlock/index.js'\nexport { default as GraphicAttractionBlock } from './GraphicAttractionBlock/index.js'\nexport type { GraphicAttractionBlockProps } from './GraphicAttractionBlock/index.js'\nexport { default as HeaderNavigation } from './HeaderNavigation/index.js'\nexport { default as FooterNavigation } from './FooterNavigation/index.js'\nexport { default as SearchPage } from './SearchPage/index.js'\nexport type { SearchPageProps } from './SearchPage/types.js'\nexport { IPC_SEARCH_PAGE, SearchPageTabType } from './SearchPage/types.js'\n\nexport { withLayout } from '../shared/Styles.js'\nexport { default as AiuiProvider } from './AiuiProvider/index.js'\nexport { default as Tabs } from './Tabs/index.js'\nexport { default as CreativeModule } from './CreativeModule/index.js'\nexport { default as GraphicOverlay } from './GraphicOverlay/index.js'\nexport { default as Specs } from './Specs/index.js'\nexport { default as TabGroup } from './TabsGroup/index.js'\n\nexport { default as BizProductProvider } from './Listing/BizProductProvider.js'\nexport { default as PurchaseBar } from './Listing/components/PurchaseBar/index.js'\nexport { default as ProductActions } from './Listing/components/PurchaseBar/ProductActions/index.js'\nexport type { ProductActionsProps } from './Listing/components/PurchaseBar/ProductActions/index.js'\nexport { default as ProductCard } from './Listing/components/ProductCard/index.js'\nexport { default as ProductBenefitsTabs } from './Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js'\nexport { default as ProductBenefits } from './Listing/components/ProductCard/ProductDetail/ProductBenefits/index.js'\nexport { default as ProductHighlight } from './Listing/components/ProductCard/ProductDetail/ProductHighlight/index.js'\nexport { default as ProductFreeGift } from './Listing/components/ProductCard/ProductDetail/ProductFreeGift/index.js'\nexport { default as ProductExchangePurchase } from './Listing/components/ProductCard/ProductDetail/ProductExchangePurchase/index.js'\nexport { default as ProductOptions } from './Listing/components/ProductCard/ProductDetail/ProductOptions/index.js'\nexport { default as ProductBundle } from './Listing/components/ProductCard/ProductDetail/ProductBundle/index.js'\nexport { default as ProductCoupon } from './Listing/components/ProductCard/ProductDetail/ProductCoupon/index.js'\nexport { default as ProductBanner } from './Listing/components/ProductCard/ProductDetail/ProductBanner/index.js'\nexport { default as ProductGridBox } from './Listing/components/ProductCard/ProductGridBox.js'\nexport { default as ProductGallery } from './Listing/components/ProductCard/ProductGallery/index.js'\nexport { default as ProductDetail } from './Listing/components/ProductCard/ProductDetail/index.js'\nexport { default as ProductSummary } from './Listing/components/ProductCard/ProductSummary/index.js'\nexport { default as BenefitsTab } from './Listing/components/ProductCard/ProductDetail/BenefitsTab.js'\nexport { default as PaidShipping } from './Listing/components/PaidShipping/index.js'\nexport { default as ProductPaidShipping } from './Listing/components/ProductCard/ProductPaidShipping/index.js'\n\nexport { default as GraphicMore } from './GraphicMore/index.js'\nexport { default as Features } from './Features/index.js'\nexport { default as AplusDesc } from './AplusDesc/index.js'\nexport { default as GiftBox } from './GiftBox/index.js'\nexport { default as SelectStore } from './SelectStore/index.js'\nexport { default as DownLoad } from './DownLoad/index.js'\nexport { default as FootCharger } from './FootCharger/index.js'\nexport { default as BrandCardLink } from './BrandCardLink/index.js'\nexport type { BrandCardLinkProps, BrandCardLinkItemProps } from './BrandCardLink/types.js'\n\nexport * as IPRedirect from './IPRedirect/index.js'\n\nexport { default as WheelLottery } from './WheelLottery/index.js'\nexport type {\n WheelLotteryProps,\n WheelLotteryHandle,\n Prize,\n ChanceMethod,\n WinningInfo,\n UserData,\n} from './WheelLottery/types.js'\nexport { default as ProductLottery } from './ProductLottery/index.js'\nexport type { ProductLotteryProps, ProductLotteryHandle, MediaConfig, CtaButtonConfig } from './ProductLottery/types.js'\nexport { default as ProductCompare } from './ProductCompare/index.js'\nexport type { ProductCompareProps, ProductItemData } from './ProductCompare/index.js'\nexport { default as Ksp } from './Ksp/index.js'\nexport type { KspProps, KspData, KspCardItem } from './Ksp/index.js'\nexport { default as ImageTextFeature } from './ImageTextFeature/index.js'\nexport type { ImageTextFeatureProps, ImageTextFeatureItem } from './ImageTextFeature/index.js'\nexport { default as FeatureCards } from './FeatureCards/index.js'\nexport type { FeatureCardsProps, FeatureCardItem } from './FeatureCards/index.js'\nexport { default as FeaturedBlogPosts } from './FeaturedBlogPosts/index.js'\nexport type {\n FeaturedBlogPostsProps,\n FeaturedBlogPostsData,\n FeaturedBlogPostItem,\n FeaturedBlogPostSpan,\n} from './FeaturedBlogPosts/index.js'\nexport { default as ImageWithText } from './ImageWithText/index.js'\nexport type { ImageWithTextProps } from './ImageWithText/index.js'\nexport { default as VideoFeature } from './VideoFeature/index.js'\nexport type { VideoFeatureProps } from './VideoFeature/index.js'\nexport { default as TabsWithMedia } from './TabsWithMedia/index.js'\nexport type { TabsWithMediaProps, TabItem, TimeIndex } from './TabsWithMedia/index.js'\nexport { default as TabWithImage } from './TabWithImage/index.js'\nexport type { TabWithImageProps, TabWithImageDataItem } from './TabWithImage/index.js'\nexport { default as FeatureShowcase } from './FeatureShowcase/index.js'\nexport type { FeatureShowcaseProps, FeatureShowcaseItem } from './FeatureShowcase/index.js'\nexport { default as ProductHero } from './ProductHero/index.js'\nexport type { ProductHeroProps } from './ProductHero/index.js'\nexport { default as SpecsComparison } from './SpecsComparison/index.js'\nexport type {\n SpecsComparisonProps,\n SpecsComparisonMenuItem,\n SpecsComparisonLeftMenuItem,\n} from './SpecsComparison/index.js'\nexport { default as MediaSceneSwitcher } from './MediaSceneSwitcher/index.js'\nexport type { MediaSceneSwitcherProps } from './MediaSceneSwitcher/types.js'\nexport { default as MediaSceneSwitcherV2 } from './MediaSceneSwitcherV2/index.js'\nexport type {\n MediaSceneSwitcherV2Props,\n MediaSceneSwitcherV2Data,\n MediaSceneSwitcherV2Item,\n MediaSceneSwitcherV2Layout,\n} from './MediaSceneSwitcherV2/index.js'\nexport { default as ThreeDCarousel } from './ThreeDCarousel/index.js'\nexport type { ThreeDCarouselProps } from './ThreeDCarousel/index.js'\nexport { default as ProductNav } from './ProductNav/index.js'\nexport type { ProductNavProps, TabLink, AnchorItem, BuyButton } from './ProductNav/index.js'\nexport { default as AnchorNavigation } from './AnchorNavigation/index.js'\nexport { default as PromotionalBar } from './PromotionalBar/index.js'\nexport { default as EventSchedule } from './EventSchedule/index.js'\nexport { default as SecondaryBanner } from './SecondaryBanner/index.js'\nexport { default as BuyOneGetOneShelf } from './BuyOneGetOneShelf/index.js'\nexport { default as ActiveShelf } from './ActiveShelf/index.js'\nexport { default as MediaShelf } from './MediaShelf/index.js'\nexport { default as CreditsShelf, CreditsProductCard } from './CreditsShelf/index.js'\nexport type {\n CreditsShelfSemanticName,\n CreditsProductCardData,\n CopyConfig as CreditsShelfCopyConfig,\n ButtonFunctionType as CreditsShelfButtonFunctionType,\n} from './CreditsShelf/index.js'\nexport { default as SceneShelf, SceneProductCard } from './SceneShelf/index.js'\nexport type { SceneShelfSemanticName, SceneProductCardData, SceneProductCardSemanticName } from './SceneShelf/index.js'\nexport { default as SceneShelfV2, SceneShelfV2ProductCard } from './SceneShelfV2/index.js'\nexport type {\n SceneShelfV2SemanticName,\n SceneShelfV2Data,\n SceneShelfV2Product,\n SceneShelfV2Props,\n} from './SceneShelfV2/index.js'\nexport { default as SceneShelfV3 } from './SceneShelfV3/index.js'\nexport type { SceneShelfV3Data, SceneShelfV3Props, ProductTab as SceneShelfV3ProductTab } from './SceneShelfV3/index.js'\nexport type {\n SceneShelfV3SemanticName,\n ProductCardData as SceneShelfV3ProductCardData,\n} from './SceneShelfV3/ProductCard.js'\n\nexport { default as MediaEndorsement } from './MediaEndorsement/index.js'\nexport type {\n MediaEndorsementProps,\n MediaEndorsementData,\n MediaEndorsementItem,\n MediaEndorsementSemanticName,\n} from './MediaEndorsement/index.js'\n\nexport { default as MediaTextOverlay } from './MediaTextOverlay/index.js'\nexport type {\n MediaTextOverlayProps,\n MediaTextOverlayData,\n MediaTextOverlayItem,\n MediaTextOverlaySemanticName,\n ResponsiveMedia,\n} from './MediaTextOverlay/index.js'\n\n// Copy configuration types and defaults\nexport type {\n CopyConfig as MediaShelfCopyConfig,\n ButtonFunctionType as MediaShelfButtonFunctionType,\n} from './MediaShelf/types.js'\nexport type { CopyConfig as ActiveShelfCopyConfig, ButtonFunctionType } from './ActiveShelf/types.js'\n\nexport {\n default as ImageOverlayShelf,\n type ButtonFunctionType as ImageOverlayShelfButtonFunctionType,\n} from './ImageOverlayShelf/index.js'\n\nexport { default as ImageTextOverlay } from './ImageTextOverlay/index.js'\nexport type {\n ImageTextOverlayProps,\n ImageTextOverlayData,\n ImageTextOverlayItem,\n ImageTextOverlaySemanticName,\n ImageTextOverlayBackgroundImage,\n} from './ImageTextOverlay/types.js'\n\n// MiniCart \u7EC4\u4EF6\u53CA\u7C7B\u578B\u5BFC\u51FA\nexport { default as MiniCart } from './MiniCart/index.js'\nexport type { Cart, CartLineItem, MiniCartData, MiniCartProps, CircleProgressConfig } from './MiniCart/index.js'\nexport { default as MiniCartCircleProgress } from './MiniCart/CircleProgress.js'\nexport type { CircleProgressProps as MiniCartCircleProgressProps } from './MiniCart/CircleProgress.js'\nexport { default as MiniCartDialog, MiniCartDialog as MiniCartDialogComponent } from './MiniCart/MiniCartDialog.js'\nexport type {\n MiniCartDialogProps,\n MiniCartDialogCopy,\n MiniCartDialogSemanticName,\n CartData,\n} from './MiniCart/MiniCartDialog.js'\n\n// \u2500\u2500\u2500 Web Push \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport { default as WebPushPopup } from './WebPushPopup/index.js'\nexport type { WebPushPopupProps } from './WebPushPopup/index.js'\nexport { useEmarsysWebPush } from '../hooks/useEmarsysWebPush.js'\nexport type {\n UseEmarsysWebPushOptions,\n UseEmarsysWebPushReturn,\n EmarsysContactInfo,\n EmarsysInitConfig,\n} from '../hooks/useEmarsysWebPush.js'\n\n/**\n * \u7EC4\u4EF6\u6620\u5C04\u5BF9\u8C61\n */\n\nexport const PAYLOAD_COMPONENT_MAP = {\n 'ipc-accordioncards': 'AccordionCards',\n 'ipc-aplusdesc': 'AplusDesc',\n 'ipc-banner': 'HeroBanner',\n 'ipc-brand-equity': 'BrandEquity',\n 'ipc-category': 'Category',\n 'ipc-collection-banner': 'CollectionBanner',\n 'ipc-collection-shelves': 'CollectionShelves',\n 'ipc-creativemodule': 'CreativeModule',\n 'ipc-download': 'DownLoad',\n 'ipc-evaluate': 'Evaluate',\n 'ipc-faq': 'Faq',\n 'ipc-features': 'Features',\n 'ipc-footcharger': 'FootCharger',\n 'ipc-ga-block': 'GraphicAttractionBlock',\n 'ipc-giftbox': 'GiftBox',\n 'ipc-giftshelf': 'GiftShelf',\n 'ipc-graphic': 'Graphic',\n 'ipc-graphicmore': 'GraphicMore',\n 'ipc-graphicoverlay': 'GraphicOverlay',\n 'ipc-marquee': 'Marquee',\n 'ipc-mediaplayerbase': 'MediaPlayerBase',\n 'ipc-mediaplayermulti': 'MediaPlayerMulti',\n 'ipc-mediaplayersticky': 'MediaPlayerSticky',\n 'ipc-member-equity': 'MemberEquity',\n 'ipc-mlg-block': 'MultiLayoutGraphicBlock',\n 'ipc-search-page-tabs': 'SearchPageBlock',\n 'ipc-selectstore': 'SelectStore',\n 'ipc-shelfdisplay': 'ShelfDisplay',\n 'ipc-slogan': 'Slogan',\n 'ipc-spacer': 'Spacer',\n 'ipc-specs': 'Specs',\n 'ipc-tabs': 'TabsBlock',\n 'ipc-text-marquee': 'TextMarquee',\n 'ipc-title': 'Title',\n 'ipc-whychoose': 'WhyChoose',\n 'ipc-product-nav': 'ProductNav',\n 'ipc-brand-card-link': 'BrandCardLink',\n 'ipc-ipredirect': 'IPRedirect',\n ksp: 'Ksp',\n 'ipc-secondary-banner': 'SecondaryBanner',\n /**\n * \u6D3B\u52A8\u8D27\u67B6\n */\n 'ipc-active-shelf': 'ActiveShelf',\n 'ipc-media-shelf': 'MediaShelf',\n /**\n * \u6D3B\u52A8\u4E70\u8D60\u8D27\u67B6\n */\n 'ipc-bogo-shelf': 'BuyOneGetOneShelf',\n 'ipc-media-endorsement': 'MediaEndorsement',\n 'ipc-media-scene-switcher-v2': 'MediaSceneSwitcherV2',\n 'ipc-featured-blog-posts': 'FeaturedBlogPosts',\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["default", "MarqueeItem", "MarqueeImageContent", "MarqueeTextContent", "IPC_SEARCH_PAGE", "SearchPageTabType", "withLayout", "IPRedirect", "CreditsProductCard", "SceneProductCard", "SceneShelfV2ProductCard", "MiniCartDialog", "useEmarsysWebPush", "PAYLOAD_COMPONENT_MAP"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export interface EmarsysContactInfo {
|
|
2
|
+
/** Emarsys 联系人字段 ID(如 10372) */
|
|
3
|
+
fieldId: number;
|
|
4
|
+
/** 字段值(如用户唯一标识) */
|
|
5
|
+
fieldValue: string;
|
|
6
|
+
}
|
|
7
|
+
export interface EmarsysInitConfig {
|
|
8
|
+
/** Emarsys Domain Code,从后台获取 */
|
|
9
|
+
applicationCode: string;
|
|
10
|
+
/** macOS Safari 16+ 使用 VAPID 替代 APNS */
|
|
11
|
+
enableMacSafariVapid?: boolean;
|
|
12
|
+
/** 默认推送通知标题 */
|
|
13
|
+
defaultNotificationTitle?: string;
|
|
14
|
+
/** 默认推送通知图标 URL */
|
|
15
|
+
defaultNotificationIcon?: string;
|
|
16
|
+
/** 是否自动触发浏览器订阅弹窗,强烈建议设为 false */
|
|
17
|
+
autoSubscribe?: boolean;
|
|
18
|
+
/** 开发阶段开启 SDK 日志 */
|
|
19
|
+
enableLogging?: boolean;
|
|
20
|
+
serviceWorker: {
|
|
21
|
+
/** Service Worker 文件路径(需放在网站根目录) */
|
|
22
|
+
url: string;
|
|
23
|
+
/** VAPID 公钥(Base64 URL-safe 编码) */
|
|
24
|
+
applicationServerPublicKey: string;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
type EmarsysSdkEventName = 'onReady' | 'onSubscribe' | 'onUnsubscribe' | 'onPermissionPrompt' | 'onPermissionGranted' | 'onPermissionDenied' | 'onSWInitError';
|
|
28
|
+
type EmarsysSdkCommand = ['init', EmarsysInitConfig] | [EmarsysSdkEventName, () => void];
|
|
29
|
+
interface EmarsysSdkApi {
|
|
30
|
+
subscribe: () => void;
|
|
31
|
+
unsubscribe: () => void;
|
|
32
|
+
login: (contactInfo: EmarsysContactInfo) => Promise<boolean>;
|
|
33
|
+
logout: () => Promise<boolean>;
|
|
34
|
+
isSubscribed: () => Promise<boolean>;
|
|
35
|
+
isRegistered: () => boolean;
|
|
36
|
+
customEvent: (eventName: string, payload?: Record<string, unknown>) => Promise<boolean>;
|
|
37
|
+
push: (command: EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void)) => void;
|
|
38
|
+
}
|
|
39
|
+
declare global {
|
|
40
|
+
interface Window {
|
|
41
|
+
WebEmarsysSdk: EmarsysSdkApi | (EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void))[];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export interface UseEmarsysWebPushOptions {
|
|
45
|
+
/** Emarsys Domain Code */
|
|
46
|
+
applicationCode: string;
|
|
47
|
+
/** VAPID 公钥 */
|
|
48
|
+
applicationServerPublicKey: string;
|
|
49
|
+
/** Service Worker 路径,默认 'service-worker.js'(不含前导斜杠) */
|
|
50
|
+
serviceWorkerUrl?: string;
|
|
51
|
+
/** 默认通知标题 */
|
|
52
|
+
defaultNotificationTitle?: string;
|
|
53
|
+
/** 默认通知图标 URL */
|
|
54
|
+
defaultNotificationIcon?: string;
|
|
55
|
+
/** 联系人主键字段 ID(由 Emarsys 后台配置) */
|
|
56
|
+
fieldId: number;
|
|
57
|
+
/**
|
|
58
|
+
* 当前用户的联系人标识(如 hashed email / customer ID)。
|
|
59
|
+
* null 表示未登录的匿名访客。
|
|
60
|
+
*/
|
|
61
|
+
contactValue: string | null;
|
|
62
|
+
/** 是否开启调试日志,默认 false */
|
|
63
|
+
enableLogging?: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* 点击"稍后"后的弹窗冷却天数,默认 7 天。
|
|
66
|
+
* 冷却期间不再展示自定义弹窗。
|
|
67
|
+
*/
|
|
68
|
+
dismissCooldownDays?: number;
|
|
69
|
+
/**
|
|
70
|
+
* SDK 是否已通过外部 <Script> 标签加载完毕。
|
|
71
|
+
* 传入此 flag 以便 hook 在正确时机初始化。
|
|
72
|
+
* 默认 true(假设 SDK 已经加载)。
|
|
73
|
+
*/
|
|
74
|
+
sdkLoaded?: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface UseEmarsysWebPushReturn {
|
|
77
|
+
/** 手动触发浏览器原生订阅弹窗(供"订阅"按钮调用) */
|
|
78
|
+
subscribe: () => void;
|
|
79
|
+
/** 取消推送订阅 */
|
|
80
|
+
unsubscribe: () => void;
|
|
81
|
+
/** 是否应向用户展示自定义引导弹窗 */
|
|
82
|
+
shouldShowPopup: boolean;
|
|
83
|
+
/** 关闭自定义弹窗并写入冷却标记 */
|
|
84
|
+
dismissPopup: () => void;
|
|
85
|
+
/** 当前是否已订阅(异步检测完成后更新) */
|
|
86
|
+
isSubscribed: boolean;
|
|
87
|
+
/** SDK 是否就绪 */
|
|
88
|
+
isReady: boolean;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* useEmarsysWebPush
|
|
92
|
+
*
|
|
93
|
+
* 封装 Emarsys Web Push SDK 的订阅生命周期,包括:
|
|
94
|
+
* - SDK 初始化
|
|
95
|
+
* - 自定义弹窗展示逻辑(两步策略,避免直接触发浏览器原生弹窗)
|
|
96
|
+
* - 已登录联系人的 login / logout 自动管理
|
|
97
|
+
* - 已有订阅用户的迁移(从旧推送系统迁移)
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```tsx
|
|
101
|
+
* const { shouldShowPopup, subscribe, dismissPopup } = useEmarsysWebPush({
|
|
102
|
+
* applicationCode: process.env.NEXT_PUBLIC_EMARSYS_APP_CODE!,
|
|
103
|
+
* applicationServerPublicKey: process.env.NEXT_PUBLIC_EMARSYS_VAPID_PUBLIC_KEY!,
|
|
104
|
+
* fieldId: 10372,
|
|
105
|
+
* contactValue: user?.customerId ?? null,
|
|
106
|
+
* sdkLoaded: scriptLoaded,
|
|
107
|
+
* })
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export declare function useEmarsysWebPush({ applicationCode, applicationServerPublicKey, serviceWorkerUrl, defaultNotificationTitle, defaultNotificationIcon, fieldId, contactValue, enableLogging, dismissCooldownDays, sdkLoaded, }: UseEmarsysWebPushOptions): UseEmarsysWebPushReturn;
|
|
111
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useCallback as d,useEffect as g,useRef as R,useState as y}from"react";const E="emarsysSubscribe",b="emarsysLogin",C="anker_push_dismissed";function D(){return typeof navigator>"u"?!1:/iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase())}function x(){return typeof window>"u"?!1:window.matchMedia("(display-mode: standalone)").matches||"standalone"in window.navigator&&window.navigator.standalone===!0}function r(n,o,u){try{if(n==="get")return localStorage.getItem(o);n==="set"&&u!==void 0&&localStorage.setItem(o,u),n==="remove"&&localStorage.removeItem(o)}catch{}return null}function a(){if(typeof window>"u")return null;const n=window.WebEmarsysSdk;return!n||Array.isArray(n)?null:n}function K({applicationCode:n,applicationServerPublicKey:o,serviceWorkerUrl:u="service-worker.js",defaultNotificationTitle:w,defaultNotificationIcon:k,fieldId:h,contactValue:t,enableLogging:v=!1,dismissCooldownDays:P=7,sdkLoaded:c=!0}){const[f,L]=y(!1),[G,m]=y(!1),[_,p]=y(!1),S=R(!1),A=R(!1);g(()=>{if(!c||typeof window>"u")return;const e=u.replace(/^\/+/,"").replace(/^https?:\/\/[^/]+\//,"");window.WebEmarsysSdk=window.WebEmarsysSdk||[],window.WebEmarsysSdk.push(["init",{applicationCode:n,enableMacSafariVapid:!0,defaultNotificationTitle:w,defaultNotificationIcon:k,autoSubscribe:!1,enableLogging:v,serviceWorker:{url:e,applicationServerPublicKey:o}}])},[c,n,o,u,w,k,v]);const l=d(e=>{if(S.current)return;const s=a();s&&s.isSubscribed().then(i=>{i&&s.login({fieldId:h,fieldValue:e}).then(W=>{W&&(r("set",b,"login"),S.current=!0)})})},[h]),I=d(()=>{const e=a();e&&e.isSubscribed().then(s=>{s&&e.logout().then(i=>{i&&(r("remove",b),S.current=!1)})})},[]);g(()=>{if(!c||typeof window>"u"||D()&&!x())return;window.WebEmarsysSdk=window.WebEmarsysSdk||[];const e=window.WebEmarsysSdk;e.push(["onReady",()=>{L(!0),a()?.isSubscribed().then(i=>{m(i)}),e.push(["onPermissionGranted",()=>{!r("get",E)&&!A.current&&(a()?.subscribe(),r("set",E,"subscribe"))}]);let s=!1;e.push(["onPermissionGranted",()=>{s=!0}]),e.push(["onPermissionDenied",()=>{s=!0}]),setTimeout(()=>{if(s)return;const i=r("get",C);i&&Date.now()-parseInt(i,10)<P*24*60*60*1e3||p(!0)},2e3)}]),e.push(["onSubscribe",()=>{m(!0),r("set",E,"subscribe"),t&&l(t)}]),e.push(["onUnsubscribe",()=>{m(!1)}])},[c,t,P,l]),g(()=>{f&&(t?r("get",b)||l(t):r("get",b)&&I())},[f,t,l,I]);const N=d(()=>{p(!1),A.current=!0;const e=a();if(!e){window.WebEmarsysSdk.push(i=>{i.subscribe()});return}e.subscribe()},[]),O=d(()=>{a()?.unsubscribe()},[]),U=d(()=>{p(!1),r("set",C,String(Date.now()))},[]);return{subscribe:N,unsubscribe:O,shouldShowPopup:_,dismissPopup:U,isSubscribed:G,isReady:f}}export{K as useEmarsysWebPush};
|
|
2
|
+
//# sourceMappingURL=useEmarsysWebPush.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/useEmarsysWebPush.ts"],
|
|
4
|
+
"sourcesContent": ["import { useCallback, useEffect, useRef, useState } from 'react'\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Emarsys Web Push SDK \u5168\u5C40\u7C7B\u578B\u58F0\u660E\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface EmarsysContactInfo {\n /** Emarsys \u8054\u7CFB\u4EBA\u5B57\u6BB5 ID\uFF08\u5982 10372\uFF09 */\n fieldId: number\n /** \u5B57\u6BB5\u503C\uFF08\u5982\u7528\u6237\u552F\u4E00\u6807\u8BC6\uFF09 */\n fieldValue: string\n}\n\nexport interface EmarsysInitConfig {\n /** Emarsys Domain Code\uFF0C\u4ECE\u540E\u53F0\u83B7\u53D6 */\n applicationCode: string\n /** macOS Safari 16+ \u4F7F\u7528 VAPID \u66FF\u4EE3 APNS */\n enableMacSafariVapid?: boolean\n /** \u9ED8\u8BA4\u63A8\u9001\u901A\u77E5\u6807\u9898 */\n defaultNotificationTitle?: string\n /** \u9ED8\u8BA4\u63A8\u9001\u901A\u77E5\u56FE\u6807 URL */\n defaultNotificationIcon?: string\n /** \u662F\u5426\u81EA\u52A8\u89E6\u53D1\u6D4F\u89C8\u5668\u8BA2\u9605\u5F39\u7A97\uFF0C\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A false */\n autoSubscribe?: boolean\n /** \u5F00\u53D1\u9636\u6BB5\u5F00\u542F SDK \u65E5\u5FD7 */\n enableLogging?: boolean\n serviceWorker: {\n /** Service Worker \u6587\u4EF6\u8DEF\u5F84\uFF08\u9700\u653E\u5728\u7F51\u7AD9\u6839\u76EE\u5F55\uFF09 */\n url: string\n /** VAPID \u516C\u94A5\uFF08Base64 URL-safe \u7F16\u7801\uFF09 */\n applicationServerPublicKey: string\n }\n}\n\ntype EmarsysSdkEventName =\n | 'onReady'\n | 'onSubscribe'\n | 'onUnsubscribe'\n | 'onPermissionPrompt'\n | 'onPermissionGranted'\n | 'onPermissionDenied'\n | 'onSWInitError'\n\ntype EmarsysSdkCommand = ['init', EmarsysInitConfig] | [EmarsysSdkEventName, () => void]\n\ninterface EmarsysSdkApi {\n subscribe: () => void\n unsubscribe: () => void\n login: (contactInfo: EmarsysContactInfo) => Promise<boolean>\n logout: () => Promise<boolean>\n isSubscribed: () => Promise<boolean>\n isRegistered: () => boolean\n customEvent: (eventName: string, payload?: Record<string, unknown>) => Promise<boolean>\n push: (command: EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void)) => void\n}\n\ndeclare global {\n interface Window {\n WebEmarsysSdk: EmarsysSdkApi | (EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void))[]\n }\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Hook \u5165\u53C2\u7C7B\u578B\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface UseEmarsysWebPushOptions {\n /** Emarsys Domain Code */\n applicationCode: string\n /** VAPID \u516C\u94A5 */\n applicationServerPublicKey: string\n /** Service Worker \u8DEF\u5F84\uFF0C\u9ED8\u8BA4 'service-worker.js'\uFF08\u4E0D\u542B\u524D\u5BFC\u659C\u6760\uFF09 */\n serviceWorkerUrl?: string\n /** \u9ED8\u8BA4\u901A\u77E5\u6807\u9898 */\n defaultNotificationTitle?: string\n /** \u9ED8\u8BA4\u901A\u77E5\u56FE\u6807 URL */\n defaultNotificationIcon?: string\n /** \u8054\u7CFB\u4EBA\u4E3B\u952E\u5B57\u6BB5 ID\uFF08\u7531 Emarsys \u540E\u53F0\u914D\u7F6E\uFF09 */\n fieldId: number\n /**\n * \u5F53\u524D\u7528\u6237\u7684\u8054\u7CFB\u4EBA\u6807\u8BC6\uFF08\u5982 hashed email / customer ID\uFF09\u3002\n * null \u8868\u793A\u672A\u767B\u5F55\u7684\u533F\u540D\u8BBF\u5BA2\u3002\n */\n contactValue: string | null\n /** \u662F\u5426\u5F00\u542F\u8C03\u8BD5\u65E5\u5FD7\uFF0C\u9ED8\u8BA4 false */\n enableLogging?: boolean\n /**\n * \u70B9\u51FB\"\u7A0D\u540E\"\u540E\u7684\u5F39\u7A97\u51B7\u5374\u5929\u6570\uFF0C\u9ED8\u8BA4 7 \u5929\u3002\n * \u51B7\u5374\u671F\u95F4\u4E0D\u518D\u5C55\u793A\u81EA\u5B9A\u4E49\u5F39\u7A97\u3002\n */\n dismissCooldownDays?: number\n /**\n * SDK \u662F\u5426\u5DF2\u901A\u8FC7\u5916\u90E8 <Script> \u6807\u7B7E\u52A0\u8F7D\u5B8C\u6BD5\u3002\n * \u4F20\u5165\u6B64 flag \u4EE5\u4FBF hook \u5728\u6B63\u786E\u65F6\u673A\u521D\u59CB\u5316\u3002\n * \u9ED8\u8BA4 true\uFF08\u5047\u8BBE SDK \u5DF2\u7ECF\u52A0\u8F7D\uFF09\u3002\n */\n sdkLoaded?: boolean\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Hook \u8FD4\u56DE\u503C\u7C7B\u578B\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface UseEmarsysWebPushReturn {\n /** \u624B\u52A8\u89E6\u53D1\u6D4F\u89C8\u5668\u539F\u751F\u8BA2\u9605\u5F39\u7A97\uFF08\u4F9B\"\u8BA2\u9605\"\u6309\u94AE\u8C03\u7528\uFF09 */\n subscribe: () => void\n /** \u53D6\u6D88\u63A8\u9001\u8BA2\u9605 */\n unsubscribe: () => void\n /** \u662F\u5426\u5E94\u5411\u7528\u6237\u5C55\u793A\u81EA\u5B9A\u4E49\u5F15\u5BFC\u5F39\u7A97 */\n shouldShowPopup: boolean\n /** \u5173\u95ED\u81EA\u5B9A\u4E49\u5F39\u7A97\u5E76\u5199\u5165\u51B7\u5374\u6807\u8BB0 */\n dismissPopup: () => void\n /** \u5F53\u524D\u662F\u5426\u5DF2\u8BA2\u9605\uFF08\u5F02\u6B65\u68C0\u6D4B\u5B8C\u6210\u540E\u66F4\u65B0\uFF09 */\n isSubscribed: boolean\n /** SDK \u662F\u5426\u5C31\u7EEA */\n isReady: boolean\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// \u5DE5\u5177\u51FD\u6570\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst STORAGE_KEY_SUBSCRIBE = 'emarsysSubscribe'\nconst STORAGE_KEY_LOGIN = 'emarsysLogin'\nconst STORAGE_KEY_DISMISSED = 'anker_push_dismissed'\n\nfunction isIOS(): boolean {\n if (typeof navigator === 'undefined') return false\n return /iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase())\n}\n\nfunction isStandaloneWebApp(): boolean {\n if (typeof window === 'undefined') return false\n return (\n window.matchMedia('(display-mode: standalone)').matches ||\n // Safari standalone \u5C5E\u6027\uFF08\u975E\u6807\u51C6\uFF09\n ('standalone' in window.navigator && (window.navigator as Navigator & { standalone?: boolean }).standalone === true)\n )\n}\n\nfunction safeLocalStorage(action: 'get', key: string): string | null\nfunction safeLocalStorage(action: 'set', key: string, value: string): void\nfunction safeLocalStorage(action: 'remove', key: string): void\nfunction safeLocalStorage(action: 'get' | 'set' | 'remove', key: string, value?: string): string | null | void {\n try {\n if (action === 'get') return localStorage.getItem(key)\n if (action === 'set' && value !== undefined) localStorage.setItem(key, value)\n if (action === 'remove') localStorage.removeItem(key)\n } catch {\n // SSR \u6216\u9690\u79C1\u6A21\u5F0F\u4E0B localStorage \u4E0D\u53EF\u7528\n }\n return null\n}\n\nfunction getSdkApi(): EmarsysSdkApi | null {\n if (typeof window === 'undefined') return null\n const sdk = window.WebEmarsysSdk\n if (!sdk || Array.isArray(sdk)) return null\n return sdk as EmarsysSdkApi\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// \u6838\u5FC3 Hook\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * useEmarsysWebPush\n *\n * \u5C01\u88C5 Emarsys Web Push SDK \u7684\u8BA2\u9605\u751F\u547D\u5468\u671F\uFF0C\u5305\u62EC\uFF1A\n * - SDK \u521D\u59CB\u5316\n * - \u81EA\u5B9A\u4E49\u5F39\u7A97\u5C55\u793A\u903B\u8F91\uFF08\u4E24\u6B65\u7B56\u7565\uFF0C\u907F\u514D\u76F4\u63A5\u89E6\u53D1\u6D4F\u89C8\u5668\u539F\u751F\u5F39\u7A97\uFF09\n * - \u5DF2\u767B\u5F55\u8054\u7CFB\u4EBA\u7684 login / logout \u81EA\u52A8\u7BA1\u7406\n * - \u5DF2\u6709\u8BA2\u9605\u7528\u6237\u7684\u8FC1\u79FB\uFF08\u4ECE\u65E7\u63A8\u9001\u7CFB\u7EDF\u8FC1\u79FB\uFF09\n *\n * @example\n * ```tsx\n * const { shouldShowPopup, subscribe, dismissPopup } = useEmarsysWebPush({\n * applicationCode: process.env.NEXT_PUBLIC_EMARSYS_APP_CODE!,\n * applicationServerPublicKey: process.env.NEXT_PUBLIC_EMARSYS_VAPID_PUBLIC_KEY!,\n * fieldId: 10372,\n * contactValue: user?.customerId ?? null,\n * sdkLoaded: scriptLoaded,\n * })\n * ```\n */\nexport function useEmarsysWebPush({\n applicationCode,\n applicationServerPublicKey,\n serviceWorkerUrl = 'service-worker.js',\n defaultNotificationTitle,\n defaultNotificationIcon,\n fieldId,\n contactValue,\n enableLogging = false,\n dismissCooldownDays = 7,\n sdkLoaded = true,\n}: UseEmarsysWebPushOptions): UseEmarsysWebPushReturn {\n const [isReady, setIsReady] = useState(false)\n const [isSubscribed, setIsSubscribed] = useState(false)\n const [shouldShowPopup, setShouldShowPopup] = useState(false)\n\n // \u907F\u514D\u91CD\u590D login/logout\n const hasPerformedLogin = useRef(false)\n // \u8FFD\u8E2A\u5F53\u524D session \u5185\u662F\u5426\u5DF2\u4E3B\u52A8\u89E6\u53D1\u8FC7 subscribe\n const isGeneralSubscribeRef = useRef(false)\n\n // \u2500\u2500 \u521D\u59CB\u5316 SDK \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n useEffect(() => {\n if (!sdkLoaded || typeof window === 'undefined') return\n\n // SDK v4.7.0 \u5185\u90E8 registerServiceWorker() \u6267\u884C `/${url}` \u62FC\u63A5\uFF0C\n // \u56E0\u6B64\u6B64\u5904\u5FC5\u987B\u4F20\u4E0D\u542B\u524D\u5BFC\u659C\u6760\u7684\u7EAF\u8DEF\u5F84\uFF08\u5982 'service-worker.js'\uFF09\uFF0C\n // \u4F20\u5165\u5E26\u659C\u6760\u7684\u8DEF\u5F84\u6216\u7EDD\u5BF9 URL \u5747\u4F1A\u5BFC\u81F4\u53CC\u659C\u6760/\u8DE8\u57DF SecurityError\u3002\n const swPath = serviceWorkerUrl.replace(/^\\/+/, '').replace(/^https?:\\/\\/[^/]+\\//, '')\n\n window.WebEmarsysSdk = window.WebEmarsysSdk || []\n const sdk = window.WebEmarsysSdk as (EmarsysSdkCommand | ((api: EmarsysSdkApi) => void))[]\n\n sdk.push([\n 'init',\n {\n applicationCode,\n enableMacSafariVapid: true,\n defaultNotificationTitle,\n defaultNotificationIcon,\n autoSubscribe: false,\n enableLogging,\n serviceWorker: {\n url: swPath,\n applicationServerPublicKey,\n },\n },\n ])\n }, [\n sdkLoaded,\n applicationCode,\n applicationServerPublicKey,\n serviceWorkerUrl,\n defaultNotificationTitle,\n defaultNotificationIcon,\n enableLogging,\n ])\n\n // \u2500\u2500 \u6267\u884C Emarsys login\uFF08\u5173\u8054\u5DF2\u77E5\u8054\u7CFB\u4EBA\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const performLogin = useCallback(\n (value: string) => {\n if (hasPerformedLogin.current) return\n const api = getSdkApi()\n if (!api) return\n\n api.isSubscribed().then(subscribed => {\n if (!subscribed) return\n api.login({ fieldId, fieldValue: value }).then(result => {\n if (result) {\n safeLocalStorage('set', STORAGE_KEY_LOGIN, 'login')\n hasPerformedLogin.current = true\n }\n })\n })\n },\n [fieldId]\n )\n\n // \u2500\u2500 \u6267\u884C Emarsys logout\uFF08\u89E3\u9664\u8054\u7CFB\u4EBA\u5173\u8054\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const performLogout = useCallback(() => {\n const api = getSdkApi()\n if (!api) return\n\n api.isSubscribed().then(subscribed => {\n if (!subscribed) return\n api.logout().then(result => {\n if (result) {\n safeLocalStorage('remove', STORAGE_KEY_LOGIN)\n hasPerformedLogin.current = false\n }\n })\n })\n }, [])\n\n // \u2500\u2500 \u6CE8\u518C SDK \u56DE\u8C03 & \u4E1A\u52A1\u903B\u8F91 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n useEffect(() => {\n if (!sdkLoaded || typeof window === 'undefined') return\n\n // iOS \u6D4F\u89C8\u5668\uFF08\u975E PWA \u6A21\u5F0F\uFF09\u4E0D\u505A\u4EFB\u4F55\u64CD\u4F5C\n if (isIOS() && !isStandaloneWebApp()) return\n\n window.WebEmarsysSdk = window.WebEmarsysSdk || []\n const sdk = window.WebEmarsysSdk as (EmarsysSdkCommand | ((api: EmarsysSdkApi) => void))[]\n\n sdk.push([\n 'onReady',\n () => {\n setIsReady(true)\n\n // \u68C0\u67E5\u5F53\u524D\u8BA2\u9605\u72B6\u6001\n getSdkApi()\n ?.isSubscribed()\n .then(subscribed => {\n setIsSubscribed(subscribed)\n })\n\n // \u5DF2\u6709\u8BA2\u9605\u7528\u6237\u8FC1\u79FB\uFF08\u65E7\u63A8\u9001\u7CFB\u7EDF \u2192 Emarsys\uFF09\n sdk.push([\n 'onPermissionGranted',\n () => {\n if (!safeLocalStorage('get', STORAGE_KEY_SUBSCRIBE) && !isGeneralSubscribeRef.current) {\n getSdkApi()?.subscribe()\n safeLocalStorage('set', STORAGE_KEY_SUBSCRIBE, 'subscribe')\n }\n },\n ])\n\n // \u5224\u65AD\u662F\u5426\u9700\u8981\u5C55\u793A\u81EA\u5B9A\u4E49\u5F15\u5BFC\u5F39\u7A97\n // \u5EF6\u8FDF 2 \u79D2\uFF0C\u7B49\u5F85 onPermissionGranted / onPermissionDenied \u5F02\u6B65\u56DE\u8C03\n let permissionAlreadyHandled = false\n sdk.push([\n 'onPermissionGranted',\n () => {\n permissionAlreadyHandled = true\n },\n ])\n sdk.push([\n 'onPermissionDenied',\n () => {\n permissionAlreadyHandled = true\n },\n ])\n\n setTimeout(() => {\n if (permissionAlreadyHandled) return\n\n // \u68C0\u67E5\u51B7\u5374\u671F\n const dismissedAt = safeLocalStorage('get', STORAGE_KEY_DISMISSED)\n if (dismissedAt) {\n const elapsed = Date.now() - parseInt(dismissedAt, 10)\n if (elapsed < dismissCooldownDays * 24 * 60 * 60 * 1000) return\n }\n\n setShouldShowPopup(true)\n }, 2000)\n },\n ])\n\n // \u8BA2\u9605\u6210\u529F\u540E\u66F4\u65B0\u72B6\u6001\u5E76\u6267\u884C login\n sdk.push([\n 'onSubscribe',\n () => {\n setIsSubscribed(true)\n safeLocalStorage('set', STORAGE_KEY_SUBSCRIBE, 'subscribe')\n if (contactValue) {\n performLogin(contactValue)\n }\n },\n ])\n\n sdk.push([\n 'onUnsubscribe',\n () => {\n setIsSubscribed(false)\n },\n ])\n }, [sdkLoaded, contactValue, dismissCooldownDays, performLogin])\n\n // \u2500\u2500 \u76D1\u542C contactValue \u53D8\u5316\uFF0C\u81EA\u52A8 login / logout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n useEffect(() => {\n if (!isReady) return\n\n if (contactValue) {\n if (!safeLocalStorage('get', STORAGE_KEY_LOGIN)) {\n performLogin(contactValue)\n }\n } else {\n if (safeLocalStorage('get', STORAGE_KEY_LOGIN)) {\n performLogout()\n }\n }\n }, [isReady, contactValue, performLogin, performLogout])\n\n // \u2500\u2500 \u5BF9\u5916\u66B4\u9732\u7684 API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const subscribe = useCallback(() => {\n setShouldShowPopup(false)\n isGeneralSubscribeRef.current = true\n const api = getSdkApi()\n if (!api) {\n const sdk = window.WebEmarsysSdk as ((api: EmarsysSdkApi) => void)[]\n sdk.push(sdkApi => {\n sdkApi.subscribe()\n })\n return\n }\n api.subscribe()\n }, [])\n\n const unsubscribe = useCallback(() => {\n getSdkApi()?.unsubscribe()\n }, [])\n\n const dismissPopup = useCallback(() => {\n setShouldShowPopup(false)\n safeLocalStorage('set', STORAGE_KEY_DISMISSED, String(Date.now()))\n }, [])\n\n return {\n subscribe,\n unsubscribe,\n shouldShowPopup,\n dismissPopup,\n isSubscribed,\n isReady,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useCallback", "useEffect", "useRef", "useState", "STORAGE_KEY_SUBSCRIBE", "STORAGE_KEY_LOGIN", "STORAGE_KEY_DISMISSED", "isIOS", "isStandaloneWebApp", "safeLocalStorage", "action", "key", "value", "getSdkApi", "sdk", "useEmarsysWebPush", "applicationCode", "applicationServerPublicKey", "serviceWorkerUrl", "defaultNotificationTitle", "defaultNotificationIcon", "fieldId", "contactValue", "enableLogging", "dismissCooldownDays", "sdkLoaded", "isReady", "setIsReady", "isSubscribed", "setIsSubscribed", "shouldShowPopup", "setShouldShowPopup", "hasPerformedLogin", "isGeneralSubscribeRef", "swPath", "performLogin", "api", "subscribed", "result", "performLogout", "permissionAlreadyHandled", "dismissedAt", "subscribe", "sdkApi", "unsubscribe", "dismissPopup"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface LocalizedLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
3
|
+
href?: string;
|
|
4
|
+
}
|
|
5
|
+
declare const LocalizedLink: React.ForwardRefExoticComponent<LocalizedLinkProps & React.RefAttributes<HTMLAnchorElement>>;
|
|
6
|
+
export { LocalizedLink };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";import{Fragment as m,jsx as n}from"react/jsx-runtime";import*as t from"react";import{getLocalizedPath as d}from"../helpers/index.js";import{useAiuiContext as f}from"../biz-components/AiuiProvider/index.js";const i=t.forwardRef(({href:e,className:a,children:o,rel:c="noreferrer",...s},l)=>{const{locale:r="us"}=f(),L=t.useMemo(()=>e?d(e,r):void 0,[e,r]);return e?n("a",{ref:l,href:L,rel:c,className:a,...s,children:o}):n(m,{children:o})});i.displayName="LocalizedLink";export{i as LocalizedLink};
|
|
2
|
+
//# sourceMappingURL=LocalizedLink.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/shared/LocalizedLink.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { getLocalizedPath } from '../helpers/index.js'\nimport { useAiuiContext } from '../biz-components/AiuiProvider/index.js'\n\nexport interface LocalizedLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n href?: string\n}\n\nconst LocalizedLink = React.forwardRef<HTMLAnchorElement, LocalizedLinkProps>(\n ({ href, className, children, rel = 'noreferrer', ...props }, ref) => {\n const { locale = 'us' } = useAiuiContext()\n const localizedHref = React.useMemo(() => (href ? getLocalizedPath(href, locale) : undefined), [href, locale])\n\n if (!href) {\n return <>{children}</>\n }\n\n return (\n <a ref={ref} href={localizedHref} rel={rel} className={className} {...props}>\n {children}\n </a>\n )\n }\n)\n\nLocalizedLink.displayName = 'LocalizedLink'\n\nexport { LocalizedLink }\n"],
|
|
5
|
+
"mappings": "aAgBa,mBAAAA,EAAA,OAAAC,MAAA,oBAdb,UAAYC,MAAW,QACvB,OAAS,oBAAAC,MAAwB,sBACjC,OAAS,kBAAAC,MAAsB,0CAM/B,MAAMC,EAAgBH,EAAM,WAC1B,CAAC,CAAE,KAAAI,EAAM,UAAAC,EAAW,SAAAC,EAAU,IAAAC,EAAM,aAAc,GAAGC,CAAM,EAAGC,IAAQ,CACpE,KAAM,CAAE,OAAAC,EAAS,IAAK,EAAIR,EAAe,EACnCS,EAAgBX,EAAM,QAAQ,IAAOI,EAAOH,EAAiBG,EAAMM,CAAM,EAAI,OAAY,CAACN,EAAMM,CAAM,CAAC,EAE7G,OAAKN,EAKHL,EAAC,KAAE,IAAKU,EAAK,KAAME,EAAe,IAAKJ,EAAK,UAAWF,EAAY,GAAGG,EACnE,SAAAF,EACH,EANOP,EAAAD,EAAA,CAAG,SAAAQ,EAAS,CAQvB,CACF,EAEAH,EAAc,YAAc",
|
|
6
|
+
"names": ["Fragment", "jsx", "React", "getLocalizedPath", "useAiuiContext", "LocalizedLink", "href", "className", "children", "rel", "props", "ref", "locale", "localizedHref"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anker-in/headless-ui",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"main": "./dist/cjs/index.js",
|
|
6
6
|
"types": "./dist/cjs/index.d.ts",
|
|
@@ -47,11 +47,13 @@
|
|
|
47
47
|
"import": "./tailwind.config.js",
|
|
48
48
|
"types": "./tailwind.config.d.ts"
|
|
49
49
|
},
|
|
50
|
-
"./tokens/*": "./dist/tokens/*"
|
|
50
|
+
"./tokens/*": "./dist/tokens/*",
|
|
51
|
+
"./static/*": "./static/*"
|
|
51
52
|
},
|
|
52
53
|
"description": "",
|
|
53
54
|
"files": [
|
|
54
55
|
"dist/**",
|
|
56
|
+
"static/**",
|
|
55
57
|
"*.css",
|
|
56
58
|
"README.md",
|
|
57
59
|
"CONTRIBUTING.md",
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emarsys Web Push Service Worker
|
|
3
|
+
*
|
|
4
|
+
* 使用说明
|
|
5
|
+
* ────────
|
|
6
|
+
* 此文件是独立静态资源,不会被打包进 JS bundle。
|
|
7
|
+
* 使用前需将此文件复制到你的项目 public/ 目录(Next.js Pages Router / App Router 均适用):
|
|
8
|
+
*
|
|
9
|
+
* cp node_modules/@anker-in/headless-ui/static/emarsys-service-worker.js public/service-worker.js
|
|
10
|
+
*
|
|
11
|
+
* 或在项目 package.json 中添加脚本(推荐,随依赖更新自动同步):
|
|
12
|
+
*
|
|
13
|
+
* "scripts": {
|
|
14
|
+
* "copy:emarsys-sw": "cp node_modules/@anker-in/headless-ui/static/emarsys-service-worker.js public/service-worker.js"
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* 然后在 useEmarsysWebPush 中配置 serviceWorkerUrl: '/service-worker.js'(默认值,无需额外设置)。
|
|
18
|
+
*
|
|
19
|
+
* 注意事项
|
|
20
|
+
* ────────
|
|
21
|
+
* - Service Worker 必须从网站根路径(/service-worker.js)提供服务,才能控制整站页面
|
|
22
|
+
* - 服务器需返回 Content-Type: application/javascript
|
|
23
|
+
* - 建议设置 Cache-Control: no-cache,确保 SDK 版本更新时能及时刷新
|
|
24
|
+
* - 如果项目已有 Service Worker,将下方 importScripts 加入现有文件顶部即可
|
|
25
|
+
*
|
|
26
|
+
* @see https://help.sap.com/docs/SAP_EMARSYS
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
self.importScripts(
|
|
30
|
+
'https://client-version.cf.emarsys.net/web-emarsys-sdk-v4/latest/web-emarsys-service-worker.js'
|
|
31
|
+
)
|