@anker-in/headless-ui 1.2.3-alpha.1778583232121 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/biz-components/AccordionCards/index.js +1 -1
- package/dist/cjs/biz-components/AccordionCards/index.js.map +3 -3
- package/dist/cjs/biz-components/ActivityMechanism/index.js +1 -1
- package/dist/cjs/biz-components/ActivityMechanism/index.js.map +3 -3
- package/dist/cjs/biz-components/ActivitySchedule/index.js +1 -1
- package/dist/cjs/biz-components/ActivitySchedule/index.js.map +3 -3
- package/dist/cjs/biz-components/AiuiProvider/index.js +1 -1
- package/dist/cjs/biz-components/AiuiProvider/index.js.map +3 -3
- package/dist/cjs/biz-components/AnchorNavigation/index.js +1 -1
- package/dist/cjs/biz-components/AnchorNavigation/index.js.map +3 -3
- package/dist/cjs/biz-components/BrandCardLink/BrandCardLink.js +1 -1
- package/dist/cjs/biz-components/BrandCardLink/BrandCardLink.js.map +3 -3
- package/dist/cjs/biz-components/Category/SwiperCategory.js +1 -1
- package/dist/cjs/biz-components/Category/SwiperCategory.js.map +3 -3
- package/dist/cjs/biz-components/Category/index.js +1 -1
- package/dist/cjs/biz-components/Category/index.js.map +3 -3
- package/dist/cjs/biz-components/Evaluate/index.js +1 -1
- package/dist/cjs/biz-components/Evaluate/index.js.map +3 -3
- package/dist/cjs/biz-components/EventSchedule/index.js +1 -1
- package/dist/cjs/biz-components/EventSchedule/index.js.map +3 -3
- package/dist/cjs/biz-components/Faq/Faq.js +1 -1
- package/dist/cjs/biz-components/Faq/Faq.js.map +2 -2
- package/dist/cjs/biz-components/Faq/types.d.ts +1 -0
- package/dist/cjs/biz-components/Faq/types.js +1 -1
- package/dist/cjs/biz-components/Faq/types.js.map +1 -1
- package/dist/cjs/biz-components/FeatureCards/FeatureCards.js +1 -1
- package/dist/cjs/biz-components/FeatureCards/FeatureCards.js.map +3 -3
- package/dist/cjs/biz-components/GiftBox/index.js +1 -1
- package/dist/cjs/biz-components/GiftBox/index.js.map +2 -2
- package/dist/cjs/biz-components/GiftShelf/index.js +1 -1
- package/dist/cjs/biz-components/GiftShelf/index.js.map +3 -3
- package/dist/cjs/biz-components/GiftTierShelf/index.js +1 -1
- package/dist/cjs/biz-components/GiftTierShelf/index.js.map +3 -3
- package/dist/cjs/biz-components/Graphic/index.js +1 -1
- package/dist/cjs/biz-components/Graphic/index.js.map +3 -3
- package/dist/cjs/biz-components/GraphicOverlay/GraphicOverlay.js +1 -1
- package/dist/cjs/biz-components/GraphicOverlay/GraphicOverlay.js.map +3 -3
- package/dist/cjs/biz-components/HeaderNavigation/index.js +1 -1
- package/dist/cjs/biz-components/HeaderNavigation/index.js.map +3 -3
- package/dist/cjs/biz-components/HeaderNavigation/types.d.ts +1 -8
- package/dist/cjs/biz-components/HeaderNavigation/types.js +1 -1
- package/dist/cjs/biz-components/HeaderNavigation/types.js.map +2 -2
- package/dist/cjs/biz-components/HeaderNavigation/withCategory.d.ts +0 -1
- package/dist/cjs/biz-components/HeaderNavigation/withCategory.js +1 -1
- package/dist/cjs/biz-components/HeaderNavigation/withCategory.js.map +3 -3
- package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
- package/dist/cjs/biz-components/HeroBanner/HeroBanner.js.map +3 -3
- package/dist/cjs/biz-components/HeroBanner/HeroBannerCarousel.js +1 -1
- package/dist/cjs/biz-components/HeroBanner/HeroBannerCarousel.js.map +3 -3
- package/dist/cjs/biz-components/ImageWithText/ImageWithText.js +1 -1
- package/dist/cjs/biz-components/ImageWithText/ImageWithText.js.map +3 -3
- package/dist/cjs/biz-components/Listing/components/ProductCard/ProductGallery/index.js +1 -1
- package/dist/cjs/biz-components/Listing/components/ProductCard/ProductGallery/index.js.map +3 -3
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/ProductActions/index.js +1 -1
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/ProductActions/index.js.map +3 -3
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/index.js +1 -1
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/index.js.map +3 -3
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/types.d.ts +0 -2
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/types.js +1 -1
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/types.js.map +1 -1
- package/dist/cjs/biz-components/LotteryShared/ErrorModal.d.ts +0 -4
- package/dist/cjs/biz-components/LotteryShared/ErrorModal.js.map +2 -2
- package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.d.ts +13 -13
- package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js +1 -1
- package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js.map +3 -3
- package/dist/cjs/biz-components/LotteryShared/types.d.ts +0 -9
- package/dist/cjs/biz-components/LotteryShared/types.js.map +2 -2
- package/dist/cjs/biz-components/Marquee/Marquee.js +1 -1
- package/dist/cjs/biz-components/Marquee/Marquee.js.map +2 -2
- package/dist/cjs/biz-components/MediaPlayerBase/index.js +1 -1
- package/dist/cjs/biz-components/MediaPlayerBase/index.js.map +3 -3
- package/dist/cjs/biz-components/MediaPlayerMulti/index.js +1 -1
- package/dist/cjs/biz-components/MediaPlayerMulti/index.js.map +3 -3
- package/dist/cjs/biz-components/MemberEquity/index.js +2 -2
- package/dist/cjs/biz-components/MemberEquity/index.js.map +3 -3
- package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js +1 -1
- package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js.map +3 -3
- package/dist/cjs/biz-components/NavigationSearch/index.js +2 -2
- package/dist/cjs/biz-components/NavigationSearch/index.js.map +2 -2
- package/dist/cjs/biz-components/ProductHero/ProductHero.js +1 -1
- package/dist/cjs/biz-components/ProductHero/ProductHero.js.map +3 -3
- package/dist/cjs/biz-components/ProductLottery/types.d.ts +5 -62
- package/dist/cjs/biz-components/ProductLottery/types.js +1 -1
- package/dist/cjs/biz-components/ProductLottery/types.js.map +2 -2
- package/dist/cjs/biz-components/ProductNav/ProductNav.js +1 -1
- package/dist/cjs/biz-components/ProductNav/ProductNav.js.map +3 -3
- package/dist/cjs/biz-components/PromotionalBar/index.js +1 -1
- package/dist/cjs/biz-components/PromotionalBar/index.js.map +3 -3
- package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.d.ts +0 -1
- package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.js +1 -1
- package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.js.map +3 -3
- package/dist/cjs/biz-components/SecondaryBanner/index.d.ts +0 -9
- package/dist/cjs/biz-components/SecondaryBanner/index.js +1 -1
- package/dist/cjs/biz-components/SecondaryBanner/index.js.map +3 -3
- package/dist/cjs/biz-components/ShelfDisplay/shelfDisplayItem.js +1 -1
- package/dist/cjs/biz-components/ShelfDisplay/shelfDisplayItem.js.map +3 -3
- package/dist/cjs/biz-components/Subscribe/index.js +1 -1
- package/dist/cjs/biz-components/Subscribe/index.js.map +2 -2
- package/dist/cjs/biz-components/SwiperBox/index.js +1 -1
- package/dist/cjs/biz-components/SwiperBox/index.js.map +3 -3
- package/dist/cjs/biz-components/ThreeDCarousel/ThreeDCarousel.js +1 -1
- package/dist/cjs/biz-components/ThreeDCarousel/ThreeDCarousel.js.map +3 -3
- package/dist/cjs/biz-components/Title/index.js +1 -1
- package/dist/cjs/biz-components/Title/index.js.map +3 -3
- package/dist/cjs/biz-components/WheelLottery/index.js +1 -1
- package/dist/cjs/biz-components/WheelLottery/index.js.map +3 -3
- package/dist/cjs/biz-components/index.d.ts +0 -4
- package/dist/cjs/biz-components/index.js +1 -1
- package/dist/cjs/biz-components/index.js.map +3 -3
- package/dist/cjs/components/Countdown.js +1 -1
- package/dist/cjs/components/Countdown.js.map +3 -3
- package/dist/cjs/components/link.js +1 -1
- package/dist/cjs/components/link.js.map +2 -2
- package/dist/cjs/helpers/index.d.ts +1 -1
- package/dist/cjs/helpers/index.js +1 -1
- package/dist/cjs/helpers/index.js.map +2 -2
- package/dist/cjs/helpers/isLexicalEmpty.d.ts +0 -5
- package/dist/cjs/helpers/isLexicalEmpty.js +1 -1
- package/dist/cjs/helpers/isLexicalEmpty.js.map +3 -3
- package/dist/esm/biz-components/AccordionCards/index.js +1 -1
- package/dist/esm/biz-components/AccordionCards/index.js.map +3 -3
- package/dist/esm/biz-components/ActivityMechanism/index.js +1 -1
- package/dist/esm/biz-components/ActivityMechanism/index.js.map +3 -3
- package/dist/esm/biz-components/ActivitySchedule/index.js +1 -1
- package/dist/esm/biz-components/ActivitySchedule/index.js.map +3 -3
- package/dist/esm/biz-components/AiuiProvider/index.js +1 -1
- package/dist/esm/biz-components/AiuiProvider/index.js.map +3 -3
- package/dist/esm/biz-components/AnchorNavigation/index.js +1 -1
- package/dist/esm/biz-components/AnchorNavigation/index.js.map +3 -3
- package/dist/esm/biz-components/BrandCardLink/BrandCardLink.js +1 -1
- package/dist/esm/biz-components/BrandCardLink/BrandCardLink.js.map +3 -3
- package/dist/esm/biz-components/Category/SwiperCategory.js +1 -1
- package/dist/esm/biz-components/Category/SwiperCategory.js.map +3 -3
- package/dist/esm/biz-components/Category/index.js +1 -1
- package/dist/esm/biz-components/Category/index.js.map +3 -3
- package/dist/esm/biz-components/Evaluate/index.js +1 -1
- package/dist/esm/biz-components/Evaluate/index.js.map +3 -3
- package/dist/esm/biz-components/EventSchedule/index.js +1 -1
- package/dist/esm/biz-components/EventSchedule/index.js.map +3 -3
- package/dist/esm/biz-components/Faq/Faq.js +1 -1
- package/dist/esm/biz-components/Faq/Faq.js.map +2 -2
- package/dist/esm/biz-components/Faq/types.d.ts +1 -0
- package/dist/esm/biz-components/FeatureCards/FeatureCards.js +1 -1
- package/dist/esm/biz-components/FeatureCards/FeatureCards.js.map +3 -3
- package/dist/esm/biz-components/GiftBox/index.js +1 -1
- package/dist/esm/biz-components/GiftBox/index.js.map +2 -2
- package/dist/esm/biz-components/GiftShelf/index.js +1 -1
- package/dist/esm/biz-components/GiftShelf/index.js.map +3 -3
- package/dist/esm/biz-components/GiftTierShelf/index.js +1 -1
- package/dist/esm/biz-components/GiftTierShelf/index.js.map +3 -3
- package/dist/esm/biz-components/Graphic/index.js +1 -1
- package/dist/esm/biz-components/Graphic/index.js.map +3 -3
- package/dist/esm/biz-components/GraphicOverlay/GraphicOverlay.js +1 -1
- package/dist/esm/biz-components/GraphicOverlay/GraphicOverlay.js.map +3 -3
- package/dist/esm/biz-components/HeaderNavigation/index.js +1 -1
- package/dist/esm/biz-components/HeaderNavigation/index.js.map +3 -3
- package/dist/esm/biz-components/HeaderNavigation/types.d.ts +1 -8
- package/dist/esm/biz-components/HeaderNavigation/types.js +1 -1
- package/dist/esm/biz-components/HeaderNavigation/types.js.map +2 -2
- package/dist/esm/biz-components/HeaderNavigation/withCategory.d.ts +0 -1
- package/dist/esm/biz-components/HeaderNavigation/withCategory.js +1 -1
- package/dist/esm/biz-components/HeaderNavigation/withCategory.js.map +3 -3
- package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
- package/dist/esm/biz-components/HeroBanner/HeroBanner.js.map +3 -3
- package/dist/esm/biz-components/HeroBanner/HeroBannerCarousel.js +1 -1
- package/dist/esm/biz-components/HeroBanner/HeroBannerCarousel.js.map +3 -3
- package/dist/esm/biz-components/ImageWithText/ImageWithText.js +1 -1
- package/dist/esm/biz-components/ImageWithText/ImageWithText.js.map +3 -3
- package/dist/esm/biz-components/Listing/components/ProductCard/ProductGallery/index.js +1 -1
- package/dist/esm/biz-components/Listing/components/ProductCard/ProductGallery/index.js.map +3 -3
- package/dist/esm/biz-components/Listing/components/PurchaseBar/ProductActions/index.js +1 -1
- package/dist/esm/biz-components/Listing/components/PurchaseBar/ProductActions/index.js.map +3 -3
- package/dist/esm/biz-components/Listing/components/PurchaseBar/index.js +1 -1
- package/dist/esm/biz-components/Listing/components/PurchaseBar/index.js.map +3 -3
- package/dist/esm/biz-components/Listing/components/PurchaseBar/types.d.ts +0 -2
- package/dist/esm/biz-components/LotteryShared/ErrorModal.d.ts +0 -4
- package/dist/esm/biz-components/LotteryShared/ErrorModal.js.map +2 -2
- package/dist/esm/biz-components/LotteryShared/MyRewardsModal.d.ts +13 -13
- package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js +1 -1
- package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js.map +3 -3
- package/dist/esm/biz-components/LotteryShared/types.d.ts +0 -9
- package/dist/esm/biz-components/LotteryShared/types.js.map +2 -2
- package/dist/esm/biz-components/Marquee/Marquee.js +1 -1
- package/dist/esm/biz-components/Marquee/Marquee.js.map +2 -2
- package/dist/esm/biz-components/MediaPlayerBase/index.js +1 -1
- package/dist/esm/biz-components/MediaPlayerBase/index.js.map +3 -3
- package/dist/esm/biz-components/MediaPlayerMulti/index.js +1 -1
- package/dist/esm/biz-components/MediaPlayerMulti/index.js.map +3 -3
- package/dist/esm/biz-components/MemberEquity/index.js +2 -2
- package/dist/esm/biz-components/MemberEquity/index.js.map +3 -3
- package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js +1 -1
- package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js.map +3 -3
- package/dist/esm/biz-components/NavigationSearch/index.js +2 -2
- package/dist/esm/biz-components/NavigationSearch/index.js.map +3 -3
- package/dist/esm/biz-components/ProductHero/ProductHero.js +1 -1
- package/dist/esm/biz-components/ProductHero/ProductHero.js.map +3 -3
- package/dist/esm/biz-components/ProductLottery/types.d.ts +5 -62
- package/dist/esm/biz-components/ProductLottery/types.js.map +2 -2
- package/dist/esm/biz-components/ProductNav/ProductNav.js +1 -1
- package/dist/esm/biz-components/ProductNav/ProductNav.js.map +3 -3
- package/dist/esm/biz-components/PromotionalBar/index.js +1 -1
- package/dist/esm/biz-components/PromotionalBar/index.js.map +3 -3
- package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.d.ts +0 -1
- package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.js +1 -1
- package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.js.map +3 -3
- package/dist/esm/biz-components/SecondaryBanner/index.d.ts +0 -9
- package/dist/esm/biz-components/SecondaryBanner/index.js +1 -1
- package/dist/esm/biz-components/SecondaryBanner/index.js.map +3 -3
- package/dist/esm/biz-components/ShelfDisplay/shelfDisplayItem.js +1 -1
- package/dist/esm/biz-components/ShelfDisplay/shelfDisplayItem.js.map +3 -3
- package/dist/esm/biz-components/Subscribe/index.js +1 -1
- package/dist/esm/biz-components/Subscribe/index.js.map +2 -2
- package/dist/esm/biz-components/SwiperBox/index.js +1 -1
- package/dist/esm/biz-components/SwiperBox/index.js.map +3 -3
- package/dist/esm/biz-components/ThreeDCarousel/ThreeDCarousel.js +1 -1
- package/dist/esm/biz-components/ThreeDCarousel/ThreeDCarousel.js.map +3 -3
- package/dist/esm/biz-components/Title/index.js +1 -1
- package/dist/esm/biz-components/Title/index.js.map +3 -3
- package/dist/esm/biz-components/WheelLottery/index.js +1 -1
- package/dist/esm/biz-components/WheelLottery/index.js.map +2 -2
- package/dist/esm/biz-components/index.d.ts +0 -4
- package/dist/esm/biz-components/index.js +1 -1
- package/dist/esm/biz-components/index.js.map +3 -3
- package/dist/esm/components/Countdown.js +1 -1
- package/dist/esm/components/Countdown.js.map +3 -3
- package/dist/esm/components/link.js +1 -1
- package/dist/esm/components/link.js.map +2 -2
- package/dist/esm/helpers/index.d.ts +1 -1
- package/dist/esm/helpers/index.js +1 -1
- package/dist/esm/helpers/index.js.map +3 -3
- package/dist/esm/helpers/isLexicalEmpty.d.ts +0 -5
- package/dist/esm/helpers/isLexicalEmpty.js +1 -1
- package/dist/esm/helpers/isLexicalEmpty.js.map +3 -3
- package/package.json +1 -1
- package/style.css +3 -94
- package/dist/cjs/biz-components/HeaderNavigation/MobileTextLinksMenu.d.ts +0 -12
- package/dist/cjs/biz-components/HeaderNavigation/MobileTextLinksMenu.js +0 -2
- package/dist/cjs/biz-components/HeaderNavigation/MobileTextLinksMenu.js.map +0 -7
- package/dist/cjs/biz-components/HeaderNavigation/TextLinksDropdown.d.ts +0 -10
- package/dist/cjs/biz-components/HeaderNavigation/TextLinksDropdown.js +0 -2
- package/dist/cjs/biz-components/HeaderNavigation/TextLinksDropdown.js.map +0 -7
- package/dist/cjs/biz-components/WebPushPopup/index.d.ts +0 -44
- package/dist/cjs/biz-components/WebPushPopup/index.js +0 -2
- package/dist/cjs/biz-components/WebPushPopup/index.js.map +0 -7
- package/dist/cjs/hooks/useEmarsysWebPush.d.ts +0 -111
- package/dist/cjs/hooks/useEmarsysWebPush.js +0 -2
- package/dist/cjs/hooks/useEmarsysWebPush.js.map +0 -7
- package/dist/cjs/hooks/useProductListTrack.d.ts +0 -43
- package/dist/cjs/hooks/useProductListTrack.js +0 -2
- package/dist/cjs/hooks/useProductListTrack.js.map +0 -7
- package/dist/esm/biz-components/HeaderNavigation/MobileTextLinksMenu.d.ts +0 -12
- package/dist/esm/biz-components/HeaderNavigation/MobileTextLinksMenu.js +0 -2
- package/dist/esm/biz-components/HeaderNavigation/MobileTextLinksMenu.js.map +0 -7
- package/dist/esm/biz-components/HeaderNavigation/TextLinksDropdown.d.ts +0 -10
- package/dist/esm/biz-components/HeaderNavigation/TextLinksDropdown.js +0 -2
- package/dist/esm/biz-components/HeaderNavigation/TextLinksDropdown.js.map +0 -7
- package/dist/esm/biz-components/WebPushPopup/index.d.ts +0 -44
- package/dist/esm/biz-components/WebPushPopup/index.js +0 -2
- package/dist/esm/biz-components/WebPushPopup/index.js.map +0 -7
- package/dist/esm/hooks/useEmarsysWebPush.d.ts +0 -111
- package/dist/esm/hooks/useEmarsysWebPush.js +0 -2
- package/dist/esm/hooks/useEmarsysWebPush.js.map +0 -7
- package/dist/esm/hooks/useProductListTrack.d.ts +0 -43
- package/dist/esm/hooks/useProductListTrack.js +0 -2
- package/dist/esm/hooks/useProductListTrack.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/biz-components/Listing/components/PurchaseBar/ProductActions/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Text, Button, Container } from '../../../../../components/index.js'\nimport { useAiuiContext } from '../../../../AiuiProvider/index.js'\nimport { useBizProductContext } from '../../../BizProductProvider.js'\nimport { useMemo, type ReactNode } from 'react'\nimport { formatPrice } from '../../../utils/index.js'\nimport { replaceTemplate } from '../../../utils/textFormat.js'\
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["jsx", "jsxs", "Text", "Button", "Container", "useAiuiContext", "useBizProductContext", "useMemo", "formatPrice", "replaceTemplate", "
|
|
4
|
+
"sourcesContent": ["import { Text, Button, Container } from '../../../../../components/index.js'\nimport { useAiuiContext } from '../../../../AiuiProvider/index.js'\nimport { useBizProductContext } from '../../../BizProductProvider.js'\nimport { useMemo, type ReactNode } from 'react'\nimport { formatPrice } from '../../../utils/index.js'\nimport { replaceTemplate } from '../../../utils/textFormat.js'\n\nexport interface ProductActionsProps {\n /** \u81EA\u5B9A\u4E49\u603B\u8282\u7701\u7EC4\u4EF6\uFF0C\u4F20\u5165\u65F6\u4F1A\u66FF\u4EE3\u9ED8\u8BA4\u7684 totalSavings \u663E\u793A */\n totalSavingsSlot?: ReactNode\n}\n\nconst ProductActions = ({ totalSavingsSlot }: ProductActionsProps = {}) => {\n const { copyWriting, locale = 'us' } = useAiuiContext()\n const {\n variant,\n finalPrice,\n totalSavings,\n isLogin,\n comparePrice,\n onAddToCart,\n onBuyNow,\n savingDetail,\n addToCartLoading,\n buyNowLoading,\n } = useBizProductContext()\n\n const totalSavingsText = useMemo(() => {\n return replaceTemplate(copyWriting?.totalSavings || '', {\n amount: formatPrice({ amount: totalSavings, currencyCode: variant.price.currencyCode, locale }),\n })\n }, [copyWriting?.totalSavings, totalSavings, variant.price.currencyCode, locale])\n\n // const memberPriceSaveText = useMemo(() => {\n // return replaceTemplate(copyWriting?.memberSaving || '', {\n // amount: formatPrice({\n // amount: savingDetail?.member,\n // currencyCode: variant.price.currencyCode,\n // locale,\n // }),\n // })\n // }, [copyWriting?.memberSaving, savingDetail?.member, variant.price.currencyCode, locale])\n\n return (\n <Container\n childClassName=\"tablet:flex tablet:justify-end tablet:gap-8 laptop-md:px-0 desktop:px-0 tablet:items-center tablet:gap-4\"\n className=\"laptop-md:border-none laptop-md:py-0 border-t border-[#E4E5E6] bg-white py-3\"\n >\n {variant.availableForSale ? (\n <div className=\"laptop-md:items-end flex flex-col justify-between\">\n <div className=\"flex items-center gap-1\">\n <Text\n className=\"tablet:text-2xl laptop-md:text-xl lg-desktop:text-2xl text-xl font-bold !leading-[1.2]\"\n html={formatPrice({\n amount: Math.floor(finalPrice * 100) / 100,\n currencyCode: variant.price.currencyCode,\n locale,\n })}\n />\n {(totalSavings > 0 || (savingDetail?.member > 0 && isLogin)) && (\n <Text\n className=\"tablet:text-2xl laptop-md:text-xl lg-desktop:text-2xl text-xl font-bold !leading-[1.2] text-[#4A4C56] line-through\"\n html={formatPrice({\n amount: comparePrice,\n currencyCode: variant.price.currencyCode,\n locale,\n })}\n />\n )}\n {savingDetail?.member > 0 && isLogin && (\n <Text\n className=\"bg-brand-0 rounded px-1 py-[2px] text-sm font-bold text-white\"\n html={copyWriting?.memberPrice || 'Member Price'}\n />\n )}\n </div>\n {totalSavingsSlot ||\n ((totalSavings > 0 || (savingDetail?.member > 0 && isLogin)) && (\n <Text\n className=\"text-brand-0 tablet:text-end laptop-md:text-xl lg-desktop:text-2xl whitespace-nowrap text-[18px] font-bold !leading-[1.2]\"\n html={`${totalSavingsText}`}\n />\n ))}\n </div>\n ) : (\n <Text className=\"text-[20px] font-bold text-[#999999]\" html={copyWriting?.soldOut ?? 'Sold Out'} />\n )}\n <div className=\"tablet:mt-0 mt-2 flex items-center gap-2\">\n <Button\n variant=\"secondary\"\n disabled={!variant.availableForSale}\n size=\"lg\"\n className=\"tablet:w-auto w-1/2\"\n onClick={() => onAddToCart?.()}\n loading={addToCartLoading}\n >\n {copyWriting?.addToCart ?? 'Add to Cart'}\n </Button>\n <Button\n variant=\"primary\"\n disabled={!variant.availableForSale}\n size=\"lg\"\n loading={buyNowLoading}\n className=\"tablet:w-auto w-1/2\"\n onClick={() => onBuyNow?.()}\n >\n {copyWriting?.buyNow ?? 'Buy Now'}\n </Button>\n </div>\n </Container>\n )\n}\n\nexport default ProductActions\n"],
|
|
5
|
+
"mappings": "AAkDU,OACE,OAAAA,EADF,QAAAC,MAAA,oBAlDV,OAAS,QAAAC,EAAM,UAAAC,EAAQ,aAAAC,MAAiB,qCACxC,OAAS,kBAAAC,MAAsB,oCAC/B,OAAS,wBAAAC,MAA4B,iCACrC,OAAS,WAAAC,MAA+B,QACxC,OAAS,eAAAC,MAAmB,0BAC5B,OAAS,mBAAAC,MAAuB,+BAOhC,MAAMC,EAAiB,CAAC,CAAE,iBAAAC,CAAiB,EAAyB,CAAC,IAAM,CACzE,KAAM,CAAE,YAAAC,EAAa,OAAAC,EAAS,IAAK,EAAIR,EAAe,EAChD,CACJ,QAAAS,EACA,WAAAC,EACA,aAAAC,EACA,QAAAC,EACA,aAAAC,EACA,YAAAC,EACA,SAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,cAAAC,CACF,EAAIjB,EAAqB,EAEnBkB,EAAmBjB,EAAQ,IACxBE,EAAgBG,GAAa,cAAgB,GAAI,CACtD,OAAQJ,EAAY,CAAE,OAAQQ,EAAc,aAAcF,EAAQ,MAAM,aAAc,OAAAD,CAAO,CAAC,CAChG,CAAC,EACA,CAACD,GAAa,aAAcI,EAAcF,EAAQ,MAAM,aAAcD,CAAM,CAAC,EAYhF,OACEZ,EAACG,EAAA,CACC,eAAe,2GACf,UAAU,+EAET,UAAAU,EAAQ,iBACPb,EAAC,OAAI,UAAU,oDACb,UAAAA,EAAC,OAAI,UAAU,0BACb,UAAAD,EAACE,EAAA,CACC,UAAU,yFACV,KAAMM,EAAY,CAChB,OAAQ,KAAK,MAAMO,EAAa,GAAG,EAAI,IACvC,aAAcD,EAAQ,MAAM,aAC5B,OAAAD,CACF,CAAC,EACH,GACEG,EAAe,GAAMK,GAAc,OAAS,GAAKJ,IACjDjB,EAACE,EAAA,CACC,UAAU,qHACV,KAAMM,EAAY,CAChB,OAAQU,EACR,aAAcJ,EAAQ,MAAM,aAC5B,OAAAD,CACF,CAAC,EACH,EAEDQ,GAAc,OAAS,GAAKJ,GAC3BjB,EAACE,EAAA,CACC,UAAU,gEACV,KAAMU,GAAa,aAAe,eACpC,GAEJ,EACCD,IACGK,EAAe,GAAMK,GAAc,OAAS,GAAKJ,IACjDjB,EAACE,EAAA,CACC,UAAU,4HACV,KAAM,GAAGsB,CAAgB,GAC3B,GAEN,EAEAxB,EAACE,EAAA,CAAK,UAAU,uCAAuC,KAAMU,GAAa,SAAW,WAAY,EAEnGX,EAAC,OAAI,UAAU,2CACb,UAAAD,EAACG,EAAA,CACC,QAAQ,YACR,SAAU,CAACW,EAAQ,iBACnB,KAAK,KACL,UAAU,sBACV,QAAS,IAAMK,IAAc,EAC7B,QAASG,EAER,SAAAV,GAAa,WAAa,cAC7B,EACAZ,EAACG,EAAA,CACC,QAAQ,UACR,SAAU,CAACW,EAAQ,iBACnB,KAAK,KACL,QAASS,EACT,UAAU,sBACV,QAAS,IAAMH,IAAW,EAEzB,SAAAR,GAAa,QAAU,UAC1B,GACF,GACF,CAEJ,EAEA,IAAOa,EAAQf",
|
|
6
|
+
"names": ["jsx", "jsxs", "Text", "Button", "Container", "useAiuiContext", "useBizProductContext", "useMemo", "formatPrice", "replaceTemplate", "ProductActions", "totalSavingsSlot", "copyWriting", "locale", "variant", "finalPrice", "totalSavings", "isLogin", "comparePrice", "onAddToCart", "onBuyNow", "savingDetail", "addToCartLoading", "buyNowLoading", "totalSavingsText", "ProductActions_default"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as a,jsxs as t}from"react/jsx-runtime";import{useMemo as
|
|
1
|
+
import{jsx as a,jsxs as t}from"react/jsx-runtime";import{useMemo as m}from"react";import{Heading as n,Container as l}from"../../../../components/index.js";import{ProductActions as c}from"../index.js";import{useBizProductContext as u}from"../../BizProductProvider.js";import p from"./ScrollSpyNav/index.js";import{withLayout as f}from"../../../../shared/Styles.js";const b=({onSpyNavItemClick:o,totalSavingsSlot:s})=>{const{product:e,renderRating:r}=u(),i=m(()=>e?.payload?.components?.find(d=>d.componentKey==="PurchaseBar")?.data||[],[e?.payload]);return t("div",{id:"purchase-bar",className:"sticky left-0 top-0 z-[45] w-full border-b border-[#E4E5E6] bg-white",children:[a(l,{children:t("div",{className:"tablet:justify-between laptop-md:gap-16 tablet:gap-0 tablet:w-full flex flex-wrap items-center gap-[10px]",children:[t("div",{className:"laptop-md:pt-6 laptop-md:pb-0 min-w-0 flex-1 py-3",children:[a(n,{size:2,className:"line-clamp-2 text-wrap",html:e?.title}),a("div",{className:"laptop-md:block mt-3 hidden",children:a(p,{tabs:i,className:"",renderRating:r,onSpyNavItemClick:o})})]}),a("div",{className:"laptop-md:block hidden shrink-0",children:a(c,{totalSavingsSlot:s})})]})}),t(l,{className:"laptop-md:hidden relative",children:[a("div",{className:"absolute left-0 top-0 h-px w-full bg-[#E4E5E6]"}),a(p,{tabs:i,renderRating:r,onSpyNavItemClick:o})]})]})};var P=f(b);export{P as default};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/biz-components/Listing/components/PurchaseBar/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { useMemo } from 'react'\nimport { Heading, Container } from '../../../../components/index.js'\nimport type { PurchaseBarProps } from './types.js'\nimport { ProductActions } from '../index.js'\nimport { useBizProductContext } from '../../BizProductProvider.js'\nimport ScrollSpyNav from './ScrollSpyNav/index.js'\nimport { withLayout } from '../../../../shared/Styles.js'\n\nconst PurchaseBar = ({ onSpyNavItemClick, totalSavingsSlot
|
|
5
|
-
"mappings": "AAmBU,OACE,OAAAA,EADF,QAAAC,MAAA,oBAnBV,OAAS,WAAAC,MAAe,QACxB,OAAS,WAAAC,EAAS,aAAAC,MAAiB,kCAEnC,OAAS,kBAAAC,MAAsB,cAC/B,OAAS,wBAAAC,MAA4B,8BACrC,OAAOC,MAAkB,0BACzB,OAAS,cAAAC,MAAkB,+BAE3B,MAAMC,EAAc,CAAC,CAAE,kBAAAC,EAAmB,iBAAAC,
|
|
6
|
-
"names": ["jsx", "jsxs", "useMemo", "Heading", "Container", "ProductActions", "useBizProductContext", "ScrollSpyNav", "withLayout", "PurchaseBar", "onSpyNavItemClick", "totalSavingsSlot", "
|
|
4
|
+
"sourcesContent": ["import { useMemo } from 'react'\nimport { Heading, Container } from '../../../../components/index.js'\nimport type { PurchaseBarProps } from './types.js'\nimport { ProductActions } from '../index.js'\nimport { useBizProductContext } from '../../BizProductProvider.js'\nimport ScrollSpyNav from './ScrollSpyNav/index.js'\nimport { withLayout } from '../../../../shared/Styles.js'\n\nconst PurchaseBar = ({ onSpyNavItemClick, totalSavingsSlot }: PurchaseBarProps) => {\n const { product, renderRating } = useBizProductContext()\n\n const PurchaseBarData = useMemo(() => {\n return product?.payload?.components?.find((item: any) => item.componentKey === 'PurchaseBar')?.data || []\n }, [product?.payload])\n\n return (\n <div id=\"purchase-bar\" className=\"sticky left-0 top-0 z-[45] w-full border-b border-[#E4E5E6] bg-white\">\n <Container>\n <div className=\"tablet:justify-between laptop-md:gap-16 tablet:gap-0 tablet:w-full flex flex-wrap items-center gap-[10px]\">\n <div className=\"laptop-md:pt-6 laptop-md:pb-0 min-w-0 flex-1 py-3\">\n <Heading size={2} className=\"line-clamp-2 text-wrap\" html={product?.title} />\n <div className=\"laptop-md:block mt-3 hidden\">\n <ScrollSpyNav\n tabs={PurchaseBarData}\n className=\"\"\n renderRating={renderRating}\n onSpyNavItemClick={onSpyNavItemClick}\n />\n </div>\n </div>\n <div className=\"laptop-md:block hidden shrink-0\">\n <ProductActions totalSavingsSlot={totalSavingsSlot} />\n </div>\n </div>\n </Container>\n <Container className=\"laptop-md:hidden relative\">\n <div className=\"absolute left-0 top-0 h-px w-full bg-[#E4E5E6]\"></div>\n <ScrollSpyNav tabs={PurchaseBarData} renderRating={renderRating} onSpyNavItemClick={onSpyNavItemClick} />\n </Container>\n </div>\n )\n}\n\nexport default withLayout(PurchaseBar)\n"],
|
|
5
|
+
"mappings": "AAmBU,OACE,OAAAA,EADF,QAAAC,MAAA,oBAnBV,OAAS,WAAAC,MAAe,QACxB,OAAS,WAAAC,EAAS,aAAAC,MAAiB,kCAEnC,OAAS,kBAAAC,MAAsB,cAC/B,OAAS,wBAAAC,MAA4B,8BACrC,OAAOC,MAAkB,0BACzB,OAAS,cAAAC,MAAkB,+BAE3B,MAAMC,EAAc,CAAC,CAAE,kBAAAC,EAAmB,iBAAAC,CAAiB,IAAwB,CACjF,KAAM,CAAE,QAAAC,EAAS,aAAAC,CAAa,EAAIP,EAAqB,EAEjDQ,EAAkBZ,EAAQ,IACvBU,GAAS,SAAS,YAAY,KAAMG,GAAcA,EAAK,eAAiB,aAAa,GAAG,MAAQ,CAAC,EACvG,CAACH,GAAS,OAAO,CAAC,EAErB,OACEX,EAAC,OAAI,GAAG,eAAe,UAAU,uEAC/B,UAAAD,EAACI,EAAA,CACC,SAAAH,EAAC,OAAI,UAAU,4GACb,UAAAA,EAAC,OAAI,UAAU,oDACb,UAAAD,EAACG,EAAA,CAAQ,KAAM,EAAG,UAAU,yBAAyB,KAAMS,GAAS,MAAO,EAC3EZ,EAAC,OAAI,UAAU,8BACb,SAAAA,EAACO,EAAA,CACC,KAAMO,EACN,UAAU,GACV,aAAcD,EACd,kBAAmBH,EACrB,EACF,GACF,EACAV,EAAC,OAAI,UAAU,kCACb,SAAAA,EAACK,EAAA,CAAe,iBAAkBM,EAAkB,EACtD,GACF,EACF,EACAV,EAACG,EAAA,CAAU,UAAU,4BACnB,UAAAJ,EAAC,OAAI,UAAU,iDAAiD,EAChEA,EAACO,EAAA,CAAa,KAAMO,EAAiB,aAAcD,EAAc,kBAAmBH,EAAmB,GACzG,GACF,CAEJ,EAEA,IAAOM,EAAQR,EAAWC,CAAW",
|
|
6
|
+
"names": ["jsx", "jsxs", "useMemo", "Heading", "Container", "ProductActions", "useBizProductContext", "ScrollSpyNav", "withLayout", "PurchaseBar", "onSpyNavItemClick", "totalSavingsSlot", "product", "renderRating", "PurchaseBarData", "item", "PurchaseBar_default"]
|
|
7
7
|
}
|
|
@@ -3,8 +3,6 @@ export interface PurchaseBarProps {
|
|
|
3
3
|
onSpyNavItemClick?: (tab: ScrollSpyNavItem) => void;
|
|
4
4
|
/** 自定义总节省组件,传入时会替代默认的 totalSavings 显示 */
|
|
5
5
|
totalSavingsSlot?: ReactNode;
|
|
6
|
-
/** 自定义右侧 Actions 插槽,传入时替代默认的 ProductActions */
|
|
7
|
-
actionsSlot?: ReactNode;
|
|
8
6
|
}
|
|
9
7
|
export interface ScrollSpyNavItem {
|
|
10
8
|
label: string;
|
|
@@ -42,20 +42,16 @@ export interface ErrorModalProps {
|
|
|
42
42
|
/**
|
|
43
43
|
* 兑换失败时显示的弹窗标题(来自 CMS error.exchangeFailedTitle)
|
|
44
44
|
* 仅当 isExchangeFailed 为 true 时生效
|
|
45
|
-
* @optional
|
|
46
45
|
*/
|
|
47
46
|
exchangeFailedTitle?: string;
|
|
48
47
|
/**
|
|
49
48
|
* 兑换失败时显示的错误消息(来自 CMS error.exchangeFailedMessage)
|
|
50
49
|
* 仅当 isExchangeFailed 为 true 时生效
|
|
51
|
-
* @optional
|
|
52
50
|
*/
|
|
53
51
|
exchangeFailedMessage?: string;
|
|
54
52
|
/**
|
|
55
53
|
* 是否处于兑换失败状态
|
|
56
|
-
* 为 true 时优先显示 exchangeFailedTitle / exchangeFailedMessage
|
|
57
54
|
* @default false
|
|
58
|
-
* @optional
|
|
59
55
|
*/
|
|
60
56
|
isExchangeFailed?: boolean;
|
|
61
57
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/biz-components/LotteryShared/ErrorModal.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * ErrorModal - \u9519\u8BEF\u63D0\u793A\u5F39\u7A97\u7EC4\u4EF6\n *\n * \u7528\u4E8E\u5C55\u793A\u62BD\u5956\u8FC7\u7A0B\u4E2D\u7684\u9519\u8BEF\u4FE1\u606F\n *\n * @module ErrorModal\n * @date 2026-01-04\n */\n\n'use client'\n\nimport React from 'react'\nimport { BaseModal } from './BaseModal.js'\nimport { Heading, Button } from '../../components/index.js'\n\nexport interface ErrorModalProps {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u9519\u8BEF\u6807\u9898\n * @default \"Oops!\"\n */\n title?: string\n\n /**\n * \u9519\u8BEF\u6D88\u606F\n */\n message?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"OK, I get\"\n */\n confirmText?: string\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @default 'light'\n */\n theme?: 'light' | 'dark'\n\n /**\n * \u5151\u6362\u5931\u8D25\u65F6\u663E\u793A\u7684\u5F39\u7A97\u6807\u9898\uFF08\u6765\u81EA CMS error.exchangeFailedTitle\uFF09\n * \u4EC5\u5F53 isExchangeFailed \u4E3A true \u65F6\u751F\u6548\n
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * ErrorModal - \u9519\u8BEF\u63D0\u793A\u5F39\u7A97\u7EC4\u4EF6\n *\n * \u7528\u4E8E\u5C55\u793A\u62BD\u5956\u8FC7\u7A0B\u4E2D\u7684\u9519\u8BEF\u4FE1\u606F\n *\n * @module ErrorModal\n * @date 2026-01-04\n */\n\n'use client'\n\nimport React from 'react'\nimport { BaseModal } from './BaseModal.js'\nimport { Heading, Button } from '../../components/index.js'\n\nexport interface ErrorModalProps {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u9519\u8BEF\u6807\u9898\n * @default \"Oops!\"\n */\n title?: string\n\n /**\n * \u9519\u8BEF\u6D88\u606F\n */\n message?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"OK, I get\"\n */\n confirmText?: string\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @default 'light'\n */\n theme?: 'light' | 'dark'\n\n /**\n * \u5151\u6362\u5931\u8D25\u65F6\u663E\u793A\u7684\u5F39\u7A97\u6807\u9898\uFF08\u6765\u81EA CMS error.exchangeFailedTitle\uFF09\n * \u4EC5\u5F53 isExchangeFailed \u4E3A true \u65F6\u751F\u6548\n */\n exchangeFailedTitle?: string\n\n /**\n * \u5151\u6362\u5931\u8D25\u65F6\u663E\u793A\u7684\u9519\u8BEF\u6D88\u606F\uFF08\u6765\u81EA CMS error.exchangeFailedMessage\uFF09\n * \u4EC5\u5F53 isExchangeFailed \u4E3A true \u65F6\u751F\u6548\n */\n exchangeFailedMessage?: string\n\n /**\n * \u662F\u5426\u5904\u4E8E\u5151\u6362\u5931\u8D25\u72B6\u6001\n * @default false\n */\n isExchangeFailed?: boolean\n}\n\n/**\n * ErrorModal \u9519\u8BEF\u63D0\u793A\u5F39\u7A97\u7EC4\u4EF6\n */\nexport const ErrorModal: React.FC<ErrorModalProps> = ({\n isOpen,\n onClose,\n title = \"Sorry, You Didn't Win This Time\",\n message,\n confirmText = 'OK, I get',\n className,\n theme = 'light',\n exchangeFailedTitle,\n exchangeFailedMessage,\n isExchangeFailed = false,\n}) => {\n // \u5151\u6362\u5931\u8D25\u72B6\u6001\u4E0B\uFF0C\u4F18\u5148\u4F7F\u7528\u4E13\u5C5E\u6587\u6848\n const displayTitle = isExchangeFailed && exchangeFailedTitle ? exchangeFailedTitle : title\n const displayMessage = isExchangeFailed && exchangeFailedMessage ? exchangeFailedMessage : message\n return (\n <BaseModal\n isOpen={isOpen}\n onClose={onClose}\n maxWidth=\"max-w-[326px] laptop:max-w-[420px]\"\n background=\"bg-white\"\n // \u9519\u8BEF\u5F39\u7A97\u4F7F\u7528\u66F4\u9AD8\u5C42\u7EA7\uFF0C\u786E\u4FDD\u663E\u793A\u5728\u6240\u6709\u5176\u4ED6\u5F39\u7A97\u4E4B\u4E0A\n className={`${className || ''}`}\n ariaLabelledBy=\"error-modal-title\"\n theme={theme}\n >\n <div className=\"laptop:px-8 laptop:pb-8 px-6 pb-6\">\n {/* \u9519\u8BEF\u56FE\u6807 */}\n <div className=\"mb-6 flex justify-center\">\n <div className=\"flex size-[80px] items-center justify-center rounded-full\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\">\n <path\n d=\"M63.5691 63.5727C68.2304 58.9107 71.4047 52.9713 72.6905 46.5054C73.9764 40.0395 73.316 33.3374 70.793 27.2468C68.27 21.1562 63.9975 15.9505 58.516 12.2879C53.0344 8.6254 46.5899 6.67053 39.9974 6.67053C33.4049 6.67053 26.9604 8.6254 21.4788 12.2879C15.9973 15.9505 11.7249 21.1562 9.20182 27.2468C6.67878 33.3374 6.01843 40.0395 7.30427 46.5054C8.59011 52.9713 11.7644 58.9107 16.4257 63.5727C19.5211 66.6684 23.1959 69.1241 27.2404 70.7995C31.2848 72.4749 35.6197 73.3372 39.9974 73.3372C44.3751 73.3372 48.71 72.4749 52.7545 70.7995C56.7989 69.1241 60.4737 66.6684 63.5691 63.5727Z\"\n fill=\"#FFCC66\"\n />\n <path\n d=\"M57.3792 11.5137C61.4604 17.8614 63.2668 25.4062 62.503 32.914C61.7393 40.4218 58.4505 47.4482 53.1746 52.8441C47.8988 58.24 40.9481 61.6859 33.4594 62.6183C25.9706 63.5507 18.3872 61.9144 11.9492 57.977C14.6587 62.1912 18.2833 65.7405 22.5534 68.3609C26.8236 70.9813 31.6296 72.6054 36.6139 73.1125C41.5983 73.6195 46.6329 72.9965 51.3433 71.2897C56.0537 69.5829 60.3187 66.8363 63.8213 63.254C67.3239 59.6717 69.974 55.346 71.5744 50.5984C73.1749 45.8508 73.6845 40.8035 73.0655 35.8318C72.4465 30.8601 70.7147 26.0919 67.9989 21.8817C65.2832 17.6715 61.6533 14.1277 57.3792 11.5137Z\"\n fill=\"#FFC450\"\n />\n <path\n opacity=\"0.4\"\n d=\"M11.204 43.58C11.1862 37.1148 13.1937 30.8063 16.9446 25.5404C20.6955 20.2745 26.0015 16.3156 32.1175 14.2196C38.2336 12.1235 44.8525 11.9956 51.045 13.8538C57.2374 15.712 62.6924 19.4629 66.644 24.58C64.5168 20.9213 61.6618 17.7377 58.2555 15.226C54.8493 12.7143 50.964 10.9279 46.84 9.97716C42.716 9.02646 38.4408 8.93165 34.2787 9.69861C30.1166 10.4656 26.156 12.078 22.6418 14.4362C19.1275 16.7944 16.1342 19.8484 13.8469 23.4092C11.5596 26.9701 10.027 30.9622 9.34361 35.1388C8.66026 39.3155 8.84077 43.5879 9.87398 47.692C10.9072 51.7962 12.7711 55.6448 15.3506 59C12.6353 54.3146 11.2049 48.9954 11.204 43.58Z\"\n fill=\"white\"\n />\n <path\n d=\"M40 58.1469C43.3333 58.1469 46 53.5802 46 47.9436C46 42.3069 43.3067 37.7402 40 37.7402C36.6933 37.7402 34 42.3102 34 47.9436C34 53.5769 36.6667 58.1469 40 58.1469Z\"\n fill=\"#333333\"\n />\n <path\n d=\"M45.0763 53.4168C40.6863 51.0035 37.113 52.3735 35.043 53.7502C36.1296 56.4168 37.943 58.1635 39.9963 58.1635C42.1363 58.1535 43.9996 56.2635 45.0763 53.4168Z\"\n fill=\"#F84D4F\"\n />\n <path\n d=\"M29.6913 33.373L20.918 38.9564L21.1413 67.4864C23.7747 69.2998 26.6568 70.7224 29.698 71.7097L29.6913 33.373ZM50.3313 33.373L59.0913 38.9564L58.8746 67.4864C56.2413 69.2998 53.3591 70.7224 50.318 71.7097L50.3313 33.373Z\"\n fill=\"#21D2C5\"\n />\n <path\n d=\"M22.0217 39.9506C21.7281 39.9495 21.4421 39.8572 21.2032 39.6864C20.9643 39.5156 20.7844 39.2748 20.6884 38.9973C20.5918 38.7187 20.5848 38.4168 20.6684 38.134C20.7531 37.8525 20.9218 37.6037 21.1517 37.4206L25.9617 33.6673L21.0017 30.754C20.7618 30.6135 20.5684 30.4055 20.4459 30.1559C20.3233 29.9063 20.2769 29.6261 20.3124 29.3503C20.3479 29.0745 20.4639 28.8153 20.6457 28.6049C20.8276 28.3946 21.0673 28.2424 21.3351 28.1673C21.6986 28.0738 22.0844 28.1277 22.4084 28.3173L29.1817 32.294C29.3803 32.4109 29.5474 32.5745 29.6684 32.7706C29.7911 32.9687 29.8632 33.1939 29.8784 33.4265C29.8935 33.659 29.8511 33.8917 29.7551 34.104C29.6613 34.3147 29.517 34.499 29.3351 34.6406L22.8851 39.6673C22.6373 39.856 22.3332 39.9558 22.0217 39.9506ZM57.9817 39.9506C57.6662 39.9515 57.3596 39.8458 57.1117 39.6506L50.6684 34.6306C50.4845 34.4879 50.3381 34.3025 50.2417 34.0906C50.0963 33.7713 50.0751 33.4092 50.1824 33.0751C50.2896 32.7411 50.5176 32.459 50.8217 32.284L57.5817 28.304C57.7426 28.1992 57.9228 28.1278 58.1118 28.094C58.3007 28.0602 58.4946 28.0648 58.6817 28.1073C58.869 28.1498 59.0451 28.2316 59.1984 28.3473C59.3536 28.4595 59.4841 28.6025 59.5817 28.7673C59.6787 28.9331 59.741 29.1168 59.7651 29.3073C59.7895 29.4977 59.7749 29.691 59.7222 29.8755C59.6695 30.0601 59.5797 30.2319 59.4584 30.3806C59.3341 30.5324 59.1783 30.6552 59.0017 30.7406L54.0417 33.6673L58.8484 37.414C59.0217 37.5492 59.161 37.7229 59.2554 37.9214C59.3497 38.1199 59.3965 38.3376 59.3919 38.5573C59.3874 38.777 59.3317 38.9927 59.2293 39.1871C59.1268 39.3815 58.9804 39.5494 58.8017 39.6773C58.5626 39.8488 58.2761 39.942 57.9817 39.944V39.9506Z\"\n fill=\"#333333\"\n />\n </svg>\n </div>\n </div>\n\n {/* \u6807\u9898 */}\n <Heading size={2} id=\"error-modal-title\" className=\"text-center tracking-[-0.32px] text-[#1D1D1F]\">\n {displayTitle}\n </Heading>\n\n {/* \u9519\u8BEF\u6D88\u606F */}\n <p className=\"laptop:text-[16px] mb-6 text-wrap break-words text-center text-[14px] font-[700] text-[#1D1D1F]\">\n {displayMessage}\n </p>\n\n {/* \u786E\u8BA4\u6309\u94AE */}\n <Button onClick={onClose} className=\"w-full\">\n {confirmText}\n </Button>\n </div>\n </BaseModal>\n )\n}\n\nexport default ErrorModal\n"],
|
|
5
|
+
"mappings": "aA0GY,OACE,OAAAA,EADF,QAAAC,MAAA,oBA/FZ,MAAkB,QAClB,OAAS,aAAAC,MAAiB,iBAC1B,OAAS,WAAAC,EAAS,UAAAC,MAAc,4BA+DzB,MAAMC,EAAwC,CAAC,CACpD,OAAAC,EACA,QAAAC,EACA,MAAAC,EAAQ,kCACR,QAAAC,EACA,YAAAC,EAAc,YACd,UAAAC,EACA,MAAAC,EAAQ,QACR,oBAAAC,EACA,sBAAAC,EACA,iBAAAC,EAAmB,EACrB,IAAM,CAEJ,MAAMC,EAAeD,GAAoBF,EAAsBA,EAAsBL,EAC/ES,EAAiBF,GAAoBD,EAAwBA,EAAwBL,EAC3F,OACET,EAACE,EAAA,CACC,OAAQI,EACR,QAASC,EACT,SAAS,qCACT,WAAW,WAEX,UAAW,GAAGI,GAAa,EAAE,GAC7B,eAAe,oBACf,MAAOC,EAEP,SAAAX,EAAC,OAAI,UAAU,oCAEb,UAAAD,EAAC,OAAI,UAAU,2BACb,SAAAA,EAAC,OAAI,UAAU,4DACb,SAAAC,EAAC,OAAI,MAAM,6BAA6B,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACtF,UAAAD,EAAC,QACC,EAAE,2kBACF,KAAK,UACP,EACAA,EAAC,QACC,EAAE,4kBACF,KAAK,UACP,EACAA,EAAC,QACC,QAAQ,MACR,EAAE,2mBACF,KAAK,QACP,EACAA,EAAC,QACC,EAAE,uKACF,KAAK,UACP,EACAA,EAAC,QACC,EAAE,iKACF,KAAK,UACP,EACAA,EAAC,QACC,EAAE,8NACF,KAAK,UACP,EACAA,EAAC,QACC,EAAE,ymDACF,KAAK,UACP,GACF,EACF,EACF,EAGAA,EAACG,EAAA,CAAQ,KAAM,EAAG,GAAG,oBAAoB,UAAU,gDAChD,SAAAa,EACH,EAGAhB,EAAC,KAAE,UAAU,kGACV,SAAAiB,EACH,EAGAjB,EAACI,EAAA,CAAO,QAASG,EAAS,UAAU,SACjC,SAAAG,EACH,GACF,EACF,CAEJ,EAEA,IAAOQ,EAAQb",
|
|
6
6
|
"names": ["jsx", "jsxs", "BaseModal", "Heading", "Button", "ErrorModal", "isOpen", "onClose", "title", "message", "confirmText", "className", "theme", "exchangeFailedTitle", "exchangeFailedMessage", "isExchangeFailed", "displayTitle", "displayMessage", "ErrorModal_default"]
|
|
7
7
|
}
|
|
@@ -94,38 +94,38 @@ export interface MyRewardsModalProps {
|
|
|
94
94
|
*/
|
|
95
95
|
emptyText?: string;
|
|
96
96
|
/**
|
|
97
|
-
*
|
|
98
|
-
* @default 'light'
|
|
99
|
-
*/
|
|
100
|
-
theme?: 'light' | 'dark';
|
|
101
|
-
/**
|
|
102
|
-
* 复制失败提示文案(来自 CMS myRewardsModalConfig.copyError)
|
|
97
|
+
* 复制失败提示文案
|
|
103
98
|
* @optional
|
|
104
99
|
*/
|
|
105
100
|
copyError?: string;
|
|
106
101
|
/**
|
|
107
|
-
*
|
|
108
|
-
* @default
|
|
102
|
+
* 可用状态文案
|
|
103
|
+
* @default "Available"
|
|
109
104
|
* @optional
|
|
110
105
|
*/
|
|
111
106
|
availableText?: string;
|
|
112
107
|
/**
|
|
113
|
-
*
|
|
114
|
-
* @default
|
|
108
|
+
* 已使用状态文案
|
|
109
|
+
* @default "Used"
|
|
115
110
|
* @optional
|
|
116
111
|
*/
|
|
117
112
|
usedStatusText?: string;
|
|
118
113
|
/**
|
|
119
|
-
*
|
|
120
|
-
* @default
|
|
114
|
+
* 已过期状态文案
|
|
115
|
+
* @default "Expired"
|
|
121
116
|
* @optional
|
|
122
117
|
*/
|
|
123
118
|
expiredText?: string;
|
|
124
119
|
/**
|
|
125
|
-
*
|
|
120
|
+
* 未知状态文案
|
|
126
121
|
* @optional
|
|
127
122
|
*/
|
|
128
123
|
notFoundText?: string;
|
|
124
|
+
/**
|
|
125
|
+
* 主题模式
|
|
126
|
+
* @default 'light'
|
|
127
|
+
*/
|
|
128
|
+
theme?: 'light' | 'dark';
|
|
129
129
|
}
|
|
130
130
|
/**
|
|
131
131
|
* MyRewardsModal 我的奖励弹窗组件
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{jsx as a,jsxs as
|
|
1
|
+
"use client";import{jsx as a,jsxs as o}from"react/jsx-runtime";import{useState as c,useRef as P,useEffect as q}from"react";import{cn as i}from"../../helpers/index.js";import{BaseModal as A}from"./BaseModal.js";const B=({isOpen:x,onClose:u,title:d="My Rewards",rewards:r,onCopyCode:m,className:g,codeText:f="CODE:",copyText:b="COPY",copiedText:y="COPIED",prizeText:v="Prize time:",emptyText:T="No rewards yet",copyError:h,availableText:C="Available",usedStatusText:N="Used",expiredText:R="Expired",notFoundText:S,theme:E="light"})=>{const M=e=>{switch(e){case"Available":return C;case"Used":return N;case"Expired":return R;default:return S??e}},[O,n]=c({}),[k,l]=c({}),s=P({});q(()=>()=>{Object.values(s.current).forEach(e=>clearTimeout(e))},[]);const z=async(e,p)=>{s.current[e]&&clearTimeout(s.current[e]);try{await navigator.clipboard.writeText(p),m?.(p),n(t=>({...t,[e]:!0})),l(t=>({...t,[e]:!1})),s.current[e]=setTimeout(()=>{n(t=>({...t,[e]:!1})),delete s.current[e]},3e3)}catch{l(t=>({...t,[e]:!0})),n(t=>({...t,[e]:!1})),s.current[e]=setTimeout(()=>{l(t=>({...t,[e]:!1})),delete s.current[e]},3e3)}};return a(A,{isOpen:x,onClose:u,maxWidth:"max-w-[480px] laptop:max-w-[520px]",background:"bg-white",className:g,title:d,ariaLabelledBy:"rewards-modal-title",theme:E,children:a("div",{className:"laptop:px-8 laptop:pb-8 p-4",children:a("div",{className:"flex max-h-[584px] flex-col gap-2 overflow-y-auto",children:r.length===0?a("p",{className:"py-8 text-center text-[14px] text-gray-500",children:T}):r.map(e=>a("div",{className:i("rounded-box","bg-container-secondary-0 relative flex-none overflow-hidden","px-4 py-6"),children:o("div",{className:"tablet:text-[16px] tablet:flex items-center justify-between gap-2 text-[14px] font-[700]",children:[o("div",{className:"flex-1",children:[a("p",{className:i("mb-1 font-[700]",e?.available?"text-info-primary":"text-info-quaternary"),children:e.name}),e.code&&o("div",{className:i("flex items-center gap-2",e?.available?"text-brand-0":"text-info-quaternary"),children:[o("p",{className:"max-w-[200px] truncate",children:[f," ",e.code]}),e.showCopyCode&&e?.available&&a("button",{onClick:()=>z(e.id,e.code),className:"underline",children:k[e.id]?h??"Copy failed":O[e.id]?y:b})]})]}),e.prizeTime&&o("div",{className:i("tablet:block text-info-quaternary flex gap-1 text-[14px] font-[700]"),children:[a("p",{children:v}),a("p",{children:e.prizeTime})]}),a("span",{className:i("rounded-[0_8px] px-[6px] text-[14px] font-[700]","absolute right-0 top-0",e?.available?"bg-brand-0 text-info-white":"bg-info-quaternary text-info-white"),children:e.statusText??M(e.status)})]})},e.id))})})})};var j=B;export{B as MyRewardsModal,j as default};
|
|
2
2
|
//# sourceMappingURL=MyRewardsModal.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/biz-components/LotteryShared/MyRewardsModal.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * MyRewardsModal - \u6211\u7684\u5956\u52B1\u5F39\u7A97\u7EC4\u4EF6\n *\n * \u5C55\u793A\u7528\u6237\u5DF2\u83B7\u5F97\u7684\u5956\u52B1\u5217\u8868\n *\n * @module MyRewardsModal\n * @date 2026-01-04\n */\n\n'use client'\n\nimport React, { useState, useRef, useEffect } from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { BaseModal } from './BaseModal.js'\n\nexport type RewardStatus = 'Available' | 'Expired' | 'Used'\n\nexport interface Reward {\n /**\n * \u5956\u52B1 ID\n */\n id: string\n\n /**\n * \u5956\u52B1\u540D\u79F0\n */\n name: string\n\n /**\n * \u4F18\u60E0\u7801\uFF08\u53EF\u9009\uFF09\n */\n code?: string\n\n /**\n * \u72B6\u6001\n */\n status: RewardStatus\n\n /**\n * \u5956\u52B1\u65F6\u95F4\n */\n prizeTime?: string\n\n /**\n * \u662F\u5426\u53EF\u590D\u5236\u7801\n */\n showCopyCode?: boolean\n\n /**\n * \u6BCF\u5956\u52B1\u53EF\u914D\u7F6E\u7684\u663E\u793A\u6587\u6848\uFF08\u8986\u76D6\u5168\u5C40 statusLabel \u6620\u5C04\uFF09\n * @optional\n */\n statusText?: string\n\n /** * \u662F\u5426\u53EF\u7528\n */\n available?: boolean\n}\n\nexport interface MyRewardsModalProps {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"My Rewards\"\n */\n title?: string\n\n /**\n * \u5956\u52B1\u5217\u8868\n */\n rewards: Reward[]\n\n /**\n * \u590D\u5236\u7801\u70B9\u51FB\u56DE\u8C03\n */\n onCopyCode?: (code: string) => void\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n */\n codeText?: string\n\n /**\n * \u590D\u5236\u6309\u94AE\u6587\u672C\n * @default \"COPY\"\n */\n copyText?: string\n\n /**\n * \u590D\u5236\u6210\u529F\u540E\u7684\u6309\u94AE\u6587\u672C\n * @default \"COPIED\"\n */\n copiedText?: string\n\n /**\n * \u5956\u52B1\u65F6\u95F4\u6587\u672C\u524D\u7F00\n * @default \"Prize time:\"\n */\n prizeText?: string\n\n /**\n * \u7A7A\u72B6\u6001\u6587\u6848\n * @default \"No rewards yet\"\n */\n emptyText?: string\n\n /**\n * \
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["jsx", "jsxs", "useState", "useRef", "useEffect", "cn", "BaseModal", "MyRewardsModal", "isOpen", "onClose", "title", "rewards", "onCopyCode", "className", "codeText", "copyText", "copiedText", "prizeText", "emptyText", "copyError", "availableText", "usedStatusText", "expiredText", "notFoundText", "theme", "copiedStates", "setCopiedStates", "copyErrorStates", "setCopyErrorStates", "timersRef", "timer", "handleCopy", "rewardId", "code", "prev", "
|
|
4
|
+
"sourcesContent": ["/**\n * MyRewardsModal - \u6211\u7684\u5956\u52B1\u5F39\u7A97\u7EC4\u4EF6\n *\n * \u5C55\u793A\u7528\u6237\u5DF2\u83B7\u5F97\u7684\u5956\u52B1\u5217\u8868\n *\n * @module MyRewardsModal\n * @date 2026-01-04\n */\n\n'use client'\n\nimport React, { useState, useRef, useEffect } from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { BaseModal } from './BaseModal.js'\n\nexport type RewardStatus = 'Available' | 'Expired' | 'Used'\n\nexport interface Reward {\n /**\n * \u5956\u52B1 ID\n */\n id: string\n\n /**\n * \u5956\u52B1\u540D\u79F0\n */\n name: string\n\n /**\n * \u4F18\u60E0\u7801\uFF08\u53EF\u9009\uFF09\n */\n code?: string\n\n /**\n * \u72B6\u6001\n */\n status: RewardStatus\n\n /**\n * \u5956\u52B1\u65F6\u95F4\n */\n prizeTime?: string\n\n /**\n * \u662F\u5426\u53EF\u590D\u5236\u7801\n */\n showCopyCode?: boolean\n\n /**\n * \u6BCF\u5956\u52B1\u53EF\u914D\u7F6E\u7684\u663E\u793A\u6587\u6848\uFF08\u8986\u76D6\u5168\u5C40 statusLabel \u6620\u5C04\uFF09\n * @optional\n */\n statusText?: string\n\n /** * \u662F\u5426\u53EF\u7528\n */\n available?: boolean\n}\n\nexport interface MyRewardsModalProps {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"My Rewards\"\n */\n title?: string\n\n /**\n * \u5956\u52B1\u5217\u8868\n */\n rewards: Reward[]\n\n /**\n * \u590D\u5236\u7801\u70B9\u51FB\u56DE\u8C03\n */\n onCopyCode?: (code: string) => void\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n */\n codeText?: string\n\n /**\n * \u590D\u5236\u6309\u94AE\u6587\u672C\n * @default \"COPY\"\n */\n copyText?: string\n\n /**\n * \u590D\u5236\u6210\u529F\u540E\u7684\u6309\u94AE\u6587\u672C\n * @default \"COPIED\"\n */\n copiedText?: string\n\n /**\n * \u5956\u52B1\u65F6\u95F4\u6587\u672C\u524D\u7F00\n * @default \"Prize time:\"\n */\n prizeText?: string\n\n /**\n * \u7A7A\u72B6\u6001\u6587\u6848\n * @default \"No rewards yet\"\n */\n emptyText?: string\n\n /**\n * \u590D\u5236\u5931\u8D25\u63D0\u793A\u6587\u6848\n * @optional\n */\n copyError?: string\n\n /**\n * \u53EF\u7528\u72B6\u6001\u6587\u6848\n * @default \"Available\"\n * @optional\n */\n availableText?: string\n\n /**\n * \u5DF2\u4F7F\u7528\u72B6\u6001\u6587\u6848\n * @default \"Used\"\n * @optional\n */\n usedStatusText?: string\n\n /**\n * \u5DF2\u8FC7\u671F\u72B6\u6001\u6587\u6848\n * @default \"Expired\"\n * @optional\n */\n expiredText?: string\n\n /**\n * \u672A\u77E5\u72B6\u6001\u6587\u6848\n * @optional\n */\n notFoundText?: string\n\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @default 'light'\n */\n theme?: 'light' | 'dark'\n}\n\n/**\n * MyRewardsModal \u6211\u7684\u5956\u52B1\u5F39\u7A97\u7EC4\u4EF6\n */\nexport const MyRewardsModal: React.FC<MyRewardsModalProps> = ({\n isOpen,\n onClose,\n title = 'My Rewards',\n rewards,\n onCopyCode,\n className,\n codeText = 'CODE:',\n copyText = 'COPY',\n copiedText = 'COPIED',\n prizeText = 'Prize time:',\n emptyText = 'No rewards yet',\n copyError,\n availableText = 'Available',\n usedStatusText = 'Used',\n expiredText = 'Expired',\n notFoundText,\n theme = 'light',\n}) => {\n const getStatusLabel = (status: RewardStatus): string => {\n switch (status) {\n case 'Available':\n return availableText\n case 'Used':\n return usedStatusText\n case 'Expired':\n return expiredText\n default:\n return notFoundText ?? (status as string)\n }\n }\n\n // \u8FFD\u8E2A\u6BCF\u4E2A\u5956\u52B1\u7684\u590D\u5236\u72B6\u6001\n const [copiedStates, setCopiedStates] = useState<Record<string, boolean>>({})\n const [copyErrorStates, setCopyErrorStates] = useState<Record<string, boolean>>({})\n const timersRef = useRef<Record<string, NodeJS.Timeout>>({})\n\n // \u6E05\u7406\u6240\u6709\u5B9A\u65F6\u5668\n useEffect(() => {\n return () => {\n Object.values(timersRef.current).forEach(timer => clearTimeout(timer))\n }\n }, [])\n\n // \u5904\u7406\u590D\u5236\u64CD\u4F5C\n const handleCopy = async (rewardId: string, code: string) => {\n // \u6E05\u9664\u8BE5\u5956\u52B1\u7684\u73B0\u6709\u5B9A\u65F6\u5668\n if (timersRef.current[rewardId]) {\n clearTimeout(timersRef.current[rewardId])\n }\n\n try {\n await navigator.clipboard.writeText(code)\n // \u8C03\u7528\u590D\u5236\u56DE\u8C03\n onCopyCode?.(code)\n\n // \u8BBE\u7F6E\u4E3A\u5DF2\u590D\u5236\u72B6\u6001\n setCopiedStates(prev => ({ ...prev, [rewardId]: true }))\n setCopyErrorStates(prev => ({ ...prev, [rewardId]: false }))\n\n // 3\u79D2\u540E\u6062\u590D\n timersRef.current[rewardId] = setTimeout(() => {\n setCopiedStates(prev => ({ ...prev, [rewardId]: false }))\n delete timersRef.current[rewardId]\n }, 3000)\n } catch {\n // \u590D\u5236\u5931\u8D25\uFF0C\u663E\u793A\u9519\u8BEF\u72B6\u6001\n setCopyErrorStates(prev => ({ ...prev, [rewardId]: true }))\n setCopiedStates(prev => ({ ...prev, [rewardId]: false }))\n\n // 3\u79D2\u540E\u6062\u590D\n timersRef.current[rewardId] = setTimeout(() => {\n setCopyErrorStates(prev => ({ ...prev, [rewardId]: false }))\n delete timersRef.current[rewardId]\n }, 3000)\n }\n }\n\n return (\n <BaseModal\n isOpen={isOpen}\n onClose={onClose}\n maxWidth=\"max-w-[480px] laptop:max-w-[520px]\"\n background=\"bg-white\"\n className={className}\n title={title}\n ariaLabelledBy=\"rewards-modal-title\"\n theme={theme}\n >\n <div className=\"laptop:px-8 laptop:pb-8 p-4\">\n {/* \u5956\u52B1\u5217\u8868 */}\n <div className=\"flex max-h-[584px] flex-col gap-2 overflow-y-auto\">\n {rewards.length === 0 ? (\n <p className=\"py-8 text-center text-[14px] text-gray-500\">{emptyText}</p>\n ) : (\n rewards.map(reward => (\n <div\n key={reward.id}\n className={cn(\n 'rounded-box',\n 'bg-container-secondary-0 relative flex-none overflow-hidden',\n 'px-4 py-6'\n )}\n >\n <div className=\"tablet:text-[16px] tablet:flex items-center justify-between gap-2 text-[14px] font-[700]\">\n <div className=\"flex-1\">\n <p\n className={cn(\n 'mb-1 font-[700]',\n reward?.available ? 'text-info-primary' : 'text-info-quaternary'\n )}\n >\n {reward.name}\n </p>\n {reward.code && (\n <div\n className={cn(\n 'flex items-center gap-2',\n reward?.available ? 'text-brand-0' : 'text-info-quaternary'\n )}\n >\n <p className=\"max-w-[200px] truncate\">\n {codeText} {reward.code}\n </p>\n {reward.showCopyCode && reward?.available && (\n <button onClick={() => handleCopy(reward.id, reward.code!)} className=\"underline\">\n {copyErrorStates[reward.id]\n ? (copyError ?? 'Copy failed')\n : copiedStates[reward.id]\n ? copiedText\n : copyText}\n </button>\n )}\n </div>\n )}\n </div>\n\n {reward.prizeTime && (\n <div className={cn('tablet:block text-info-quaternary flex gap-1 text-[14px] font-[700]')}>\n <p>{prizeText}</p>\n <p>{reward.prizeTime}</p>\n </div>\n )}\n\n {/* \u72B6\u6001\u6807\u7B7E */}\n <span\n className={cn(\n 'rounded-[0_8px] px-[6px] text-[14px] font-[700]',\n 'absolute right-0 top-0',\n reward?.available ? 'bg-brand-0 text-info-white' : 'bg-info-quaternary text-info-white'\n )}\n >\n {reward.statusText ?? getStatusLabel(reward.status)}\n </span>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </BaseModal>\n )\n}\n\nexport default MyRewardsModal\n"],
|
|
5
|
+
"mappings": "aAiQY,cAAAA,EA4BY,QAAAC,MA5BZ,oBAtPZ,OAAgB,YAAAC,EAAU,UAAAC,EAAQ,aAAAC,MAAiB,QACnD,OAAS,MAAAC,MAAU,yBACnB,OAAS,aAAAC,MAAiB,iBAuJnB,MAAMC,EAAgD,CAAC,CAC5D,OAAAC,EACA,QAAAC,EACA,MAAAC,EAAQ,aACR,QAAAC,EACA,WAAAC,EACA,UAAAC,EACA,SAAAC,EAAW,QACX,SAAAC,EAAW,OACX,WAAAC,EAAa,SACb,UAAAC,EAAY,cACZ,UAAAC,EAAY,iBACZ,UAAAC,EACA,cAAAC,EAAgB,YAChB,eAAAC,EAAiB,OACjB,YAAAC,EAAc,UACd,aAAAC,EACA,MAAAC,EAAQ,OACV,IAAM,CACJ,MAAMC,EAAkBC,GAAiC,CACvD,OAAQA,EAAQ,CACd,IAAK,YACH,OAAON,EACT,IAAK,OACH,OAAOC,EACT,IAAK,UACH,OAAOC,EACT,QACE,OAAOC,GAAiBG,CAC5B,CACF,EAGM,CAACC,EAAcC,CAAe,EAAI1B,EAAkC,CAAC,CAAC,EACtE,CAAC2B,EAAiBC,CAAkB,EAAI5B,EAAkC,CAAC,CAAC,EAC5E6B,EAAY5B,EAAuC,CAAC,CAAC,EAG3DC,EAAU,IACD,IAAM,CACX,OAAO,OAAO2B,EAAU,OAAO,EAAE,QAAQC,GAAS,aAAaA,CAAK,CAAC,CACvE,EACC,CAAC,CAAC,EAGL,MAAMC,EAAa,MAAOC,EAAkBC,IAAiB,CAEvDJ,EAAU,QAAQG,CAAQ,GAC5B,aAAaH,EAAU,QAAQG,CAAQ,CAAC,EAG1C,GAAI,CACF,MAAM,UAAU,UAAU,UAAUC,CAAI,EAExCvB,IAAauB,CAAI,EAGjBP,EAAgBQ,IAAS,CAAE,GAAGA,EAAM,CAACF,CAAQ,EAAG,EAAK,EAAE,EACvDJ,EAAmBM,IAAS,CAAE,GAAGA,EAAM,CAACF,CAAQ,EAAG,EAAM,EAAE,EAG3DH,EAAU,QAAQG,CAAQ,EAAI,WAAW,IAAM,CAC7CN,EAAgBQ,IAAS,CAAE,GAAGA,EAAM,CAACF,CAAQ,EAAG,EAAM,EAAE,EACxD,OAAOH,EAAU,QAAQG,CAAQ,CACnC,EAAG,GAAI,CACT,MAAQ,CAENJ,EAAmBM,IAAS,CAAE,GAAGA,EAAM,CAACF,CAAQ,EAAG,EAAK,EAAE,EAC1DN,EAAgBQ,IAAS,CAAE,GAAGA,EAAM,CAACF,CAAQ,EAAG,EAAM,EAAE,EAGxDH,EAAU,QAAQG,CAAQ,EAAI,WAAW,IAAM,CAC7CJ,EAAmBM,IAAS,CAAE,GAAGA,EAAM,CAACF,CAAQ,EAAG,EAAM,EAAE,EAC3D,OAAOH,EAAU,QAAQG,CAAQ,CACnC,EAAG,GAAI,CACT,CACF,EAEA,OACElC,EAACM,EAAA,CACC,OAAQE,EACR,QAASC,EACT,SAAS,qCACT,WAAW,WACX,UAAWI,EACX,MAAOH,EACP,eAAe,sBACf,MAAOc,EAEP,SAAAxB,EAAC,OAAI,UAAU,8BAEb,SAAAA,EAAC,OAAI,UAAU,oDACZ,SAAAW,EAAQ,SAAW,EAClBX,EAAC,KAAE,UAAU,6CAA8C,SAAAkB,EAAU,EAErEP,EAAQ,IAAI0B,GACVrC,EAAC,OAEC,UAAWK,EACT,cACA,8DACA,WACF,EAEA,SAAAJ,EAAC,OAAI,UAAU,2FACb,UAAAA,EAAC,OAAI,UAAU,SACb,UAAAD,EAAC,KACC,UAAWK,EACT,kBACAgC,GAAQ,UAAY,oBAAsB,sBAC5C,EAEC,SAAAA,EAAO,KACV,EACCA,EAAO,MACNpC,EAAC,OACC,UAAWI,EACT,0BACAgC,GAAQ,UAAY,eAAiB,sBACvC,EAEA,UAAApC,EAAC,KAAE,UAAU,yBACV,UAAAa,EAAS,IAAEuB,EAAO,MACrB,EACCA,EAAO,cAAgBA,GAAQ,WAC9BrC,EAAC,UAAO,QAAS,IAAMiC,EAAWI,EAAO,GAAIA,EAAO,IAAK,EAAG,UAAU,YACnE,SAAAR,EAAgBQ,EAAO,EAAE,EACrBlB,GAAa,cACdQ,EAAaU,EAAO,EAAE,EACpBrB,EACAD,EACR,GAEJ,GAEJ,EAECsB,EAAO,WACNpC,EAAC,OAAI,UAAWI,EAAG,qEAAqE,EACtF,UAAAL,EAAC,KAAG,SAAAiB,EAAU,EACdjB,EAAC,KAAG,SAAAqC,EAAO,UAAU,GACvB,EAIFrC,EAAC,QACC,UAAWK,EACT,kDACA,yBACAgC,GAAQ,UAAY,6BAA+B,oCACrD,EAEC,SAAAA,EAAO,YAAcZ,EAAeY,EAAO,MAAM,EACpD,GACF,GAzDKA,EAAO,EA0Dd,CACD,EAEL,EACF,EACF,CAEJ,EAEA,IAAOC,EAAQ/B",
|
|
6
|
+
"names": ["jsx", "jsxs", "useState", "useRef", "useEffect", "cn", "BaseModal", "MyRewardsModal", "isOpen", "onClose", "title", "rewards", "onCopyCode", "className", "codeText", "copyText", "copiedText", "prizeText", "emptyText", "copyError", "availableText", "usedStatusText", "expiredText", "notFoundText", "theme", "getStatusLabel", "status", "copiedStates", "setCopiedStates", "copyErrorStates", "setCopyErrorStates", "timersRef", "timer", "handleCopy", "rewardId", "code", "prev", "reward", "MyRewardsModal_default"]
|
|
7
7
|
}
|
|
@@ -587,15 +587,6 @@ export interface ErrorModalConfig {
|
|
|
587
587
|
}
|
|
588
588
|
/**
|
|
589
589
|
* 未中奖 / Try Again 弹窗配置(来自 CMS tryAgain group)
|
|
590
|
-
*
|
|
591
|
-
* @example
|
|
592
|
-
* ```tsx
|
|
593
|
-
* const tryAgainConfig: TryAgainConfig = {
|
|
594
|
-
* title: 'Better Luck Next Time!',
|
|
595
|
-
* message: "Don't give up! You still have more chances to win.",
|
|
596
|
-
* confirmText: 'Try Again'
|
|
597
|
-
* }
|
|
598
|
-
* ```
|
|
599
590
|
*/
|
|
600
591
|
export interface TryAgainConfig {
|
|
601
592
|
/** 未中奖弹窗标题 @optional */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/biz-components/LotteryShared/types.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * \u62BD\u5956\u7EC4\u4EF6\u5171\u4EAB\u7C7B\u578B\u5B9A\u4E49\n *\n * \u5305\u542B\u6240\u6709\u62BD\u5956\u7EC4\u4EF6\uFF08WheelLottery, ProductLottery \u7B49\uFF09\u5171\u7528\u7684\u7C7B\u578B\u3001\u63A5\u53E3\u548C\u5E38\u91CF\u3002\n *\n * @module LotterySharedTypes\n * @date 2026-04-07\n */\n\nimport type { Theme, Img } from '../../types/props.js'\nimport type { SerializedEditorState, SerializedLexicalNode } from '@payloadcms/richtext-lexical/lexical'\n\n// Re-export Theme and Img for convenience\nexport type { Theme, Img }\n\n// ============================================================================\n// \u6838\u5FC3\u5B9E\u4F53\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u5956\u54C1\uFF08Prize\uFF09\n *\n * \u4EE3\u8868\u62BD\u5956\u6D3B\u52A8\u4E2D\u7684\u4E00\u4E2A\u5956\u54C1\uFF0C\u5305\u542B\u663E\u793A\u6240\u9700\u7684\u6240\u6709\u4FE1\u606F\u3002\n *\n * @example\n * ```tsx\n * const prize: Prize = {\n * prizeKey: 'prize-001',\n * name: 'Anker Prime Charger (100W, 3 Ports, GaN)',\n * image: { url: 'https://images.unsplash.com/photo-123', alt: 'Charger' },\n * rank: '1st',\n * price: '$79.99'\n * }\n * ```\n */\nexport interface Prize {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\uFF0C\u7528\u4E8E React key \u548C\u4E2D\u5956\u7ED3\u679C\u5339\u914D\n */\n prizeKey: string\n\n /**\n * \u5956\u54C1\u540D\u79F0\uFF0C\u663E\u793A\u5728\u8F6C\u76D8\u548C\u5956\u6C60\u4E2D\n * @maxLength 100\n */\n name: string\n\n /**\n * \u5956\u54C1\u56FE\u7247\u5BF9\u8C61\uFF0C\u5305\u542B url \u548C alt\n */\n image: Img\n\n /**\n * \u6392\u540D\u6807\u8BC6\uFF0C\u4EC5\u5728 Prize Pool \u4E2D\u663E\u793A\n * @optional\n */\n rank?: '1st' | '2nd' | '3rd'\n\n /**\n * \u4EF7\u683C\u6216\u6298\u6263\u4FE1\u606F\uFF0C\u663E\u793A\u5728\u5956\u6C60\u4E2D\n * @example \"$99.99\" | \"12% Off\"\n * @optional\n */\n price?: string\n\n /** \u5956\u54C1\u7EF4\u5EA6\u7684\u4E2D\u5956\u5F39\u7A97\u8986\u76D6\u914D\u7F6E\uFF1B\u672A\u914D\u7F6E\u65F6\u7531\u63A5\u5165\u5C42\u56DE\u9000\u5230\u5168\u5C40\u914D\u7F6E */\n winnerModalConfig?: {\n winnerNote?: string\n confirmText?: string\n confirmUrl?: string\n learnMoreUrl?: string\n learnMoreText?: string\n }\n}\n\n/**\n * \u4E2D\u5956\u4FE1\u606F\uFF08WinningInfo\uFF09\n *\n * \u4EE3\u8868\u4E00\u6761\u4E2D\u5956\u8BB0\u5F55\uFF0C\u7528\u4E8E\u5E95\u90E8\u6EDA\u52A8\u6761\u5C55\u793A\uFF0C\u8425\u9020\u6D3B\u52A8\u6C1B\u56F4\u3002\n *\n * @example\n * ```tsx\n * const winningInfo: WinningInfo = {\n * winningKey: 'win-001',\n * userName: 'Shuqi***',\n * prizeName: '12% Off Discount',\n * timestamp: 1702800000000\n * }\n * ```\n */\nexport interface WinningInfo {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\n */\n winningKey: string\n\n /**\n * \u7528\u6237\u540D\uFF08\u5DF2\u8131\u654F\uFF09\uFF0C\u5982 \"Shuqi***\"\n * @note \u5047\u8BBE\u4F20\u5165\u7684\u7528\u6237\u540D\u5DF2\u7ECF\u8FC7\u8131\u654F\u5904\u7406\uFF0C\u7EC4\u4EF6\u5185\u90E8\u4E0D\u518D\u5904\u7406\n */\n userName: string\n\n /**\n * \u4E2D\u5956\u5956\u54C1\u540D\u79F0\n */\n prizeName: string\n\n /**\n * \u4E2D\u5956\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n * @optional\n */\n timestamp?: number\n}\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u7C7B\u578B\n */\nexport type ChanceMethodType = 'share' | 'points' | 'refer' | string\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u72B6\u6001\n */\nexport type ChanceMethodStatus = 'pending' | 'completed' | 'used'\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\uFF08ChanceMethod\uFF09\n *\n * \u4EE3\u8868\u4E00\u79CD\u83B7\u53D6\u62BD\u5956\u673A\u4F1A\u7684\u65B9\u5F0F\uFF0C\u652F\u6301\u7075\u6D3B\u914D\u7F6E\uFF08\u5206\u4EAB\u3001\u79EF\u5206\u3001\u63A8\u8350\u7B49\uFF09\u3002\n *\n * @example\n * ```tsx\n * const chanceMethod: ChanceMethod = {\n * methodKey: 'share-001',\n * type: 'share',\n * title: 'Share on your socials',\n * description: 'Share this event on your social media',\n * buttonText: 'Redeem now',\n * onClick: () => console.log('Share clicked'),\n * disabled: false,\n * status: 'pending'\n * }\n * ```\n */\nexport interface ChanceMethod {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\n */\n methodKey: string\n\n /**\n * \u65B9\u5F0F\u7C7B\u578B\uFF0C\u652F\u6301\u9884\u5B9A\u4E49\u7C7B\u578B\uFF08'share', 'points', 'refer'\uFF09\u6216\u81EA\u5B9A\u4E49\u7C7B\u578B\n */\n type: ChanceMethodType\n\n /**\n * \u65B9\u5F0F\u6807\u9898\uFF0C\u5982 \"Share on your socials\"\n */\n title: string\n\n /**\n * \u8BE6\u7EC6\u8BF4\u660E\u6587\u5B57\n */\n description: string\n\n /**\n * \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 \"Redeem now\"\n * @default \"Redeem now\"\n * @optional\n */\n buttonText?: string\n\n completed?: string\n\n used?: string\n\n /**\n * \u672A\u767B\u5F55\u65F6\u70B9\u51FB GO \u6309\u94AE\u7684\u56DE\u8C03\n * @example\n * ```tsx\n * onLoginRequired={() => {\n * // \u6253\u5F00\u767B\u5F55\u5F39\u7A97\u6216\u8DF3\u8F6C\u767B\u5F55\u9875\n * router.push('/login')\n * }}\n * ```\n */\n onLoginRequired?: () => void\n\n /**\n * \u70B9\u51FB\u6309\u94AE\u65F6\u7684\u56DE\u8C03\u51FD\u6570\n * @note \u4E1A\u52A1\u903B\u8F91\uFF08\u5982\u79EF\u5206\u6263\u9664\u3001\u5206\u4EAB\u9A8C\u8BC1\uFF09\u7531\u7236\u7EC4\u4EF6\u5904\u7406\n */\n onClick: () => void\n\n /**\n * \u662F\u5426\u7981\u7528\u8BE5\u65B9\u5F0F\n * @default false\n * @optional\n */\n disabled?: boolean\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u7684\u72B6\u6001\n * - pending: \u672A\u5B8C\u6210\uFF08\u9ED8\u8BA4\u72B6\u6001\uFF09\n * - completed: \u5DF2\u5B8C\u6210/\u5DF2\u83B7\u5F97\n * - used: \u5DF2\u4F7F\u7528\n * @default \"pending\"\n * @optional\n */\n status?: ChanceMethodStatus\n\n /**\n * \u662F\u5426\u663E\u793A\u52A0\u8F7D\u72B6\u6001\n * @default false\n * @optional\n */\n loading?: boolean\n\n /**\n * \u662F\u5426\u5728\u70B9\u51FB\u65F6\u6253\u5F00\u5206\u4EAB\u5F39\u7A97\n * @default false\n * @optional\n */\n openShareModal?: boolean\n}\n\n/**\n * \u7528\u6237\u6570\u636E\uFF08UserData\uFF09\n *\n * \u4EE3\u8868\u5F53\u524D\u7528\u6237\u7684\u62BD\u5956\u76F8\u5173\u6570\u636E\n *\n * @example\n * ```tsx\n * const userData: UserData = {\n * isLoggedIn: true,\n * availableChances: 3,\n * wonPrizes: [\n * { id: 'prize-001', name: 'Charger', image: 'https://...', timestamp: 1702800000000 }\n * ]\n * }\n * ```\n */\nexport interface UserData {\n /**\n * \u7528\u6237\u662F\u5426\u5DF2\u767B\u5F55\n */\n isLoggedIn: boolean\n\n /**\n * \u5F53\u524D\u53EF\u4F7F\u7528\u7684\u62BD\u5956\u6B21\u6570\n * @default 0\n */\n availableChances: number\n\n /**\n * \u603B\u673A\u4F1A\u6570\uFF08\u7528\u4E8E\u663E\u793A\u8FDB\u5EA6\uFF0C\u4F8B\u5982 \"3/5\"\uFF09\n * @default undefined\n * @optional\n */\n totalChances?: number\n\n /**\n * \u5DF2\u83B7\u5F97\u7684\u5956\u54C1\u5217\u8868\n * @optional\n */\n wonPrizes?: Array<Prize & { timestamp?: number }>\n\n /** * \u7528\u6237\u7535\u5B50\u90AE\u7BB1\uFF08\u53EF\u9009\uFF0C\u7528\u4E8E\u53D1\u9001\u4E2D\u5956\u901A\u77E5\u7B49\uFF09\n * @optional\n */\n email?: string\n\n /**\n * \u673A\u4F1A\u6570\u636E\u662F\u5426\u6B63\u5728\u52A0\u8F7D\u4E2D\n * @optional\n */\n isChancesLoading?: boolean\n}\n\n/**\n * \u7F13\u52A8\u51FD\u6570\u7C7B\u578B\n */\nexport type EasingFunction = 'ease-out' | 'ease-in-out' | 'linear'\n\n// ============================================================================\n// \u516C\u5171\u6587\u6848\u914D\u7F6E\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u590D\u5236\u64CD\u4F5C\u76F8\u5173\u6587\u6848\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n * \u7528\u4E8E\u6240\u6709\u5305\u542B\u590D\u5236\u529F\u80FD\u7684\u7EC4\u4EF6\n */\nexport interface CopyTextConfig {\n /**\n * \u590D\u5236\u6309\u94AE\u6587\u672C\n * @default \"COPY\"\n */\n copyText?: string\n\n /**\n * \u590D\u5236\u6210\u529F\u540E\u7684\u6309\u94AE\u6587\u672C\n * @default \"COPIED\"\n */\n copiedText?: string\n}\n\n/**\n * \u4F18\u60E0\u7801\u76F8\u5173\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n * \u7528\u4E8E\u6240\u6709\u5C55\u793A\u4F18\u60E0\u7801\u7684\u7EC4\u4EF6\n */\nexport interface CouponConfig {\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n */\n codeText?: string\n\n /**\n * \u4F18\u60E0\u7801\n */\n couponCode?: string\n\n /**\n * \u4F18\u60E0\u7801\u8FC7\u671F\u65F6\u95F4\n */\n expiresAt?: string\n\n /**\n * \u6709\u6548\u671F\u6807\u7B7E\u6587\u6848\n * @default \"Valid until:\"\n */\n expiresAtLabel?: string\n\n /**\n * \u4F18\u60E0\u5238\u6298\u6263\u6587\u672C\uFF08\u4F8B\u5982 \"20%\"\uFF09\n */\n couponDiscount?: string\n\n /**\n * \u4F18\u60E0\u5238\u5355\u4F4D\u6587\u672C\n * @default \"Off\"\n */\n couponUnit?: string\n}\n\n/**\n * \u5956\u52B1\u65F6\u95F4\u6587\u6848\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n */\nexport interface PrizeTimeTextConfig {\n /**\n * \u5956\u52B1\u65F6\u95F4\u6587\u672C\u524D\u7F00\n * @default \"Prize time:\"\n */\n prizeText?: string\n}\n\n/**\n * \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\uFF08WinnerModalConfig\uFF09\n *\n * \u7528\u4E8E\u914D\u7F6E\u4E2D\u5956\u5F39\u7A97\u7684\u5C55\u793A\u5185\u5BB9\uFF0C\u901A\u5E38\u7531\u62BD\u5956\u63A5\u53E3\u8FD4\u56DE\u63D0\u4F9B\n *\n * @example\n * ```tsx\n * const winnerModalConfig: WinnerModalConfig = {\n * title: 'Congratulations!',\n * prizeTitle: 'Anker Prime Charger',\n * prizeImage: 'https://...',\n * prizeDescription: 'High-speed charging for all your devices',\n * learnMoreUrl: 'https://...',\n * learnMoreText: 'View Details',\n * couponCode: 'ANKER2024',\n * expiresAt: '2024-12-31',\n * couponDiscount: '20%',\n * couponUnit: 'Off',\n * confirmText: 'Claim Now'\n * }\n * ```\n */\nexport interface WinnerModalConfig extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {\n /**\n * \u4E2D\u5956\u5F39\u7A97\u6807\u9898\n * @default \"You Have Won\"\n * @optional\n */\n title?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u6807\u9898\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E prize.name\uFF09\n * @optional\n */\n prizeTitle?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u56FE\u7247 URL\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E prize.image\uFF09\n * @optional\n */\n prizeImage?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\n * @deprecated \u8BED\u4E49\u4E0D\u660E\u786E\uFF0C\u8BF7\u6539\u7528 `winnerNote`\uFF08code/copy \u4E0B\u65B9\u4E13\u7528\u8BF4\u660E\u6587\u5B57\uFF09\n * @optional\n */\n prizeDescription?: string\n\n /**\n * code/copy \u533A\u57DF\u6B63\u4E0B\u65B9\u7684\u4E13\u7528\u8BF4\u660E\u6587\u5B57\u3002\n * \u4EC5\u5728\u660E\u786E\u914D\u7F6E\u65F6\u5C55\u793A\uFF1B\u672A\u914D\u7F6E\u65F6\u4E0D\u6E32\u67D3\u4EFB\u4F55\u5185\u5BB9\u3002\n * \u4F18\u5148\u7EA7\u9AD8\u4E8E `prizeDescription`\u3002\n * @optional\n */\n winnerNote?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97 Learn More \u94FE\u63A5\n * @optional\n */\n learnMoreUrl?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97 Learn More \u6309\u94AE\u6587\u672C\n * @default \"Learn More\"\n * @optional\n */\n learnMoreText?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"Okay, Got It\"\n * @optional\n */\n confirmText?: string\n\n /** \u786E\u8BA4\u6309\u94AE\u8DF3\u8F6C\u94FE\u63A5\uFF0C\u914D\u7F6E\u540E\u70B9\u51FB\u6309\u94AE\u5C06\u5728\u65B0\u6807\u7B7E\u9875\u6253\u5F00\u6B64\u94FE\u63A5 @optional */\n confirmUrl?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u6848\u522B\u540D\uFF08\u6765\u81EA CMS winningInfos.confirmButton\uFF0C\u7B49\u540C\u4E8E confirmText\uFF09\n * \u5F53\u540C\u65F6\u63D0\u4F9B\u65F6\uFF0CconfirmButton \u4F18\u5148\u7EA7\u9AD8\u4E8E confirmText\n * @optional\n */\n confirmButton?: string\n}\n\n/**\n * Rules \u5F39\u7A97\u914D\u7F6E\n *\n * @example\n * ```tsx\n * rulesModalConfig={{\n * rulesData: [\n * { item: '$100 instead of $200, 10 tickets/day.' },\n * { item: '$100 for $120, 50 tickets/day.' }\n * ],\n * rulesText: 'Game Rules',\n * rulesTitle: 'Activity Rules'\n * }}\n * ```\n */\nexport interface RulesModalConfig {\n /**\n * \u89C4\u5219\u6570\u636E\u5217\u8868\n * @optional\n */\n rulesData?: Array<{\n /**\n * \u89C4\u5219\u9879\u5185\u5BB9\n */\n item: string\n }>\n\n /**\n * Rules \u6309\u94AE\u6587\u672C\n * @default \"Rules\"\n * @optional\n */\n rulesText?: string\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Rules\"\n * @optional\n */\n rulesTitle?: string\n}\n\n/**\n * ProductLottery \u9876\u680F\u53F3\u4FA7\u8DF3\u8F6C\u6309\u94AE\u914D\u7F6E\n */\nexport interface ActionButtonConfig {\n /**\n * \u6309\u94AE\u6587\u672C\uFF1B\u4E3A\u7A7A\u65F6\u4E0D\u5C55\u793A\n */\n text?: string\n\n /**\n * \u8DF3\u8F6C\u94FE\u63A5\uFF1B\u4E3A\u7A7A\u65F6\u4E0D\u5C55\u793A\n */\n url?: string\n}\n\n/**\n * My Rewards \u5F39\u7A97\u914D\u7F6E\n *\n * @example\n * ```tsx\n * myRewardsModalConfig={{\n * rewardsData: [\n * {\n * id: '1',\n * name: 'Anker Charger',\n * code: 'ANKER2024',\n * status: 'Available',\n * prizeTime: '2024-01-01',\n * showCopyCode: true\n * }\n * ],\n * myRewardsText: 'My Prizes',\n * codeText: 'CODE:',\n * copyText: 'COPY',\n * prizeText: 'Prize time:',\n * emptyText: 'No rewards yet'\n * }}\n * ```\n */\nexport interface MyRewardsModalConfig extends CopyTextConfig, PrizeTimeTextConfig {\n /**\n * \u5956\u52B1\u6570\u636E\u5217\u8868\n * @optional\n */\n rewardsData?: Array<{\n /**\n * \u5956\u52B1 ID\n */\n id: string\n /**\n * \u5956\u52B1\u540D\u79F0\n */\n name: string\n /**\n * \u4F18\u60E0\u7801\uFF08\u53EF\u9009\uFF09\n */\n code?: string\n /**\n * \u72B6\u6001\n */\n status: 'Available' | 'Expired' | 'Used'\n /**\n * \u5956\u52B1\u65F6\u95F4\n */\n prizeTime?: string\n /**\n * \u662F\u5426\u53EF\u590D\u5236\u7801\n */\n showCopyCode?: boolean\n /**\n * \u6BCF\u5956\u52B1\u53EF\u914D\u7F6E\u7684\u663E\u793A\u6587\u6848\uFF08\u8986\u76D6\u5168\u5C40 status label \u6620\u5C04\uFF09\n * @optional\n */\n statusText?: string\n\n /**\n * \u662F\u5426\u53EF\u7528\uFF08\u7528\u4E8E\u63A7\u5236\u989C\u8272\u548C\u590D\u5236\u6309\u94AE\u72B6\u6001\uFF09\n * @optional\n */\n available?: boolean\n }>\n\n /**\n * My Rewards \u6309\u94AE\u6587\u672C\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsText?: string\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsTitle?: string\n\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n * @optional\n */\n codeText?: string\n\n /**\n * \u7A7A\u72B6\u6001\u63D0\u793A\u6587\u672C\n * @default \"No rewards yet\"\n * @optional\n */\n emptyText?: string\n\n /**\n * \u590D\u5236\u5931\u8D25\u63D0\u793A\u6587\u6848\n * @optional\n */\n copyError?: string\n\n /**\n * \u53EF\u7528\u72B6\u6001\u6587\u6848\n * @default \"Available\"\n * @optional\n */\n availableText?: string\n\n /**\n * \u5DF2\u4F7F\u7528\u72B6\u6001\u6587\u6848\n * @default \"Used\"\n * @optional\n */\n usedStatusText?: string\n\n /**\n * \u5DF2\u8FC7\u671F\u72B6\u6001\u6587\u6848\n * @default \"Expired\"\n * @optional\n */\n expiredText?: string\n\n /**\n * \u672A\u77E5\u72B6\u6001\u6587\u6848\n * @optional\n */\n notFoundText?: string\n}\n\n/**\n * \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\n * @example\n * ```tsx\n * errorModalConfig={{\n * title: 'Oops!',\n * message: 'Something went wrong during the lottery process.',\n * confirmText: 'OK, I get'\n * }}\n * ```\n */\nexport interface ErrorModalConfig {\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Oops!\"\n * @optional\n */\n title?: string\n /**\n * \u9519\u8BEF\u6D88\u606F\u5185\u5BB9\n * @default \"Something went wrong during the lottery process.\"\n * @optional\n */\n message?: string\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"OK, I get\"\n * @optional\n */\n confirmText?: string\n /** \u5151\u6362\u5931\u8D25\u65F6\u663E\u793A\u7684\u5F39\u7A97\u6807\u9898\uFF08\u6765\u81EA CMS error.exchangeFailedTitle\uFF09 @optional */\n exchangeFailedTitle?: string\n /** \u5151\u6362\u5931\u8D25\u65F6\u663E\u793A\u7684\u9519\u8BEF\u6D88\u606F\uFF08\u6765\u81EA CMS error.exchangeFailedMessage\uFF09 @optional */\n exchangeFailedMessage?: string\n}\n\n/**\n * \u672A\u4E2D\u5956 / Try Again \u5F39\u7A97\u914D\u7F6E\uFF08\u6765\u81EA CMS tryAgain group\uFF09\n *\n * @example\n * ```tsx\n * const tryAgainConfig: TryAgainConfig = {\n * title: 'Better Luck Next Time!',\n * message: \"Don't give up! You still have more chances to win.\",\n * confirmText: 'Try Again'\n * }\n * ```\n */\nexport interface TryAgainConfig {\n /** \u672A\u4E2D\u5956\u5F39\u7A97\u6807\u9898 @optional */\n title?: string\n /** \u672A\u4E2D\u5956\u5F39\u7A97\u6D88\u606F\u5185\u5BB9 @optional */\n message?: string\n /** \u786E\u8BA4\u6309\u94AE\u6587\u6848 @optional */\n confirmText?: string\n}\n\n/**\n * \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\uFF08CMS: error group\uFF09\n */\nexport interface ErrorConfig {\n title?: string\n defaultMessage?: string\n confirmButton?: string\n exchangeFailedTitle?: string\n exchangeFailedMessage?: string\n}\n\n/**\n * \u793E\u4EA4\u5E73\u53F0\u7C7B\u578B\n */\nexport type SocialPlatform = 'facebook' | 'twitter' | 'instagram' | 'linkedin' | 'tiktok' | 'youtube'\n\n/**\n * \u793E\u4EA4\u5E73\u53F0\u914D\u7F6E\n */\nexport interface SharePlatformConfig {\n /**\n * \u5E73\u53F0\u7C7B\u578B\n */\n platform: SocialPlatform\n\n /**\n * \u5E73\u53F0\u540D\u79F0\n */\n name: string\n\n /**\n * \u5206\u4EAB URL\uFF08\u53EF\u9009\uFF0C\u5982\u679C\u63D0\u4F9B\u5219\u76F4\u63A5\u8DF3\u8F6C\uFF09\n */\n url?: string\n\n /**\n * \u70B9\u51FB\u56DE\u8C03\uFF08\u5982\u679C\u63D0\u4F9B url \u5219\u6B64\u56DE\u8C03\u4F1A\u5728\u8DF3\u8F6C\u524D\u6267\u884C\uFF09\n */\n onClick?: () => void\n\n /**\n * \u662F\u5426\u7981\u7528\n */\n disabled?: boolean\n}\n\n/**\n * \u5206\u4EAB\u5F39\u7A97\u914D\u7F6E\n */\nexport interface ShareModalConfig {\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Share to Get More Chances\"\n */\n title?: string\n\n /**\n * \u526F\u6807\u9898/\u5F15\u5BFC\u6587\u6848\n * @default \"Share to Play Again Keep Trying! You Could Still Win Big!\"\n */\n subtitle?: string\n\n /**\n * \u5E95\u90E8\u63D0\u793A\u6587\u6848\n * @default \"Note: Maximum of 3 times per participant.\"\n */\n note?: string\n\n /**\n * \u793E\u4EA4\u5E73\u53F0\u914D\u7F6E\u5217\u8868\n */\n platforms?: SharePlatformConfig[]\n\n /**\n * \u5206\u4EAB\u6210\u529F\u56DE\u8C03\n */\n onShareSuccess?: (platform: SocialPlatform) => void\n}\n\n// ============================================================================\n// \u5B50\u7EC4\u4EF6 Props \u63A5\u53E3\n// ============================================================================\n\n/**\n * PrizePool \u5956\u54C1\u6C60\u7EC4\u4EF6 Props\n */\nexport interface PrizePoolProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * \u5956\u54C1\u5217\u8868(\u901A\u5E38\u662F\u5168\u90E8 8 \u4E2A\u5956\u54C1)\n */\n prizes: Prize[]\n\n /**\n * \u6807\u9898\u6587\u672C\n * @default \"Prize Pool\"\n */\n title?: string\n\n /**\n * \u4E2D\u5956\u4EBA\u540D\u5355\u6570\u636E\n * @optional\n */\n winningInfos?: WinningInfo[]\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u4E2D\u5956\u6EDA\u52A8 Ticker \u6587\u6848\u6A21\u677F\n * \u652F\u6301\u53D8\u91CF\uFF1A{{name}} \u83B7\u5956\u8005\u6635\u79F0\uFF0C{{prize}} \u5956\u54C1\u540D\u79F0\n * @default \"{{name}} just won {{prize}}!\"\n * @optional\n */\n winnerNameTemplate?: string\n}\n\n/** \u6D3B\u52A8\u673A\u5236\u6A21\u5F0F */\nexport type ChanceMechanismType = 'methods' | 'input'\n\n/** \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u4EC5 mechanismType='input' \u65F6\u4F7F\u7528\uFF09 */\nexport interface ChanceInputConfig {\n /** \u8F93\u5165\u6846\u5360\u4F4D\u6587\u672C @default \"Enter your order number\" */\n placeholder?: string\n /** \u63D0\u4EA4\u6309\u94AE\u6587\u6848 @default \"Spin and Win\" */\n submitText?: string\n /** \u8F93\u5165\u503C\u63D0\u4EA4\u56DE\u8C03 */\n onSubmit?: (value: string) => void | Promise<void>\n /** \u662F\u5426\u6B63\u5728\u63D0\u4EA4 */\n isSubmitting?: boolean\n /** \u8F93\u5165\u6846\u7C7B\u578B @default \"text\" */\n inputType?: 'text' | 'email' | 'number'\n /** \u9A8C\u8BC1\u6B63\u5219 (\u53EF\u9009) */\n validationPattern?: string\n /** \u9A8C\u8BC1\u5931\u8D25\u63D0\u793A\u6587\u6848 */\n validationErrorText?: string\n /** \u8F93\u5165\u6846\u9ED8\u8BA4\u503C\uFF08\u5982\u767B\u5F55\u7528\u6237 email\uFF0C\u652F\u6301\u5F02\u6B65\u586B\u5145\uFF09 @optional */\n defaultValue?: string\n\n /** \u63A5\u5165\u65B9\u6309\u9700\u7981\u7528\u8F93\u5165\u6846\u5185\u5BB9\u66F4\u6539 */\n disabled?: boolean\n\n /** \u662F\u5426\u7981\u6B62\u6D4F\u89C8\u5668\u81EA\u52A8\u586B\u5145\uFF08\u5C24\u5176\u662F email \u81EA\u52A8\u586B\u5145\uFF09 */\n disableAutofill?: boolean\n\n /** \u534F\u8BAE\u544A\u77E5\u5BCC\u6587\u672C\uFF1B\u914D\u7F6E\u65F6\u624D\u5C55\u793A\u534F\u8BAE\u52FE\u9009 UI */\n agreementNotice?: string | SerializedEditorState<SerializedLexicalNode>\n\n /** \u534F\u8BAE\u672A\u52FE\u9009\u65F6\u7684\u63D0\u793A\u6587\u6848\uFF1B\u914D\u7F6E\u534F\u8BAE\u540E\u70B9\u51FB\u63D0\u4EA4\u4F46\u672A\u52FE\u9009\u65F6\u5C55\u793A */\n agreementWarningText?: string\n\n /** \u8F93\u5165\u6A21\u5F0F\u63D0\u4EA4\u6309\u94AE\u70B9\u51FB\u57CB\u70B9\uFF1Adata-headless-type-name */\n submitTrackTypeName?: string\n\n /** \u8F93\u5165\u6A21\u5F0F\u63D0\u4EA4\u6309\u94AE\u70B9\u51FB\u57CB\u70B9\uFF1Adata-headless-title-desc-button */\n submitTrackTitleDescButton?: string\n}\n\n/**\n * ChanceMethods \u83B7\u53D6\u673A\u4F1A\u7EC4\u4EF6 Props\n */\nexport interface ChanceMethodsProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5217\u8868\n */\n methods: ChanceMethod[]\n\n /**\n * \u6807\u9898\u6587\u672C\n * @default \"Want more chances to win?\"\n */\n title?: string\n\n /**\n * \u526F\u6807\u9898(\u53EF\u9009)\n */\n subtitle?: string\n\n /**\n * \u5E95\u90E8\u63D0\u793A\u6587\u672C(\u53EF\u9009)\n */\n footerNote?: string\n\n /**\n * \u767B\u5F55\u7528\u6237\u6570\u636E\uFF08\u53EF\u9009\uFF09\n * @optional\n */\n userData?: UserData\n\n /**\n * \u6253\u5F00\u5206\u4EAB\u5F39\u7A97\u56DE\u8C03\uFF08\u53EF\u9009\uFF09\n * @optional\n */\n onOpenShareModal?: () => void\n\n /**\n * \u5FBD\u7AE0\u6587\u6848\n * @default \"Chance +1\"\n */\n chanceBadgeText?: string\n\n /**\n * \u5DF2\u5B8C\u6210\u72B6\u6001\u6587\u6848\n * @default \"Completed\"\n */\n completedText?: string\n\n /**\n * \u5DF2\u4F7F\u7528\u72B6\u6001\u6587\u6848\n * @default \"Used\"\n */\n usedText?: string\n\n /**\n * \u52A0\u8F7D\u4E2D\u6587\u6848\n * @default \"Loading...\"\n */\n loadingText?: string\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /** \u6D3B\u52A8\u673A\u5236\u6A21\u5F0F @default 'methods' */\n mechanismType?: ChanceMechanismType\n /** \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u4EC5 mechanismType='input' \u65F6\u4F7F\u7528\uFF09 */\n inputConfig?: ChanceInputConfig\n\n /** \u534F\u8BAE\u662F\u5426\u5DF2\u52FE\u9009\uFF08\u4F9B\u5916\u5C42\u7EDF\u4E00\u63A7\u5236\u5DE6\u53F3\u4E24\u4FA7\u62BD\u5956\u5165\u53E3\uFF09 */\n isAgreementChecked?: boolean\n\n /** \u534F\u8BAE\u52FE\u9009\u72B6\u6001\u53D8\u66F4\u56DE\u8C03 */\n onAgreementCheckedChange?: (checked: boolean) => void\n\n /** \u5916\u5C42\u6CE8\u5165\u7684\u534F\u8BAE\u63D0\u793A\u6587\u6848\uFF08\u7528\u4E8E\u7EDF\u4E00\u62E6\u622A\u5DE6\u53F3\u4E24\u4FA7\u62BD\u5956\u5165\u53E3\u65F6\u5C55\u793A\u5728\u6309\u94AE\u4E0B\u65B9\uFF09 */\n agreementErrorText?: string\n}\n\n/**\n * WinnerModal \u4E2D\u5956\u5F39\u7A97\u7EC4\u4EF6 Props\n */\nexport interface WinnerModalProps extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u4E2D\u5956\u5956\u54C1\u4FE1\u606F\n */\n prize: Prize | null\n\n /**\n * \u5F39\u7A97\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"You Have Won\"\uFF09\n */\n title?: string\n\n /**\n * \u5956\u54C1\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4F7F\u7528 prize.name\uFF09\n */\n prizeTitle?: string\n\n /**\n * \u5956\u54C1\u56FE\u7247 URL\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4F7F\u7528 prize.image\uFF09\n */\n prizeImage?: string\n\n /**\n * \u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09\n * @deprecated \u8BED\u4E49\u4E0D\u660E\u786E\uFF0C\u8BF7\u6539\u7528 `winnerNote`\uFF08code/copy \u4E0B\u65B9\u4E13\u7528\u8BF4\u660E\u6587\u5B57\uFF09\n */\n prizeDescription?: string\n\n /**\n * code/copy \u533A\u57DF\u6B63\u4E0B\u65B9\u7684\u4E13\u7528\u8BF4\u660E\u6587\u5B57\u3002\n * \u4EC5\u5728\u660E\u786E\u914D\u7F6E\u65F6\u5C55\u793A\uFF1B\u672A\u914D\u7F6E\u65F6\u4E0D\u6E32\u67D3\u4EFB\u4F55\u5185\u5BB9\u3002\n * \u4F18\u5148\u7EA7\u9AD8\u4E8E `prizeDescription`\u3002\n * @optional\n */\n winnerNote?: string\n\n /**\n * Learn More \u94FE\u63A5\uFF08\u53EF\u9009\uFF09\n */\n learnMoreUrl?: string\n\n /**\n * Learn More \u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"Learn More\"\uFF09\n */\n learnMoreText?: string\n\n /**\n * \u590D\u5236\u7801\u70B9\u51FB\u56DE\u8C03\n */\n onCopyCode?: (code: string) => void\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"Okay, Got It\"\uFF09\n */\n confirmText?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u6848\u522B\u540D\uFF08\u6765\u81EA CMS winningInfos.confirmButton\uFF0C\u7B49\u540C\u4E8E confirmText\uFF09\n * \u5F53\u540C\u65F6\u63D0\u4F9B\u65F6\uFF0CconfirmButton \u4F18\u5148\u7EA7\u9AD8\u4E8E confirmText\n * @optional\n */\n confirmButton?: string\n\n /** \u786E\u8BA4\u6309\u94AE\u8DF3\u8F6C\u94FE\u63A5 @optional */\n confirmUrl?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u70B9\u51FB\u56DE\u8C03\uFF08\u53EF\u9009\uFF09\n */\n onConfirm?: () => void\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u914D\u7F6E\n// ============================================================================\n\n/**\n * \u9ED8\u8BA4\u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\uFF083\u79CD\uFF09\n * @note \u7236\u7EC4\u4EF6\u9700\u8981\u8986\u76D6 onClick \u56DE\u8C03\u4EE5\u5B9E\u73B0\u5177\u4F53\u4E1A\u52A1\u903B\u8F91\n */\nexport const DEFAULT_CHANCE_METHODS: ChanceMethod[] = [\n {\n methodKey: 'default-share',\n type: 'share',\n title: 'Share on your socials',\n description: 'Share this event on your social media',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n {\n methodKey: 'default-points',\n type: 'points',\n title: 'Spend 100 points',\n description: 'Use your reward points to get a chance',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n {\n methodKey: 'default-refer',\n type: 'refer',\n title: 'Refer a friend',\n description: 'Invite your friends to join',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n]\n\n// ============================================================================\n// \u7C7B\u578B\u5B88\u536B\n// ============================================================================\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 Prize \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 Prize\n */\nexport function isPrize(value: unknown): value is Prize {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'prizeKey' in value &&\n 'name' in value &&\n 'image' in value &&\n typeof (value as Prize).prizeKey === 'string' &&\n typeof (value as Prize).name === 'string' &&\n typeof (value as Prize).image === 'object'\n )\n}\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 ChanceMethod \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 ChanceMethod\n */\nexport function isChanceMethod(value: unknown): value is ChanceMethod {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'methodKey' in value &&\n 'type' in value &&\n 'title' in value &&\n 'description' in value &&\n 'onClick' in value &&\n typeof (value as ChanceMethod).methodKey === 'string' &&\n typeof (value as ChanceMethod).type === 'string' &&\n typeof (value as ChanceMethod).title === 'string' &&\n typeof (value as ChanceMethod).description === 'string' &&\n typeof (value as ChanceMethod).onClick === 'function'\n )\n}\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 WinningInfo \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 WinningInfo\n */\nexport function isWinningInfo(value: unknown): value is WinningInfo {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'winningKey' in value &&\n 'userName' in value &&\n 'prizeName' in value &&\n typeof (value as WinningInfo).winningKey === 'string' &&\n typeof (value as WinningInfo).userName === 'string' &&\n typeof (value as WinningInfo).prizeName === 'string'\n )\n}\n\n// ============================================================================\n// \u5BFC\u51FA\u7C7B\u578B\u522B\u540D\uFF08\u7528\u4E8E\u7B80\u5316\u4F7F\u7528\uFF09\n// ============================================================================\n\n/**\n * \u62BD\u5956\u56DE\u8C03\u51FD\u6570\u7C7B\u578B\n */\nexport type OnSpinEndCallback = (prize: Prize) => void\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u70B9\u51FB\u56DE\u8C03\u51FD\u6570\u7C7B\u578B\n */\nexport type OnChanceMethodClick = () => void\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * \u62BD\u5956\u7EC4\u4EF6\u5171\u4EAB\u7C7B\u578B\u5B9A\u4E49\n *\n * \u5305\u542B\u6240\u6709\u62BD\u5956\u7EC4\u4EF6\uFF08WheelLottery, ProductLottery \u7B49\uFF09\u5171\u7528\u7684\u7C7B\u578B\u3001\u63A5\u53E3\u548C\u5E38\u91CF\u3002\n *\n * @module LotterySharedTypes\n * @date 2026-04-07\n */\n\nimport type { Theme, Img } from '../../types/props.js'\nimport type { SerializedEditorState, SerializedLexicalNode } from '@payloadcms/richtext-lexical/lexical'\n\n// Re-export Theme and Img for convenience\nexport type { Theme, Img }\n\n// ============================================================================\n// \u6838\u5FC3\u5B9E\u4F53\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u5956\u54C1\uFF08Prize\uFF09\n *\n * \u4EE3\u8868\u62BD\u5956\u6D3B\u52A8\u4E2D\u7684\u4E00\u4E2A\u5956\u54C1\uFF0C\u5305\u542B\u663E\u793A\u6240\u9700\u7684\u6240\u6709\u4FE1\u606F\u3002\n *\n * @example\n * ```tsx\n * const prize: Prize = {\n * prizeKey: 'prize-001',\n * name: 'Anker Prime Charger (100W, 3 Ports, GaN)',\n * image: { url: 'https://images.unsplash.com/photo-123', alt: 'Charger' },\n * rank: '1st',\n * price: '$79.99'\n * }\n * ```\n */\nexport interface Prize {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\uFF0C\u7528\u4E8E React key \u548C\u4E2D\u5956\u7ED3\u679C\u5339\u914D\n */\n prizeKey: string\n\n /**\n * \u5956\u54C1\u540D\u79F0\uFF0C\u663E\u793A\u5728\u8F6C\u76D8\u548C\u5956\u6C60\u4E2D\n * @maxLength 100\n */\n name: string\n\n /**\n * \u5956\u54C1\u56FE\u7247\u5BF9\u8C61\uFF0C\u5305\u542B url \u548C alt\n */\n image: Img\n\n /**\n * \u6392\u540D\u6807\u8BC6\uFF0C\u4EC5\u5728 Prize Pool \u4E2D\u663E\u793A\n * @optional\n */\n rank?: '1st' | '2nd' | '3rd'\n\n /**\n * \u4EF7\u683C\u6216\u6298\u6263\u4FE1\u606F\uFF0C\u663E\u793A\u5728\u5956\u6C60\u4E2D\n * @example \"$99.99\" | \"12% Off\"\n * @optional\n */\n price?: string\n\n /** \u5956\u54C1\u7EF4\u5EA6\u7684\u4E2D\u5956\u5F39\u7A97\u8986\u76D6\u914D\u7F6E\uFF1B\u672A\u914D\u7F6E\u65F6\u7531\u63A5\u5165\u5C42\u56DE\u9000\u5230\u5168\u5C40\u914D\u7F6E */\n winnerModalConfig?: {\n winnerNote?: string\n confirmText?: string\n confirmUrl?: string\n learnMoreUrl?: string\n learnMoreText?: string\n }\n}\n\n/**\n * \u4E2D\u5956\u4FE1\u606F\uFF08WinningInfo\uFF09\n *\n * \u4EE3\u8868\u4E00\u6761\u4E2D\u5956\u8BB0\u5F55\uFF0C\u7528\u4E8E\u5E95\u90E8\u6EDA\u52A8\u6761\u5C55\u793A\uFF0C\u8425\u9020\u6D3B\u52A8\u6C1B\u56F4\u3002\n *\n * @example\n * ```tsx\n * const winningInfo: WinningInfo = {\n * winningKey: 'win-001',\n * userName: 'Shuqi***',\n * prizeName: '12% Off Discount',\n * timestamp: 1702800000000\n * }\n * ```\n */\nexport interface WinningInfo {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\n */\n winningKey: string\n\n /**\n * \u7528\u6237\u540D\uFF08\u5DF2\u8131\u654F\uFF09\uFF0C\u5982 \"Shuqi***\"\n * @note \u5047\u8BBE\u4F20\u5165\u7684\u7528\u6237\u540D\u5DF2\u7ECF\u8FC7\u8131\u654F\u5904\u7406\uFF0C\u7EC4\u4EF6\u5185\u90E8\u4E0D\u518D\u5904\u7406\n */\n userName: string\n\n /**\n * \u4E2D\u5956\u5956\u54C1\u540D\u79F0\n */\n prizeName: string\n\n /**\n * \u4E2D\u5956\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\n * @optional\n */\n timestamp?: number\n}\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u7C7B\u578B\n */\nexport type ChanceMethodType = 'share' | 'points' | 'refer' | string\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u72B6\u6001\n */\nexport type ChanceMethodStatus = 'pending' | 'completed' | 'used'\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\uFF08ChanceMethod\uFF09\n *\n * \u4EE3\u8868\u4E00\u79CD\u83B7\u53D6\u62BD\u5956\u673A\u4F1A\u7684\u65B9\u5F0F\uFF0C\u652F\u6301\u7075\u6D3B\u914D\u7F6E\uFF08\u5206\u4EAB\u3001\u79EF\u5206\u3001\u63A8\u8350\u7B49\uFF09\u3002\n *\n * @example\n * ```tsx\n * const chanceMethod: ChanceMethod = {\n * methodKey: 'share-001',\n * type: 'share',\n * title: 'Share on your socials',\n * description: 'Share this event on your social media',\n * buttonText: 'Redeem now',\n * onClick: () => console.log('Share clicked'),\n * disabled: false,\n * status: 'pending'\n * }\n * ```\n */\nexport interface ChanceMethod {\n /**\n * \u552F\u4E00\u6807\u8BC6\u7B26\n */\n methodKey: string\n\n /**\n * \u65B9\u5F0F\u7C7B\u578B\uFF0C\u652F\u6301\u9884\u5B9A\u4E49\u7C7B\u578B\uFF08'share', 'points', 'refer'\uFF09\u6216\u81EA\u5B9A\u4E49\u7C7B\u578B\n */\n type: ChanceMethodType\n\n /**\n * \u65B9\u5F0F\u6807\u9898\uFF0C\u5982 \"Share on your socials\"\n */\n title: string\n\n /**\n * \u8BE6\u7EC6\u8BF4\u660E\u6587\u5B57\n */\n description: string\n\n /**\n * \u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 \"Redeem now\"\n * @default \"Redeem now\"\n * @optional\n */\n buttonText?: string\n\n completed?: string\n\n used?: string\n\n /**\n * \u672A\u767B\u5F55\u65F6\u70B9\u51FB GO \u6309\u94AE\u7684\u56DE\u8C03\n * @example\n * ```tsx\n * onLoginRequired={() => {\n * // \u6253\u5F00\u767B\u5F55\u5F39\u7A97\u6216\u8DF3\u8F6C\u767B\u5F55\u9875\n * router.push('/login')\n * }}\n * ```\n */\n onLoginRequired?: () => void\n\n /**\n * \u70B9\u51FB\u6309\u94AE\u65F6\u7684\u56DE\u8C03\u51FD\u6570\n * @note \u4E1A\u52A1\u903B\u8F91\uFF08\u5982\u79EF\u5206\u6263\u9664\u3001\u5206\u4EAB\u9A8C\u8BC1\uFF09\u7531\u7236\u7EC4\u4EF6\u5904\u7406\n */\n onClick: () => void\n\n /**\n * \u662F\u5426\u7981\u7528\u8BE5\u65B9\u5F0F\n * @default false\n * @optional\n */\n disabled?: boolean\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u7684\u72B6\u6001\n * - pending: \u672A\u5B8C\u6210\uFF08\u9ED8\u8BA4\u72B6\u6001\uFF09\n * - completed: \u5DF2\u5B8C\u6210/\u5DF2\u83B7\u5F97\n * - used: \u5DF2\u4F7F\u7528\n * @default \"pending\"\n * @optional\n */\n status?: ChanceMethodStatus\n\n /**\n * \u662F\u5426\u663E\u793A\u52A0\u8F7D\u72B6\u6001\n * @default false\n * @optional\n */\n loading?: boolean\n\n /**\n * \u662F\u5426\u5728\u70B9\u51FB\u65F6\u6253\u5F00\u5206\u4EAB\u5F39\u7A97\n * @default false\n * @optional\n */\n openShareModal?: boolean\n}\n\n/**\n * \u7528\u6237\u6570\u636E\uFF08UserData\uFF09\n *\n * \u4EE3\u8868\u5F53\u524D\u7528\u6237\u7684\u62BD\u5956\u76F8\u5173\u6570\u636E\n *\n * @example\n * ```tsx\n * const userData: UserData = {\n * isLoggedIn: true,\n * availableChances: 3,\n * wonPrizes: [\n * { id: 'prize-001', name: 'Charger', image: 'https://...', timestamp: 1702800000000 }\n * ]\n * }\n * ```\n */\nexport interface UserData {\n /**\n * \u7528\u6237\u662F\u5426\u5DF2\u767B\u5F55\n */\n isLoggedIn: boolean\n\n /**\n * \u5F53\u524D\u53EF\u4F7F\u7528\u7684\u62BD\u5956\u6B21\u6570\n * @default 0\n */\n availableChances: number\n\n /**\n * \u603B\u673A\u4F1A\u6570\uFF08\u7528\u4E8E\u663E\u793A\u8FDB\u5EA6\uFF0C\u4F8B\u5982 \"3/5\"\uFF09\n * @default undefined\n * @optional\n */\n totalChances?: number\n\n /**\n * \u5DF2\u83B7\u5F97\u7684\u5956\u54C1\u5217\u8868\n * @optional\n */\n wonPrizes?: Array<Prize & { timestamp?: number }>\n\n /** * \u7528\u6237\u7535\u5B50\u90AE\u7BB1\uFF08\u53EF\u9009\uFF0C\u7528\u4E8E\u53D1\u9001\u4E2D\u5956\u901A\u77E5\u7B49\uFF09\n * @optional\n */\n email?: string\n\n /**\n * \u673A\u4F1A\u6570\u636E\u662F\u5426\u6B63\u5728\u52A0\u8F7D\u4E2D\n * @optional\n */\n isChancesLoading?: boolean\n}\n\n/**\n * \u7F13\u52A8\u51FD\u6570\u7C7B\u578B\n */\nexport type EasingFunction = 'ease-out' | 'ease-in-out' | 'linear'\n\n// ============================================================================\n// \u516C\u5171\u6587\u6848\u914D\u7F6E\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u590D\u5236\u64CD\u4F5C\u76F8\u5173\u6587\u6848\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n * \u7528\u4E8E\u6240\u6709\u5305\u542B\u590D\u5236\u529F\u80FD\u7684\u7EC4\u4EF6\n */\nexport interface CopyTextConfig {\n /**\n * \u590D\u5236\u6309\u94AE\u6587\u672C\n * @default \"COPY\"\n */\n copyText?: string\n\n /**\n * \u590D\u5236\u6210\u529F\u540E\u7684\u6309\u94AE\u6587\u672C\n * @default \"COPIED\"\n */\n copiedText?: string\n}\n\n/**\n * \u4F18\u60E0\u7801\u76F8\u5173\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n * \u7528\u4E8E\u6240\u6709\u5C55\u793A\u4F18\u60E0\u7801\u7684\u7EC4\u4EF6\n */\nexport interface CouponConfig {\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n */\n codeText?: string\n\n /**\n * \u4F18\u60E0\u7801\n */\n couponCode?: string\n\n /**\n * \u4F18\u60E0\u7801\u8FC7\u671F\u65F6\u95F4\n */\n expiresAt?: string\n\n /**\n * \u6709\u6548\u671F\u6807\u7B7E\u6587\u6848\n * @default \"Valid until:\"\n */\n expiresAtLabel?: string\n\n /**\n * \u4F18\u60E0\u5238\u6298\u6263\u6587\u672C\uFF08\u4F8B\u5982 \"20%\"\uFF09\n */\n couponDiscount?: string\n\n /**\n * \u4F18\u60E0\u5238\u5355\u4F4D\u6587\u672C\n * @default \"Off\"\n */\n couponUnit?: string\n}\n\n/**\n * \u5956\u52B1\u65F6\u95F4\u6587\u6848\u914D\u7F6E\uFF08\u516C\u5171\u7C7B\u578B\uFF09\n */\nexport interface PrizeTimeTextConfig {\n /**\n * \u5956\u52B1\u65F6\u95F4\u6587\u672C\u524D\u7F00\n * @default \"Prize time:\"\n */\n prizeText?: string\n}\n\n/**\n * \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E\uFF08WinnerModalConfig\uFF09\n *\n * \u7528\u4E8E\u914D\u7F6E\u4E2D\u5956\u5F39\u7A97\u7684\u5C55\u793A\u5185\u5BB9\uFF0C\u901A\u5E38\u7531\u62BD\u5956\u63A5\u53E3\u8FD4\u56DE\u63D0\u4F9B\n *\n * @example\n * ```tsx\n * const winnerModalConfig: WinnerModalConfig = {\n * title: 'Congratulations!',\n * prizeTitle: 'Anker Prime Charger',\n * prizeImage: 'https://...',\n * prizeDescription: 'High-speed charging for all your devices',\n * learnMoreUrl: 'https://...',\n * learnMoreText: 'View Details',\n * couponCode: 'ANKER2024',\n * expiresAt: '2024-12-31',\n * couponDiscount: '20%',\n * couponUnit: 'Off',\n * confirmText: 'Claim Now'\n * }\n * ```\n */\nexport interface WinnerModalConfig extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {\n /**\n * \u4E2D\u5956\u5F39\u7A97\u6807\u9898\n * @default \"You Have Won\"\n * @optional\n */\n title?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u6807\u9898\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E prize.name\uFF09\n * @optional\n */\n prizeTitle?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u56FE\u7247 URL\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E prize.image\uFF09\n * @optional\n */\n prizeImage?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\n * @deprecated \u8BED\u4E49\u4E0D\u660E\u786E\uFF0C\u8BF7\u6539\u7528 `winnerNote`\uFF08code/copy \u4E0B\u65B9\u4E13\u7528\u8BF4\u660E\u6587\u5B57\uFF09\n * @optional\n */\n prizeDescription?: string\n\n /**\n * code/copy \u533A\u57DF\u6B63\u4E0B\u65B9\u7684\u4E13\u7528\u8BF4\u660E\u6587\u5B57\u3002\n * \u4EC5\u5728\u660E\u786E\u914D\u7F6E\u65F6\u5C55\u793A\uFF1B\u672A\u914D\u7F6E\u65F6\u4E0D\u6E32\u67D3\u4EFB\u4F55\u5185\u5BB9\u3002\n * \u4F18\u5148\u7EA7\u9AD8\u4E8E `prizeDescription`\u3002\n * @optional\n */\n winnerNote?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97 Learn More \u94FE\u63A5\n * @optional\n */\n learnMoreUrl?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97 Learn More \u6309\u94AE\u6587\u672C\n * @default \"Learn More\"\n * @optional\n */\n learnMoreText?: string\n\n /**\n * \u4E2D\u5956\u5F39\u7A97\u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"Okay, Got It\"\n * @optional\n */\n confirmText?: string\n\n /** \u786E\u8BA4\u6309\u94AE\u8DF3\u8F6C\u94FE\u63A5\uFF0C\u914D\u7F6E\u540E\u70B9\u51FB\u6309\u94AE\u5C06\u5728\u65B0\u6807\u7B7E\u9875\u6253\u5F00\u6B64\u94FE\u63A5 @optional */\n confirmUrl?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u6848\u522B\u540D\uFF08\u6765\u81EA CMS winningInfos.confirmButton\uFF0C\u7B49\u540C\u4E8E confirmText\uFF09\n * \u5F53\u540C\u65F6\u63D0\u4F9B\u65F6\uFF0CconfirmButton \u4F18\u5148\u7EA7\u9AD8\u4E8E confirmText\n * @optional\n */\n confirmButton?: string\n}\n\n/**\n * Rules \u5F39\u7A97\u914D\u7F6E\n *\n * @example\n * ```tsx\n * rulesModalConfig={{\n * rulesData: [\n * { item: '$100 instead of $200, 10 tickets/day.' },\n * { item: '$100 for $120, 50 tickets/day.' }\n * ],\n * rulesText: 'Game Rules',\n * rulesTitle: 'Activity Rules'\n * }}\n * ```\n */\nexport interface RulesModalConfig {\n /**\n * \u89C4\u5219\u6570\u636E\u5217\u8868\n * @optional\n */\n rulesData?: Array<{\n /**\n * \u89C4\u5219\u9879\u5185\u5BB9\n */\n item: string\n }>\n\n /**\n * Rules \u6309\u94AE\u6587\u672C\n * @default \"Rules\"\n * @optional\n */\n rulesText?: string\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Rules\"\n * @optional\n */\n rulesTitle?: string\n}\n\n/**\n * ProductLottery \u9876\u680F\u53F3\u4FA7\u8DF3\u8F6C\u6309\u94AE\u914D\u7F6E\n */\nexport interface ActionButtonConfig {\n /**\n * \u6309\u94AE\u6587\u672C\uFF1B\u4E3A\u7A7A\u65F6\u4E0D\u5C55\u793A\n */\n text?: string\n\n /**\n * \u8DF3\u8F6C\u94FE\u63A5\uFF1B\u4E3A\u7A7A\u65F6\u4E0D\u5C55\u793A\n */\n url?: string\n}\n\n/**\n * My Rewards \u5F39\u7A97\u914D\u7F6E\n *\n * @example\n * ```tsx\n * myRewardsModalConfig={{\n * rewardsData: [\n * {\n * id: '1',\n * name: 'Anker Charger',\n * code: 'ANKER2024',\n * status: 'Available',\n * prizeTime: '2024-01-01',\n * showCopyCode: true\n * }\n * ],\n * myRewardsText: 'My Prizes',\n * codeText: 'CODE:',\n * copyText: 'COPY',\n * prizeText: 'Prize time:',\n * emptyText: 'No rewards yet'\n * }}\n * ```\n */\nexport interface MyRewardsModalConfig extends CopyTextConfig, PrizeTimeTextConfig {\n /**\n * \u5956\u52B1\u6570\u636E\u5217\u8868\n * @optional\n */\n rewardsData?: Array<{\n /**\n * \u5956\u52B1 ID\n */\n id: string\n /**\n * \u5956\u52B1\u540D\u79F0\n */\n name: string\n /**\n * \u4F18\u60E0\u7801\uFF08\u53EF\u9009\uFF09\n */\n code?: string\n /**\n * \u72B6\u6001\n */\n status: 'Available' | 'Expired' | 'Used'\n /**\n * \u5956\u52B1\u65F6\u95F4\n */\n prizeTime?: string\n /**\n * \u662F\u5426\u53EF\u590D\u5236\u7801\n */\n showCopyCode?: boolean\n /**\n * \u6BCF\u5956\u52B1\u53EF\u914D\u7F6E\u7684\u663E\u793A\u6587\u6848\uFF08\u8986\u76D6\u5168\u5C40 status label \u6620\u5C04\uFF09\n * @optional\n */\n statusText?: string\n\n /**\n * \u662F\u5426\u53EF\u7528\uFF08\u7528\u4E8E\u63A7\u5236\u989C\u8272\u548C\u590D\u5236\u6309\u94AE\u72B6\u6001\uFF09\n * @optional\n */\n available?: boolean\n }>\n\n /**\n * My Rewards \u6309\u94AE\u6587\u672C\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsText?: string\n\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"My Rewards\"\n * @optional\n */\n myRewardsTitle?: string\n\n /**\n * \u4EE3\u7801\u6587\u672C\u524D\u7F00\n * @default \"CODE:\"\n * @optional\n */\n codeText?: string\n\n /**\n * \u7A7A\u72B6\u6001\u63D0\u793A\u6587\u672C\n * @default \"No rewards yet\"\n * @optional\n */\n emptyText?: string\n\n /**\n * \u590D\u5236\u5931\u8D25\u63D0\u793A\u6587\u6848\n * @optional\n */\n copyError?: string\n\n /**\n * \u53EF\u7528\u72B6\u6001\u6587\u6848\n * @default \"Available\"\n * @optional\n */\n availableText?: string\n\n /**\n * \u5DF2\u4F7F\u7528\u72B6\u6001\u6587\u6848\n * @default \"Used\"\n * @optional\n */\n usedStatusText?: string\n\n /**\n * \u5DF2\u8FC7\u671F\u72B6\u6001\u6587\u6848\n * @default \"Expired\"\n * @optional\n */\n expiredText?: string\n\n /**\n * \u672A\u77E5\u72B6\u6001\u6587\u6848\n * @optional\n */\n notFoundText?: string\n}\n\n/**\n * \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\n * @example\n * ```tsx\n * errorModalConfig={{\n * title: 'Oops!',\n * message: 'Something went wrong during the lottery process.',\n * confirmText: 'OK, I get'\n * }}\n * ```\n */\nexport interface ErrorModalConfig {\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Oops!\"\n * @optional\n */\n title?: string\n /**\n * \u9519\u8BEF\u6D88\u606F\u5185\u5BB9\n * @default \"Something went wrong during the lottery process.\"\n * @optional\n */\n message?: string\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\n * @default \"OK, I get\"\n * @optional\n */\n confirmText?: string\n /** \u5151\u6362\u5931\u8D25\u65F6\u663E\u793A\u7684\u5F39\u7A97\u6807\u9898\uFF08\u6765\u81EA CMS error.exchangeFailedTitle\uFF09 @optional */\n exchangeFailedTitle?: string\n /** \u5151\u6362\u5931\u8D25\u65F6\u663E\u793A\u7684\u9519\u8BEF\u6D88\u606F\uFF08\u6765\u81EA CMS error.exchangeFailedMessage\uFF09 @optional */\n exchangeFailedMessage?: string\n}\n\n/**\n * \u672A\u4E2D\u5956 / Try Again \u5F39\u7A97\u914D\u7F6E\uFF08\u6765\u81EA CMS tryAgain group\uFF09\n */\nexport interface TryAgainConfig {\n /** \u672A\u4E2D\u5956\u5F39\u7A97\u6807\u9898 @optional */\n title?: string\n /** \u672A\u4E2D\u5956\u5F39\u7A97\u6D88\u606F\u5185\u5BB9 @optional */\n message?: string\n /** \u786E\u8BA4\u6309\u94AE\u6587\u6848 @optional */\n confirmText?: string\n}\n\n/**\n * \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E\uFF08CMS: error group\uFF09\n */\nexport interface ErrorConfig {\n title?: string\n defaultMessage?: string\n confirmButton?: string\n exchangeFailedTitle?: string\n exchangeFailedMessage?: string\n}\n\n/**\n * \u793E\u4EA4\u5E73\u53F0\u7C7B\u578B\n */\nexport type SocialPlatform = 'facebook' | 'twitter' | 'instagram' | 'linkedin' | 'tiktok' | 'youtube'\n\n/**\n * \u793E\u4EA4\u5E73\u53F0\u914D\u7F6E\n */\nexport interface SharePlatformConfig {\n /**\n * \u5E73\u53F0\u7C7B\u578B\n */\n platform: SocialPlatform\n\n /**\n * \u5E73\u53F0\u540D\u79F0\n */\n name: string\n\n /**\n * \u5206\u4EAB URL\uFF08\u53EF\u9009\uFF0C\u5982\u679C\u63D0\u4F9B\u5219\u76F4\u63A5\u8DF3\u8F6C\uFF09\n */\n url?: string\n\n /**\n * \u70B9\u51FB\u56DE\u8C03\uFF08\u5982\u679C\u63D0\u4F9B url \u5219\u6B64\u56DE\u8C03\u4F1A\u5728\u8DF3\u8F6C\u524D\u6267\u884C\uFF09\n */\n onClick?: () => void\n\n /**\n * \u662F\u5426\u7981\u7528\n */\n disabled?: boolean\n}\n\n/**\n * \u5206\u4EAB\u5F39\u7A97\u914D\u7F6E\n */\nexport interface ShareModalConfig {\n /**\n * \u5F39\u7A97\u6807\u9898\n * @default \"Share to Get More Chances\"\n */\n title?: string\n\n /**\n * \u526F\u6807\u9898/\u5F15\u5BFC\u6587\u6848\n * @default \"Share to Play Again Keep Trying! You Could Still Win Big!\"\n */\n subtitle?: string\n\n /**\n * \u5E95\u90E8\u63D0\u793A\u6587\u6848\n * @default \"Note: Maximum of 3 times per participant.\"\n */\n note?: string\n\n /**\n * \u793E\u4EA4\u5E73\u53F0\u914D\u7F6E\u5217\u8868\n */\n platforms?: SharePlatformConfig[]\n\n /**\n * \u5206\u4EAB\u6210\u529F\u56DE\u8C03\n */\n onShareSuccess?: (platform: SocialPlatform) => void\n}\n\n// ============================================================================\n// \u5B50\u7EC4\u4EF6 Props \u63A5\u53E3\n// ============================================================================\n\n/**\n * PrizePool \u5956\u54C1\u6C60\u7EC4\u4EF6 Props\n */\nexport interface PrizePoolProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * \u5956\u54C1\u5217\u8868(\u901A\u5E38\u662F\u5168\u90E8 8 \u4E2A\u5956\u54C1)\n */\n prizes: Prize[]\n\n /**\n * \u6807\u9898\u6587\u672C\n * @default \"Prize Pool\"\n */\n title?: string\n\n /**\n * \u4E2D\u5956\u4EBA\u540D\u5355\u6570\u636E\n * @optional\n */\n winningInfos?: WinningInfo[]\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /**\n * \u4E2D\u5956\u6EDA\u52A8 Ticker \u6587\u6848\u6A21\u677F\n * \u652F\u6301\u53D8\u91CF\uFF1A{{name}} \u83B7\u5956\u8005\u6635\u79F0\uFF0C{{prize}} \u5956\u54C1\u540D\u79F0\n * @default \"{{name}} just won {{prize}}!\"\n * @optional\n */\n winnerNameTemplate?: string\n}\n\n/** \u6D3B\u52A8\u673A\u5236\u6A21\u5F0F */\nexport type ChanceMechanismType = 'methods' | 'input'\n\n/** \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u4EC5 mechanismType='input' \u65F6\u4F7F\u7528\uFF09 */\nexport interface ChanceInputConfig {\n /** \u8F93\u5165\u6846\u5360\u4F4D\u6587\u672C @default \"Enter your order number\" */\n placeholder?: string\n /** \u63D0\u4EA4\u6309\u94AE\u6587\u6848 @default \"Spin and Win\" */\n submitText?: string\n /** \u8F93\u5165\u503C\u63D0\u4EA4\u56DE\u8C03 */\n onSubmit?: (value: string) => void | Promise<void>\n /** \u662F\u5426\u6B63\u5728\u63D0\u4EA4 */\n isSubmitting?: boolean\n /** \u8F93\u5165\u6846\u7C7B\u578B @default \"text\" */\n inputType?: 'text' | 'email' | 'number'\n /** \u9A8C\u8BC1\u6B63\u5219 (\u53EF\u9009) */\n validationPattern?: string\n /** \u9A8C\u8BC1\u5931\u8D25\u63D0\u793A\u6587\u6848 */\n validationErrorText?: string\n /** \u8F93\u5165\u6846\u9ED8\u8BA4\u503C\uFF08\u5982\u767B\u5F55\u7528\u6237 email\uFF0C\u652F\u6301\u5F02\u6B65\u586B\u5145\uFF09 @optional */\n defaultValue?: string\n\n /** \u63A5\u5165\u65B9\u6309\u9700\u7981\u7528\u8F93\u5165\u6846\u5185\u5BB9\u66F4\u6539 */\n disabled?: boolean\n\n /** \u662F\u5426\u7981\u6B62\u6D4F\u89C8\u5668\u81EA\u52A8\u586B\u5145\uFF08\u5C24\u5176\u662F email \u81EA\u52A8\u586B\u5145\uFF09 */\n disableAutofill?: boolean\n\n /** \u534F\u8BAE\u544A\u77E5\u5BCC\u6587\u672C\uFF1B\u914D\u7F6E\u65F6\u624D\u5C55\u793A\u534F\u8BAE\u52FE\u9009 UI */\n agreementNotice?: string | SerializedEditorState<SerializedLexicalNode>\n\n /** \u534F\u8BAE\u672A\u52FE\u9009\u65F6\u7684\u63D0\u793A\u6587\u6848\uFF1B\u914D\u7F6E\u534F\u8BAE\u540E\u70B9\u51FB\u63D0\u4EA4\u4F46\u672A\u52FE\u9009\u65F6\u5C55\u793A */\n agreementWarningText?: string\n\n /** \u8F93\u5165\u6A21\u5F0F\u63D0\u4EA4\u6309\u94AE\u70B9\u51FB\u57CB\u70B9\uFF1Adata-headless-type-name */\n submitTrackTypeName?: string\n\n /** \u8F93\u5165\u6A21\u5F0F\u63D0\u4EA4\u6309\u94AE\u70B9\u51FB\u57CB\u70B9\uFF1Adata-headless-title-desc-button */\n submitTrackTitleDescButton?: string\n}\n\n/**\n * ChanceMethods \u83B7\u53D6\u673A\u4F1A\u7EC4\u4EF6 Props\n */\nexport interface ChanceMethodsProps {\n /**\n * \u4E3B\u9898\u6A21\u5F0F\n * @optional\n */\n theme?: Theme\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u5217\u8868\n */\n methods: ChanceMethod[]\n\n /**\n * \u6807\u9898\u6587\u672C\n * @default \"Want more chances to win?\"\n */\n title?: string\n\n /**\n * \u526F\u6807\u9898(\u53EF\u9009)\n */\n subtitle?: string\n\n /**\n * \u5E95\u90E8\u63D0\u793A\u6587\u672C(\u53EF\u9009)\n */\n footerNote?: string\n\n /**\n * \u767B\u5F55\u7528\u6237\u6570\u636E\uFF08\u53EF\u9009\uFF09\n * @optional\n */\n userData?: UserData\n\n /**\n * \u6253\u5F00\u5206\u4EAB\u5F39\u7A97\u56DE\u8C03\uFF08\u53EF\u9009\uFF09\n * @optional\n */\n onOpenShareModal?: () => void\n\n /**\n * \u5FBD\u7AE0\u6587\u6848\n * @default \"Chance +1\"\n */\n chanceBadgeText?: string\n\n /**\n * \u5DF2\u5B8C\u6210\u72B6\u6001\u6587\u6848\n * @default \"Completed\"\n */\n completedText?: string\n\n /**\n * \u5DF2\u4F7F\u7528\u72B6\u6001\u6587\u6848\n * @default \"Used\"\n */\n usedText?: string\n\n /**\n * \u52A0\u8F7D\u4E2D\u6587\u6848\n * @default \"Loading...\"\n */\n loadingText?: string\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n\n /** \u6D3B\u52A8\u673A\u5236\u6A21\u5F0F @default 'methods' */\n mechanismType?: ChanceMechanismType\n /** \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u4EC5 mechanismType='input' \u65F6\u4F7F\u7528\uFF09 */\n inputConfig?: ChanceInputConfig\n\n /** \u534F\u8BAE\u662F\u5426\u5DF2\u52FE\u9009\uFF08\u4F9B\u5916\u5C42\u7EDF\u4E00\u63A7\u5236\u5DE6\u53F3\u4E24\u4FA7\u62BD\u5956\u5165\u53E3\uFF09 */\n isAgreementChecked?: boolean\n\n /** \u534F\u8BAE\u52FE\u9009\u72B6\u6001\u53D8\u66F4\u56DE\u8C03 */\n onAgreementCheckedChange?: (checked: boolean) => void\n\n /** \u5916\u5C42\u6CE8\u5165\u7684\u534F\u8BAE\u63D0\u793A\u6587\u6848\uFF08\u7528\u4E8E\u7EDF\u4E00\u62E6\u622A\u5DE6\u53F3\u4E24\u4FA7\u62BD\u5956\u5165\u53E3\u65F6\u5C55\u793A\u5728\u6309\u94AE\u4E0B\u65B9\uFF09 */\n agreementErrorText?: string\n}\n\n/**\n * WinnerModal \u4E2D\u5956\u5F39\u7A97\u7EC4\u4EF6 Props\n */\nexport interface WinnerModalProps extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {\n /**\n * \u662F\u5426\u663E\u793A\u5F39\u7A97\n */\n isOpen: boolean\n\n /**\n * \u4E2D\u5956\u5956\u54C1\u4FE1\u606F\n */\n prize: Prize | null\n\n /**\n * \u5F39\u7A97\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"You Have Won\"\uFF09\n */\n title?: string\n\n /**\n * \u5956\u54C1\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4F7F\u7528 prize.name\uFF09\n */\n prizeTitle?: string\n\n /**\n * \u5956\u54C1\u56FE\u7247 URL\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u4F7F\u7528 prize.image\uFF09\n */\n prizeImage?: string\n\n /**\n * \u5956\u54C1\u8BE6\u60C5\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09\n * @deprecated \u8BED\u4E49\u4E0D\u660E\u786E\uFF0C\u8BF7\u6539\u7528 `winnerNote`\uFF08code/copy \u4E0B\u65B9\u4E13\u7528\u8BF4\u660E\u6587\u5B57\uFF09\n */\n prizeDescription?: string\n\n /**\n * code/copy \u533A\u57DF\u6B63\u4E0B\u65B9\u7684\u4E13\u7528\u8BF4\u660E\u6587\u5B57\u3002\n * \u4EC5\u5728\u660E\u786E\u914D\u7F6E\u65F6\u5C55\u793A\uFF1B\u672A\u914D\u7F6E\u65F6\u4E0D\u6E32\u67D3\u4EFB\u4F55\u5185\u5BB9\u3002\n * \u4F18\u5148\u7EA7\u9AD8\u4E8E `prizeDescription`\u3002\n * @optional\n */\n winnerNote?: string\n\n /**\n * Learn More \u94FE\u63A5\uFF08\u53EF\u9009\uFF09\n */\n learnMoreUrl?: string\n\n /**\n * Learn More \u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"Learn More\"\uFF09\n */\n learnMoreText?: string\n\n /**\n * \u590D\u5236\u7801\u70B9\u51FB\u56DE\u8C03\n */\n onCopyCode?: (code: string) => void\n\n /**\n * \u5173\u95ED\u5F39\u7A97\u56DE\u8C03\n */\n onClose: () => void\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u672C\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 \"Okay, Got It\"\uFF09\n */\n confirmText?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u6587\u6848\u522B\u540D\uFF08\u6765\u81EA CMS winningInfos.confirmButton\uFF0C\u7B49\u540C\u4E8E confirmText\uFF09\n * \u5F53\u540C\u65F6\u63D0\u4F9B\u65F6\uFF0CconfirmButton \u4F18\u5148\u7EA7\u9AD8\u4E8E confirmText\n * @optional\n */\n confirmButton?: string\n\n /** \u786E\u8BA4\u6309\u94AE\u8DF3\u8F6C\u94FE\u63A5 @optional */\n confirmUrl?: string\n\n /**\n * \u786E\u8BA4\u6309\u94AE\u70B9\u51FB\u56DE\u8C03\uFF08\u53EF\u9009\uFF09\n */\n onConfirm?: () => void\n\n /**\n * \u81EA\u5B9A\u4E49\u7C7B\u540D\n */\n className?: string\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u914D\u7F6E\n// ============================================================================\n\n/**\n * \u9ED8\u8BA4\u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\uFF083\u79CD\uFF09\n * @note \u7236\u7EC4\u4EF6\u9700\u8981\u8986\u76D6 onClick \u56DE\u8C03\u4EE5\u5B9E\u73B0\u5177\u4F53\u4E1A\u52A1\u903B\u8F91\n */\nexport const DEFAULT_CHANCE_METHODS: ChanceMethod[] = [\n {\n methodKey: 'default-share',\n type: 'share',\n title: 'Share on your socials',\n description: 'Share this event on your social media',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n {\n methodKey: 'default-points',\n type: 'points',\n title: 'Spend 100 points',\n description: 'Use your reward points to get a chance',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n {\n methodKey: 'default-refer',\n type: 'refer',\n title: 'Refer a friend',\n description: 'Invite your friends to join',\n buttonText: 'Redeem now',\n onLoginRequired: () => {\n alert('Please log in to share and get a chance!')\n },\n onClick: () => {\n console.warn('ChanceMethod.onClick not implemented. Please provide a custom onClick handler.')\n },\n disabled: false,\n },\n]\n\n// ============================================================================\n// \u7C7B\u578B\u5B88\u536B\n// ============================================================================\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 Prize \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 Prize\n */\nexport function isPrize(value: unknown): value is Prize {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'prizeKey' in value &&\n 'name' in value &&\n 'image' in value &&\n typeof (value as Prize).prizeKey === 'string' &&\n typeof (value as Prize).name === 'string' &&\n typeof (value as Prize).image === 'object'\n )\n}\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 ChanceMethod \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 ChanceMethod\n */\nexport function isChanceMethod(value: unknown): value is ChanceMethod {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'methodKey' in value &&\n 'type' in value &&\n 'title' in value &&\n 'description' in value &&\n 'onClick' in value &&\n typeof (value as ChanceMethod).methodKey === 'string' &&\n typeof (value as ChanceMethod).type === 'string' &&\n typeof (value as ChanceMethod).title === 'string' &&\n typeof (value as ChanceMethod).description === 'string' &&\n typeof (value as ChanceMethod).onClick === 'function'\n )\n}\n\n/**\n * \u68C0\u67E5\u662F\u5426\u4E3A\u6709\u6548\u7684 WinningInfo \u5BF9\u8C61\n * @param value \u5F85\u68C0\u67E5\u7684\u503C\n * @returns \u662F\u5426\u4E3A\u6709\u6548\u7684 WinningInfo\n */\nexport function isWinningInfo(value: unknown): value is WinningInfo {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'winningKey' in value &&\n 'userName' in value &&\n 'prizeName' in value &&\n typeof (value as WinningInfo).winningKey === 'string' &&\n typeof (value as WinningInfo).userName === 'string' &&\n typeof (value as WinningInfo).prizeName === 'string'\n )\n}\n\n// ============================================================================\n// \u5BFC\u51FA\u7C7B\u578B\u522B\u540D\uFF08\u7528\u4E8E\u7B80\u5316\u4F7F\u7528\uFF09\n// ============================================================================\n\n/**\n * \u62BD\u5956\u56DE\u8C03\u51FD\u6570\u7C7B\u578B\n */\nexport type OnSpinEndCallback = (prize: Prize) => void\n\n/**\n * \u83B7\u53D6\u673A\u4F1A\u70B9\u51FB\u56DE\u8C03\u51FD\u6570\u7C7B\u578B\n */\nexport type OnChanceMethodClick = () => void\n"],
|
|
5
|
+
"mappings": "AAkgCO,MAAMA,EAAyC,CACpD,CACE,UAAW,gBACX,KAAM,QACN,MAAO,wBACP,YAAa,wCACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,EACA,CACE,UAAW,iBACX,KAAM,SACN,MAAO,mBACP,YAAa,yCACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,EACA,CACE,UAAW,gBACX,KAAM,QACN,MAAO,iBACP,YAAa,8BACb,WAAY,aACZ,gBAAiB,IAAM,CACrB,MAAM,0CAA0C,CAClD,EACA,QAAS,IAAM,CACb,QAAQ,KAAK,gFAAgF,CAC/F,EACA,SAAU,EACZ,CACF,EAWO,SAASC,EAAQC,EAAgC,CACtD,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,aAAcA,GACd,SAAUA,GACV,UAAWA,GACX,OAAQA,EAAgB,UAAa,UACrC,OAAQA,EAAgB,MAAS,UACjC,OAAQA,EAAgB,OAAU,QAEtC,CAOO,SAASC,EAAeD,EAAuC,CACpE,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,cAAeA,GACf,SAAUA,GACV,UAAWA,GACX,gBAAiBA,GACjB,YAAaA,GACb,OAAQA,EAAuB,WAAc,UAC7C,OAAQA,EAAuB,MAAS,UACxC,OAAQA,EAAuB,OAAU,UACzC,OAAQA,EAAuB,aAAgB,UAC/C,OAAQA,EAAuB,SAAY,UAE/C,CAOO,SAASE,EAAcF,EAAsC,CAClE,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,eAAgBA,GAChB,aAAcA,GACd,cAAeA,GACf,OAAQA,EAAsB,YAAe,UAC7C,OAAQA,EAAsB,UAAa,UAC3C,OAAQA,EAAsB,WAAc,QAEhD",
|
|
6
6
|
"names": ["DEFAULT_CHANCE_METHODS", "isPrize", "value", "isChanceMethod", "isWinningInfo"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{Fragment as W,jsx as t,jsxs as M}from"react/jsx-runtime";import N,{useRef as h,useImperativeHandle as z,useLayoutEffect as E,useState as L}from"react";import{Picture as
|
|
1
|
+
"use client";import{Fragment as W,jsx as t,jsxs as M}from"react/jsx-runtime";import N,{useRef as h,useImperativeHandle as z,useLayoutEffect as E,useState as L}from"react";import{Picture as y,Text as q}from"../../components/index.js";import{cn as n}from"../../helpers/utils.js";import{withLayout as H}from"../../shared/Styles.js";import"swiper/css";import{useExposure as j}from"../../hooks/useExposure.js";const A="image",D="marquee",g=N.forwardRef(({data:{items:e=[],speed:s=3e3,reverseDirection:i=!1,key:p}={},className:k},P)=>{const o=h(null),C=h(null);z(P,()=>o.current),j(o,{componentType:A,componentName:D});const T=`${s*5}ms`,m="clamp(24px, 4vw, 64px)",[w,I]=L(2);return E(()=>{const a=C.current;if(!a)return;const r=()=>{const c=a.offsetWidth;if(c===0)return;const R=window.innerWidth,b=Math.ceil(R/c);I(Math.max(2,b))};r(),o.current?.style.setProperty("--track-width",`${a.offsetWidth}px`);const l=new ResizeObserver(()=>{r(),o.current?.style.setProperty("--track-width",`${a.offsetWidth}px`)});return l.observe(a),()=>l.disconnect()},[e]),t("div",{ref:o,id:p?`Marquee-${p}`:void 0,className:n("text-info-primary w-full",k),children:M("div",{className:n("flex h-full w-max items-center",i?"animate-marquee-reverse":"animate-marquee"),style:{"--marquee-duration":T},children:[t("div",{ref:C,className:"flex h-full shrink-0 items-center",style:{gap:m,paddingRight:m},children:e.map((a,r)=>t("div",{className:"shrink-0",children:t(u,{data:a})},(a?.id??"")+"-orig-"+r))}),Array.from({length:w}).map((a,r)=>t("div",{className:"flex h-full shrink-0 items-center",style:{gap:m,paddingRight:m},"aria-hidden":"true",children:e.map((l,c)=>t("div",{className:"shrink-0",children:t(u,{data:l})},(l?.id??"")+"-copy-"+r+"-"+c))},`copy-group-${r}`))]})})});g.displayName="Marquee";const u=({data:e,configuration:s})=>M(W,{children:[e.type==="image"&&t(d,{image:e?.image,imageClassName:s?.imageClassName}),e.type==="text"&&t(x,{text:e?.text,textClassName:s?.textClassName}),e.type==="iconAndText"&&t(f,{icon:e?.iconImage,text:e?.iconText,iconClassName:s?.iconClassName,textClassName:s?.textClassName}),e.type==="picture"&&t(v,{pictureImage:e?.pictureImage,pictureClassName:s?.pictureClassName})]});u.displayName="MarqueeItem";const d=({image:e,imageClassName:s})=>t("div",{className:"laptop:w-[120px] h-full w-[72px] shrink-0",children:t(y,{source:e?.url,alt:e?.alt||"",imgClassName:n("object-cover",s)})});d.displayName="MarqueeImageContent";const x=N.forwardRef(({text:e,textClassName:s},i)=>t(q,{as:"div",ref:i,html:e,className:n("text-lines-2 flex size-full items-center justify-center font-bold leading-[1.2]",s)}));x.displayName="MarqueeTextContent";const f=({icon:e,text:s,iconClassName:i,textClassName:p})=>M("div",{className:"laptop:h-[72px] laptop:gap-2 flex h-[48px] items-center gap-1",children:[e&&t("img",{src:e?.url,alt:e?.alt||"",className:n("desktop:size-6 size-5 shrink-0 object-contain",i)}),s&&t(q,{as:"div",html:s,className:n("laptop:text-[16px] lg-desktop::text-[18px] flex h-full items-center text-[14px] ",p)})]});f.displayName="MarqueeIconAndTextContent";const v=({pictureImage:e,pictureClassName:s})=>t("div",{className:"lg-desktop:size-[128px] desktop:size-[112px] laptop:size-[96px] tablet:size-[72px] size-[72px] shrink-0",children:t(y,{source:e?.url,alt:e?.alt||"",className:"w-full",imgClassName:n("object-contain",s)})});v.displayName="MarqueePictureContent";var G=H(g);export{f as MarqueeIconAndTextContent,d as MarqueeImageContent,u as MarqueeItem,v as MarqueePictureContent,x as MarqueeTextContent,G as default};
|
|
2
2
|
//# sourceMappingURL=Marquee.js.map
|