@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,2 +0,0 @@
|
|
|
1
|
-
"use strict";var v=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var z=(a,n)=>{for(var c in n)v(a,c,{get:n[c],enumerable:!0})},B=(a,n,c,p)=>{if(n&&typeof n=="object"||typeof n=="function")for(let u of M(n))!D.call(a,u)&&u!==c&&v(a,u,{get:()=>n[u],enumerable:!(p=E(n,u))||p.enumerable});return a};var _=a=>B(v({},"__esModule",{value:!0}),a);var H={};z(H,{MobileTextLinksMenu:()=>A});module.exports=_(H);var l=require("react/jsx-runtime"),s=require("react"),i=require("../../components/index.js"),m=require("../../helpers/utils.js"),k=require("./NavProvider.js"),L=require("../AiuiProvider/index.js"),f=require("./types.js"),T=require("./MobileMenuComponents.js");const A=({textlinksCategoriesMetadata:a,textlinksColumnsMetadata:n})=>{const{currentMenu:c,setCurrentMenu:p,subSubCategory:u,setSubSubCategory:y,onSidebarNavClick:x}=(0,k.useNavContext)(),{locale:g="us"}=(0,L.useAiuiContext)(),[S,h]=(0,s.useState)([]),[N,F]=(0,s.useState)(-1);(0,s.useEffect)(()=>{const e=a?.subcategories;e?.length&&h(e.map((o,r)=>({index:r,open:!1})))},[a]);const C=(0,s.useMemo)(()=>u&&n?.find(e=>e?.label?.toLowerCase()===u?.label?.toLowerCase())||null,[u,n]),w=(0,s.useCallback)((e,o)=>{if(!(Array.isArray(e?.subSubCategories)&&e?.subSubCategories?.length>0)){y?.(e),p?.(f.HeaderNavigationMenu.Third);return}h(b=>b.map((t,d)=>({...t,open:d===o?!t.open:!1})))},[p,y]),$=(0,s.useCallback)((e,o,r)=>{y?.(e),p?.(f.HeaderNavigationMenu.Third),F(r),h(b=>b.map(t=>({...t,open:t.index===o}))),x?.(e,r)},[p,y,x]);return(0,s.useMemo)(()=>{switch(c){case f.HeaderNavigationMenu.Secondary:return(0,l.jsxs)("div",{className:"tablet:px-8 laptop:px-16 flex h-full flex-col gap-8 p-4",children:[(0,l.jsx)("div",{children:a?.subcategories?.map((e,o)=>{const r=Array.isArray(e?.subSubCategories)&&e?.subSubCategories?.length>0,b=S?.find(t=>t.index===o)?.open;return(0,l.jsxs)("div",{children:[(0,l.jsx)(T.MenuItem,{label:e?.label,active:b,onClick:()=>{w(e,o),x?.(e,o)}}),b&&r&&(0,l.jsx)("div",{className:"flex flex-col",role:"menu",children:e.subSubCategories?.map((t,d)=>(0,l.jsx)("button",{onClick:()=>$(t,o,d),className:(0,m.cn)("w-full cursor-pointer border-0 bg-transparent px-4 py-3 text-left hover:bg-[#F5F5F7]",{"bg-[#F5F5F7]":N===d}),role:"menuitem","aria-label":t.label,children:(0,l.jsx)(i.Text,{html:t.label,className:"text-sm font-bold leading-[1.4] text-[#4A4C56]"})},`mobile-textlinks-subSubItem-${o}-${d}`))})]},`mobile-textlinks-subcategory-${e?.label||""}-${o}`)})}),(0,l.jsxs)("div",{className:"tablet:items-start flex flex-col items-center gap-4",children:[a?.primary&&(0,l.jsx)(i.Button,{as:"a",href:`${(0,m.getLocalizedPath)(a?.primary?.url,g)}?ref=${a?.primary?.label}_shopall`,variant:"primary",size:"lg",className:"tablet:w-auto w-full text-base",children:a?.primary?.label}),a?.secondary&&(0,l.jsx)(i.Button,{as:"a",href:(0,m.getLocalizedPath)(a?.secondary?.url,g),variant:"link",size:"lg",className:"tablet:w-auto tablet:px-0 w-full py-0 text-base",children:a?.secondary?.label})]})]});case f.HeaderNavigationMenu.Third:return(0,l.jsx)("div",{className:"tablet:px-8 laptop:px-16 flex flex-col gap-6 p-4",children:C?.columns?.map((e,o)=>(0,l.jsxs)("div",{className:"flex flex-col gap-2",children:[e?.label&&(0,l.jsx)(i.Text,{html:e.label,as:"p",className:"text-sm font-bold leading-[1.4] text-[#6D6D6F]"}),(0,l.jsx)("div",{className:"flex flex-col",children:e?.links?.map((r,b)=>(0,l.jsxs)("div",{className:"flex min-h-[36px] items-center gap-1 py-2",children:[(0,l.jsx)(i.Link,{href:(0,m.getLocalizedPath)(r?.url,g),asChild:!r?.url,className:"text-sm font-bold leading-[1.4] no-underline",children:r.label}),r?.badge&&(0,l.jsx)(i.Text,{as:"p",html:r.badge,className:"h-[24px] whitespace-nowrap rounded-full border-[1.6px] border-[#005D8E] px-[6px] text-xs font-bold !leading-[22px] text-[#005D8E]"})]},`mobile-textlinks-link-${r?.label||""}-${b}`))})]},`mobile-textlinks-col-${e?.label||""}-${o}`))});default:return null}},[c,a,S,N,C,w,$,x,g])};A.displayName="MobileTextLinksMenu";
|
|
2
|
-
//# sourceMappingURL=MobileTextLinksMenu.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/biz-components/HeaderNavigation/MobileTextLinksMenu.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Button, Text, Link } from '../../components/index.js'\nimport { cn, getLocalizedPath } from '../../helpers/utils.js'\nimport { useNavContext } from './NavProvider.js'\nimport { useAiuiContext } from '../AiuiProvider/index.js'\nimport { HeaderNavigationMenu } from './types.js'\nimport { MenuItem } from './MobileMenuComponents.js'\n\n/**\n * \u79FB\u52A8\u7AEF TextLinks \u83DC\u5355\n * \u4E8C\u7EA7\u83DC\u5355\uFF1A\u6298\u53E0\u5F0F\u5206\u7C7B\u5BFC\u822A\uFF08\u4E0E MobileSidebarMenu \u76F8\u540C\u7684 currentMenu \u5207\u6362\u6A21\u5F0F\uFF09\n * \u4E09\u7EA7\u83DC\u5355\uFF1A\u5BF9\u5E94\u5217\u7684\u7EAF\u6587\u5B57\u94FE\u63A5\u5217\u8868\n */\nexport const MobileTextLinksMenu = ({\n textlinksCategoriesMetadata,\n textlinksColumnsMetadata,\n}: {\n textlinksCategoriesMetadata: any\n textlinksColumnsMetadata: any\n}) => {\n const { currentMenu, setCurrentMenu, subSubCategory, setSubSubCategory, onSidebarNavClick } = useNavContext()\n const { locale = 'us' } = useAiuiContext()\n const [expandedSubcategory, setExpandedSubcategory] = useState<{ index: number; open: boolean }[]>([])\n const [activeSubSubcategoryIndex, setActiveSubSubcategoryIndex] = useState(-1)\n\n useEffect(() => {\n const subcategories = textlinksCategoriesMetadata?.subcategories\n if (!subcategories?.length) return\n setExpandedSubcategory(subcategories.map((_: any, index: number) => ({ index, open: false })))\n }, [textlinksCategoriesMetadata])\n\n // \u901A\u8FC7 context \u7684 subSubCategory \u5339\u914D\u4E09\u7EA7\u5217\u6570\u636E\n const matchColumnsMetadata = useMemo(() => {\n if (!subSubCategory) return null\n return (\n textlinksColumnsMetadata?.find(\n (item: any) => item?.label?.toLowerCase() === subSubCategory?.label?.toLowerCase()\n ) || null\n )\n }, [subSubCategory, textlinksColumnsMetadata])\n\n // \u70B9\u51FB\u6709\u5B50\u9879\u7684 subcategory \u2014 \u53EA\u5C55\u5F00\u6298\u53E0\uFF0C\u4E0D\u8DF3\u7EA7\n // \u70B9\u51FB\u65E0\u5B50\u9879\u7684 subcategory \u2014 \u76F4\u63A5\u8DF3\u4E09\u7EA7\n const handleSubcategoryClick = useCallback(\n (subItem: any, index: number) => {\n const hasSubSubCategories = Array.isArray(subItem?.subSubCategories) && subItem?.subSubCategories?.length > 0\n\n if (!hasSubSubCategories) {\n setSubSubCategory?.(subItem)\n setCurrentMenu?.(HeaderNavigationMenu.Third)\n return\n }\n\n setExpandedSubcategory(prev => prev.map((item, i) => ({ ...item, open: i === index ? !item.open : false })))\n },\n [setCurrentMenu, setSubSubCategory]\n )\n\n // \u70B9\u51FB\u6709\u5B50\u9879\u7684\u5B50\u9879 \u2014 \u5199\u5165 context \u5E76\u8DF3\u4E09\u7EA7\n const handleSubSubcategoryClick = useCallback(\n (subSubItem: any, index: number, subSubindex: number) => {\n setSubSubCategory?.(subSubItem)\n setCurrentMenu?.(HeaderNavigationMenu.Third)\n setActiveSubSubcategoryIndex(subSubindex)\n setExpandedSubcategory(prev => prev.map(item => ({ ...item, open: item.index === index })))\n onSidebarNavClick?.(subSubItem, subSubindex)\n },\n [setCurrentMenu, setSubSubCategory, onSidebarNavClick]\n )\n\n const MobileTextLinksMenuComp = useMemo(() => {\n switch (currentMenu) {\n case HeaderNavigationMenu.Secondary:\n return (\n // \u4E8C\u7EA7\u83DC\u5355\uFF1A\u6298\u53E0\u5F0F\u5206\u7C7B\u5BFC\u822A + \u5E95\u90E8 CTA\n <div className=\"tablet:px-8 laptop:px-16 flex h-full flex-col gap-8 p-4\">\n <div>\n {textlinksCategoriesMetadata?.subcategories?.map((subItem: any, index: number) => {\n const hasSubSubCategory =\n Array.isArray(subItem?.subSubCategories) && subItem?.subSubCategories?.length > 0\n const isExpanded = expandedSubcategory?.find(item => item.index === index)?.open\n\n return (\n <div key={`mobile-textlinks-subcategory-${subItem?.label || ''}-${index}`}>\n <MenuItem\n label={subItem?.label}\n active={isExpanded}\n onClick={() => {\n handleSubcategoryClick(subItem, index)\n onSidebarNavClick?.(subItem, index)\n }}\n />\n\n {isExpanded && hasSubSubCategory && (\n <div className=\"flex flex-col\" role=\"menu\">\n {subItem.subSubCategories?.map((subSubItem: any, subSubindex: number) => (\n <button\n key={`mobile-textlinks-subSubItem-${index}-${subSubindex}`}\n onClick={() => handleSubSubcategoryClick(subSubItem, index, subSubindex)}\n className={cn(\n 'w-full cursor-pointer border-0 bg-transparent px-4 py-3 text-left hover:bg-[#F5F5F7]',\n {\n 'bg-[#F5F5F7]': activeSubSubcategoryIndex === subSubindex,\n }\n )}\n role=\"menuitem\"\n aria-label={subSubItem.label}\n >\n <Text html={subSubItem.label} className=\"text-sm font-bold leading-[1.4] text-[#4A4C56]\" />\n </button>\n ))}\n </div>\n )}\n </div>\n )\n })}\n </div>\n\n {/* \u5E95\u90E8 CTA */}\n <div className=\"tablet:items-start flex flex-col items-center gap-4\">\n {textlinksCategoriesMetadata?.primary && (\n <Button\n as=\"a\"\n href={`${getLocalizedPath(textlinksCategoriesMetadata?.primary?.url, locale)}?ref=${textlinksCategoriesMetadata?.primary?.label}_shopall`}\n variant=\"primary\"\n size=\"lg\"\n className=\"tablet:w-auto w-full text-base\"\n >\n {textlinksCategoriesMetadata?.primary?.label}\n </Button>\n )}\n {textlinksCategoriesMetadata?.secondary && (\n <Button\n as=\"a\"\n href={getLocalizedPath(textlinksCategoriesMetadata?.secondary?.url, locale)}\n variant=\"link\"\n size=\"lg\"\n className=\"tablet:w-auto tablet:px-0 w-full py-0 text-base\"\n >\n {textlinksCategoriesMetadata?.secondary?.label}\n </Button>\n )}\n </div>\n </div>\n )\n\n case HeaderNavigationMenu.Third:\n return (\n // \u4E09\u7EA7\u83DC\u5355\uFF1AmatchColumnsMetadata \u7684\u591A\u5217\u6587\u5B57\u94FE\u63A5\u5E73\u94FA\u5C55\u793A\n <div className=\"tablet:px-8 laptop:px-16 flex flex-col gap-6 p-4\">\n {matchColumnsMetadata?.columns?.map((col: any, colIndex: number) => (\n <div key={`mobile-textlinks-col-${col?.label || ''}-${colIndex}`} className=\"flex flex-col gap-2\">\n {col?.label && (\n <Text html={col.label} as=\"p\" className=\"text-sm font-bold leading-[1.4] text-[#6D6D6F]\" />\n )}\n <div className=\"flex flex-col\">\n {col?.links?.map((linkItem: any, linkIndex: number) => (\n <div\n key={`mobile-textlinks-link-${linkItem?.label || ''}-${linkIndex}`}\n className=\"flex min-h-[36px] items-center gap-1 py-2\"\n >\n <Link\n href={getLocalizedPath(linkItem?.url, locale)}\n asChild={!linkItem?.url}\n className=\"text-sm font-bold leading-[1.4] no-underline\"\n >\n {linkItem.label}\n </Link>\n {linkItem?.badge && (\n <Text\n as=\"p\"\n html={linkItem.badge}\n className=\"h-[24px] whitespace-nowrap rounded-full border-[1.6px] border-[#005D8E] px-[6px] text-xs font-bold !leading-[22px] text-[#005D8E]\"\n />\n )}\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n )\n\n default:\n return null\n }\n }, [\n currentMenu,\n textlinksCategoriesMetadata,\n expandedSubcategory,\n activeSubSubcategoryIndex,\n matchColumnsMetadata,\n handleSubcategoryClick,\n handleSubSubcategoryClick,\n onSidebarNavClick,\n locale,\n ])\n\n return MobileTextLinksMenuComp\n}\n\nMobileTextLinksMenu.displayName = 'MobileTextLinksMenu'\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["MobileTextLinksMenu_exports", "__export", "MobileTextLinksMenu", "__toCommonJS", "import_jsx_runtime", "import_react", "import_components", "import_utils", "import_NavProvider", "import_AiuiProvider", "import_types", "import_MobileMenuComponents", "textlinksCategoriesMetadata", "textlinksColumnsMetadata", "currentMenu", "setCurrentMenu", "subSubCategory", "setSubSubCategory", "onSidebarNavClick", "locale", "expandedSubcategory", "setExpandedSubcategory", "activeSubSubcategoryIndex", "setActiveSubSubcategoryIndex", "subcategories", "_", "index", "matchColumnsMetadata", "item", "handleSubcategoryClick", "subItem", "prev", "i", "handleSubSubcategoryClick", "subSubItem", "subSubindex", "hasSubSubCategory", "isExpanded", "col", "colIndex", "linkItem", "linkIndex"]
|
|
7
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* TextLinks 下拉
|
|
4
|
-
* 左侧:折叠式分类导航(含子项)
|
|
5
|
-
* 右侧:多列纯文字链接列表(支持 badge 标签)
|
|
6
|
-
*/
|
|
7
|
-
export declare const TextLinksDropdown: React.MemoExoticComponent<({ textlinksCategoriesMetadata, textlinksColumnsMetadata, }: {
|
|
8
|
-
textlinksCategoriesMetadata: any;
|
|
9
|
-
textlinksColumnsMetadata: any;
|
|
10
|
-
}) => import("react/jsx-runtime").JSX.Element>;
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var E=Object.create;var g=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var T=(l,t)=>{for(var d in t)g(l,d,{get:t[d],enumerable:!0})},N=(l,t,d,f)=>{if(t&&typeof t=="object"||typeof t=="function")for(let p of D(t))!R.call(l,p)&&p!==d&&g(l,p,{get:()=>t[p],enumerable:!(f=B(t,p))||f.enumerable});return l};var j=(l,t,d)=>(d=l!=null?E(O(l)):{},N(t||!l||!l.__esModule?g(d,"default",{value:l,enumerable:!0}):d,l)),_=l=>N(g({},"__esModule",{value:!0}),l);var W={};T(W,{TextLinksDropdown:()=>$});module.exports=_(W);var e=require("react/jsx-runtime"),b=j(require("react")),o=require("../../components/index.js"),m=require("../../helpers/utils.js"),C=require("./icons/index.js"),w=require("./NavProvider.js"),k=require("../AiuiProvider/index.js");const $=b.default.memo(({textlinksCategoriesMetadata:l,textlinksColumnsMetadata:t})=>{const{onSidebarNavClick:d}=(0,w.useNavContext)(),{locale:f="us"}=(0,k.useAiuiContext)(),[p,y]=(0,b.useState)([]),[x,v]=(0,b.useState)(-1),L=(0,b.useRef)(null),h=(0,b.useRef)(null),S=(0,b.useCallback)(()=>{const a=l?.subcategories;if(!a?.length)return;const n=a.findIndex(u=>!!u?.subSubCategories),r=a.findIndex(u=>!u?.subSubCategories),s=a.map((u,i)=>({index:i,open:n===i||r===i}));y(s)},[l]);(0,b.useEffect)(()=>{S()},[S]);const c=(0,b.useMemo)(()=>{const a=l?.subcategories?.[p?.find(n=>n.open)?.index||0];if(!a)return null;if(a?.subSubCategories){const n=a?.subSubCategories?.[x];if(n)return t?.find(r=>r?.label?.toLowerCase()===n?.label?.toLowerCase())||null}return t?.find(n=>n?.label?.toLowerCase()===a?.label?.toLowerCase())||null},[l,p,x,t]),F=(0,b.useCallback)((a,n)=>{const r=n?.subSubCategories?.length>0;v(r?0:-1);const s=h.current;y(u=>u.map((i,A)=>A===a?{...i,open:!i.open}:r?{...i,open:!1}:!s&&x===-1?{...i,open:!1}:s&&!s.hasSubSubCategories&&!r&&x===-1?{...i,open:!1}:i)),h.current={index:a,hasSubSubCategories:r}},[x]),z=(a,n)=>{y(r=>r.map(s=>s.index===a?{...s,open:!0}:{...s,open:!1})),v(n)};return(0,e.jsxs)(o.Container,{childClassName:"lg-desktop:gap-12 flex bg-white gap-8",children:[(0,e.jsxs)("div",{className:"lg-desktop:basis-[356px] flex basis-[284px] flex-col gap-4 py-4",style:{userSelect:"none"},ref:L,children:[(0,e.jsx)("div",{className:"desktop:h-[416px] flex flex-col overflow-y-auto",style:{scrollbarWidth:"none",msOverflowStyle:"none"},children:l?.subcategories?.map((a,n)=>{const r=Array.isArray(a?.subSubCategories)&&a?.subSubCategories?.length>0,s=p?.find(u=>u.index===n)?.open;return(0,e.jsxs)("div",{children:[(0,e.jsxs)("button",{className:(0,m.cn)("rounded-sidebar-shelf flex w-full cursor-pointer items-center justify-between border-0 bg-transparent text-left",{"bg-[#F5F5F7]":!r&&s}),onClick:()=>{F(n,a),d?.(a,n)},"aria-expanded":r?s:void 0,"aria-haspopup":r?"true":void 0,children:[(0,e.jsx)(o.Text,{html:a.label,className:"p-4 text-sm font-bold leading-[1.4]"}),r&&(0,e.jsx)(C.DownArrow,{"aria-hidden":"true",className:(0,m.cn)("size-4",{"rotate-180":s})})]}),s&&r&&(0,e.jsx)("div",{className:"flex flex-col",role:"menu",children:a.subSubCategories?.map((u,i)=>(0,e.jsx)("button",{onClick:()=>{z(n,i),d?.(u,i)},className:(0,m.cn)("rounded-sidebar-shelf w-full cursor-pointer border-0 bg-transparent px-6 py-4 text-left leading-none hover:bg-[#F5F5F7]",{"bg-[#F5F5F7]":x===i}),role:"menuitem","aria-label":u.label,children:(0,e.jsx)(o.Text,{html:u.label,className:"text-sm font-bold leading-[1.4] text-[#4A4C56]"})},`textlinks-subSubItem-${n}-${i}`))})]},`${a?.label||""}textlinks-subcategoryItem-${n}`)})}),l&&(0,e.jsx)("div",{className:"flex",children:(0,e.jsxs)("div",{className:"flex flex-col gap-4",children:[l?.primary&&(0,e.jsx)(o.Button,{as:"a",href:`${(0,m.getLocalizedPath)(l?.primary?.url,f)}?ref=${l?.primary?.label}_shopall`,variant:"primary",size:"lg",className:"lg-desktop:text-base text-sm",children:l?.primary?.label}),l?.secondary&&(0,e.jsx)(o.Button,{as:"a",href:(0,m.getLocalizedPath)(l?.secondary?.url,f),variant:"link",size:"lg",iconClassName:"size-4",className:"lg-desktop:text-base justify-start !p-0 text-sm",children:l?.secondary?.label})]})})]}),(0,e.jsx)("div",{className:"flex-1 py-4",children:c&&(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{className:"mb-4 flex items-center justify-between",children:[(()=>{const a=(0,e.jsxs)(e.Fragment,{children:[c?.label&&(0,e.jsx)(o.Text,{html:c.label,className:"lg-desktop:text-2xl text-xl font-bold leading-[1.2]"}),c?.primary&&(0,e.jsx)(o.Text,{html:c.primary.label,className:"lg-desktop:text-base text-sm font-bold leading-[1.2]"})]});return c?.primary?.url?(0,e.jsx)(o.Button,{as:"a",href:`${(0,m.getLocalizedPath)(c.primary.url,f)}?ref=${c.label}_viewmore`,variant:"link",size:"lg",iconClassName:"size-4",className:"flex items-center justify-start gap-2 !p-0 no-underline",children:a}):(0,e.jsx)("div",{className:"flex items-center gap-2",children:a})})(),c?.badge&&(0,e.jsx)(o.Text,{html:c.badge,className:"h-[24px] rounded-full border-[1.6px] border-[var(--brand-color-0)] px-[6px] text-sm font-bold !leading-[22px] text-[var(--brand-color-0)]"})]}),(0,e.jsx)("div",{className:"desktop:h-[416px] grid grid-cols-3 gap-4 overflow-y-auto",style:{scrollbarWidth:"none",msOverflowStyle:"none"},children:c?.columns?.map((a,n)=>(0,e.jsxs)("div",{className:"flex flex-col gap-2 pr-12",children:[a?.label&&(0,e.jsx)(o.Text,{html:a.label,as:"p",className:"text-sm font-bold leading-[1.4] text-[#4A4C56]"}),(0,e.jsx)("div",{className:"flex flex-col",children:a?.links?.map((r,s)=>(0,e.jsxs)("div",{className:"flex min-h-[36px] items-center gap-1 py-2",children:[(0,e.jsx)(o.Link,{href:(0,m.getLocalizedPath)(r?.url,f),asChild:!r?.url,className:"text-sm font-bold leading-[1.4] no-underline hover:opacity-70",children:r.label}),r?.badge&&(0,e.jsx)(o.Text,{as:"p",html:r.badge,className:"text-brand-0 border-brand-0 h-[24px] whitespace-nowrap rounded-full border-[1.6px] px-[6px] text-xs font-bold !leading-[22px]"})]},`textlinks-link-${r?.label||""}-${s}`))})]},`textlinks-col-${a?.label||""}-${n}`))})]})})]})});$.displayName="TextLinksDropdown";
|
|
2
|
-
//# sourceMappingURL=TextLinksDropdown.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/biz-components/HeaderNavigation/TextLinksDropdown.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Button, Container, Text, Link } from '../../components/index.js'\nimport { cn, getLocalizedPath } from '../../helpers/utils.js'\nimport { DownArrow } from './icons/index.js'\nimport { useNavContext } from './NavProvider.js'\nimport { useAiuiContext } from '../AiuiProvider/index.js'\n\n/**\n * TextLinks \u4E0B\u62C9\n * \u5DE6\u4FA7\uFF1A\u6298\u53E0\u5F0F\u5206\u7C7B\u5BFC\u822A\uFF08\u542B\u5B50\u9879\uFF09\n * \u53F3\u4FA7\uFF1A\u591A\u5217\u7EAF\u6587\u5B57\u94FE\u63A5\u5217\u8868\uFF08\u652F\u6301 badge \u6807\u7B7E\uFF09\n */\nexport const TextLinksDropdown = React.memo(\n ({\n textlinksCategoriesMetadata,\n textlinksColumnsMetadata,\n }: {\n textlinksCategoriesMetadata: any\n textlinksColumnsMetadata: any\n }) => {\n const { onSidebarNavClick } = useNavContext()\n const { locale = 'us' } = useAiuiContext()\n const [expandedSubcategory, setExpandedSubcategory] = useState<{ index: number; open: boolean }[]>([])\n const [activeSubSubcategoryIndex, setActiveSubSubcategoryIndex] = useState(-1)\n const sidebarRef = useRef<HTMLDivElement>(null)\n const lastClickRef = useRef<{ index: number; hasSubSubCategories: boolean } | null>(null)\n\n const initExpandedSubcategory = useCallback(() => {\n const subcategories = textlinksCategoriesMetadata?.subcategories\n if (!subcategories?.length) return\n\n const withSubSubCategoriesIndex = subcategories.findIndex((item: any) => !!item?.subSubCategories)\n const withoutSubSubCategoriesIndex = subcategories.findIndex((item: any) => !item?.subSubCategories)\n\n const expandedStates = subcategories.map((_: any, index: number) => ({\n index,\n open: withSubSubCategoriesIndex === index || withoutSubSubCategoriesIndex === index,\n }))\n\n setExpandedSubcategory(expandedStates)\n }, [textlinksCategoriesMetadata])\n\n useEffect(() => {\n initExpandedSubcategory()\n }, [initExpandedSubcategory])\n\n // \u901A\u8FC7\u5F53\u524D\u6FC0\u6D3B\u7684 subcategory/subSubCategory \u7684 label \u5339\u914D\u53F3\u4FA7\u5217\u6570\u636E\n const matchColumnsMetadata = useMemo(() => {\n const subCategory =\n textlinksCategoriesMetadata?.subcategories?.[expandedSubcategory?.find(item => item.open)?.index || 0]\n\n if (!subCategory) return null\n\n if (subCategory?.subSubCategories) {\n const activeSubSubcategory = subCategory?.subSubCategories?.[activeSubSubcategoryIndex]\n if (activeSubSubcategory) {\n return (\n textlinksColumnsMetadata?.find(\n (item: any) => item?.label?.toLowerCase() === activeSubSubcategory?.label?.toLowerCase()\n ) || null\n )\n }\n }\n\n return (\n textlinksColumnsMetadata?.find(\n (item: any) => item?.label?.toLowerCase() === subCategory?.label?.toLowerCase()\n ) || null\n )\n }, [textlinksCategoriesMetadata, expandedSubcategory, activeSubSubcategoryIndex, textlinksColumnsMetadata])\n\n const handleSubcategoryOpen = useCallback(\n (index: number, subcategoryItem: any) => {\n const hasSubSubCategories = subcategoryItem?.subSubCategories?.length > 0\n hasSubSubCategories ? setActiveSubSubcategoryIndex(0) : setActiveSubSubcategoryIndex(-1)\n\n const lastClick = lastClickRef.current\n\n setExpandedSubcategory(prev =>\n prev.map((item, i) => {\n if (i === index) {\n return { ...item, open: !item.open }\n }\n if (hasSubSubCategories) {\n return { ...item, open: false }\n }\n if (!lastClick && activeSubSubcategoryIndex === -1) {\n return { ...item, open: false }\n }\n if (\n lastClick &&\n !lastClick.hasSubSubCategories &&\n !hasSubSubCategories &&\n activeSubSubcategoryIndex === -1\n ) {\n return { ...item, open: false }\n }\n return item\n })\n )\n\n lastClickRef.current = { index, hasSubSubCategories }\n },\n [activeSubSubcategoryIndex]\n )\n\n const handleSubSubcategoryOpen = (index: number, subSubindex: number) => {\n setExpandedSubcategory(prev =>\n prev.map(item => (item.index === index ? { ...item, open: true } : { ...item, open: false }))\n )\n setActiveSubSubcategoryIndex(subSubindex)\n }\n\n return (\n <Container childClassName=\"lg-desktop:gap-12 flex bg-white gap-8\">\n {/* \u5DE6\u4FA7\uFF1A\u6298\u53E0\u5F0F\u5206\u7C7B\u5BFC\u822A */}\n <div\n className=\"lg-desktop:basis-[356px] flex basis-[284px] flex-col gap-4 py-4\"\n style={{ userSelect: 'none' }}\n ref={sidebarRef}\n >\n <div\n className=\"desktop:h-[416px] flex flex-col overflow-y-auto\"\n style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}\n >\n {textlinksCategoriesMetadata?.subcategories?.map((subItem: any, index: number) => {\n const hasSubSubCategory =\n Array.isArray(subItem?.subSubCategories) && subItem?.subSubCategories?.length > 0\n const isExpanded = expandedSubcategory?.find(item => item.index === index)?.open\n return (\n <div key={`${subItem?.label || ''}textlinks-subcategoryItem-${index}`}>\n <button\n className={cn(\n 'rounded-sidebar-shelf flex w-full cursor-pointer items-center justify-between border-0 bg-transparent text-left',\n {\n 'bg-[#F5F5F7]': !hasSubSubCategory && isExpanded,\n }\n )}\n onClick={() => {\n handleSubcategoryOpen(index, subItem)\n onSidebarNavClick?.(subItem, index)\n }}\n aria-expanded={hasSubSubCategory ? isExpanded : undefined}\n aria-haspopup={hasSubSubCategory ? 'true' : undefined}\n >\n <Text html={subItem.label} className=\"p-4 text-sm font-bold leading-[1.4]\" />\n {hasSubSubCategory && (\n <DownArrow\n aria-hidden=\"true\"\n className={cn('size-4', {\n ['rotate-180']: isExpanded,\n })}\n />\n )}\n </button>\n {isExpanded && hasSubSubCategory && (\n <div className=\"flex flex-col\" role=\"menu\">\n {subItem.subSubCategories?.map((subSubItem: any, subSubindex: number) => (\n <button\n onClick={() => {\n handleSubSubcategoryOpen(index, subSubindex)\n onSidebarNavClick?.(subSubItem, subSubindex)\n }}\n key={`textlinks-subSubItem-${index}-${subSubindex}`}\n className={cn(\n 'rounded-sidebar-shelf w-full cursor-pointer border-0 bg-transparent px-6 py-4 text-left leading-none hover:bg-[#F5F5F7]',\n {\n 'bg-[#F5F5F7]': activeSubSubcategoryIndex === subSubindex,\n }\n )}\n role=\"menuitem\"\n aria-label={subSubItem.label}\n >\n <Text html={subSubItem.label} className=\"text-sm font-bold leading-[1.4] text-[#4A4C56]\" />\n </button>\n ))}\n </div>\n )}\n </div>\n )\n })}\n </div>\n\n {/* \u5DE6\u4FA7\u5E95\u90E8 CTA */}\n {textlinksCategoriesMetadata && (\n <div className=\"flex\">\n <div className=\"flex flex-col gap-4\">\n {textlinksCategoriesMetadata?.primary && (\n <Button\n as=\"a\"\n href={`${getLocalizedPath(textlinksCategoriesMetadata?.primary?.url, locale)}?ref=${textlinksCategoriesMetadata?.primary?.label}_shopall`}\n variant=\"primary\"\n size=\"lg\"\n className=\"lg-desktop:text-base text-sm\"\n >\n {textlinksCategoriesMetadata?.primary?.label}\n </Button>\n )}\n {textlinksCategoriesMetadata?.secondary && (\n <Button\n as=\"a\"\n href={getLocalizedPath(textlinksCategoriesMetadata?.secondary?.url, locale)}\n variant=\"link\"\n size=\"lg\"\n iconClassName=\"size-4\"\n className=\"lg-desktop:text-base justify-start !p-0 text-sm\"\n >\n {textlinksCategoriesMetadata?.secondary?.label}\n </Button>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* \u53F3\u4FA7\uFF1A\u591A\u5217\u7EAF\u6587\u5B57\u94FE\u63A5 */}\n <div className=\"flex-1 py-4\">\n {matchColumnsMetadata && (\n <>\n {/* \u53F3\u4FA7\u6807\u9898\u884C */}\n <div className=\"mb-4 flex items-center justify-between\">\n {(() => {\n const labelContent = (\n <>\n {matchColumnsMetadata?.label && (\n <Text\n html={matchColumnsMetadata.label}\n className=\"lg-desktop:text-2xl text-xl font-bold leading-[1.2]\"\n />\n )}\n {matchColumnsMetadata?.primary && (\n <Text\n html={matchColumnsMetadata.primary.label}\n className=\"lg-desktop:text-base text-sm font-bold leading-[1.2]\"\n />\n )}\n </>\n )\n return matchColumnsMetadata?.primary?.url ? (\n <Button\n as=\"a\"\n href={`${getLocalizedPath(matchColumnsMetadata.primary.url, locale)}?ref=${matchColumnsMetadata.label}_viewmore`}\n variant=\"link\"\n size=\"lg\"\n iconClassName=\"size-4\"\n className=\"flex items-center justify-start gap-2 !p-0 no-underline\"\n >\n {labelContent}\n </Button>\n ) : (\n <div className=\"flex items-center gap-2\">{labelContent}</div>\n )\n })()}\n {matchColumnsMetadata?.badge && (\n <Text\n html={matchColumnsMetadata.badge}\n className=\"h-[24px] rounded-full border-[1.6px] border-[var(--brand-color-0)] px-[6px] text-sm font-bold !leading-[22px] text-[var(--brand-color-0)]\"\n />\n )}\n </div>\n\n {/* \u591A\u5217\u6587\u5B57\u94FE\u63A5 \u2014 \u56FA\u5B9A3\u5217\u7B49\u5BBD\uFF0C\u5217\u95F4\u8DDD gap-4\uFF0C\u6BCF\u5217 pr-12 */}\n <div\n className=\"desktop:h-[416px] grid grid-cols-3 gap-4 overflow-y-auto\"\n style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}\n >\n {matchColumnsMetadata?.columns?.map((col: any, colIndex: number) => (\n <div key={`textlinks-col-${col?.label || ''}-${colIndex}`} className=\"flex flex-col gap-2 pr-12\">\n {col?.label && (\n <Text html={col.label} as=\"p\" className=\"text-sm font-bold leading-[1.4] text-[#4A4C56]\" />\n )}\n <div className=\"flex flex-col\">\n {col?.links?.map((linkItem: any, linkIndex: number) => (\n <div\n key={`textlinks-link-${linkItem?.label || ''}-${linkIndex}`}\n className=\"flex min-h-[36px] items-center gap-1 py-2\"\n >\n <Link\n href={getLocalizedPath(linkItem?.url, locale)}\n asChild={!linkItem?.url}\n className=\"text-sm font-bold leading-[1.4] no-underline hover:opacity-70\"\n >\n {linkItem.label}\n </Link>\n {linkItem?.badge && (\n <Text\n as=\"p\"\n html={linkItem.badge}\n className=\"text-brand-0 border-brand-0 h-[24px] whitespace-nowrap rounded-full border-[1.6px] px-[6px] text-xs font-bold !leading-[22px]\"\n />\n )}\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n </Container>\n )\n }\n)\n\nTextLinksDropdown.displayName = 'TextLinksDropdown'\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["TextLinksDropdown_exports", "__export", "TextLinksDropdown", "__toCommonJS", "import_jsx_runtime", "import_react", "import_components", "import_utils", "import_icons", "import_NavProvider", "import_AiuiProvider", "React", "textlinksCategoriesMetadata", "textlinksColumnsMetadata", "onSidebarNavClick", "locale", "expandedSubcategory", "setExpandedSubcategory", "activeSubSubcategoryIndex", "setActiveSubSubcategoryIndex", "sidebarRef", "lastClickRef", "initExpandedSubcategory", "subcategories", "withSubSubCategoriesIndex", "item", "withoutSubSubCategoriesIndex", "expandedStates", "_", "index", "matchColumnsMetadata", "subCategory", "activeSubSubcategory", "handleSubcategoryOpen", "subcategoryItem", "hasSubSubCategories", "lastClick", "prev", "i", "handleSubSubcategoryOpen", "subSubindex", "subItem", "hasSubSubCategory", "isExpanded", "subSubItem", "labelContent", "col", "colIndex", "linkItem", "linkIndex"]
|
|
7
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
export interface WebPushPopupProps {
|
|
3
|
-
/** 弹窗标题,不传则不渲染标题 */
|
|
4
|
-
title?: string;
|
|
5
|
-
/** 弹窗描述文案,不传则不渲染描述 */
|
|
6
|
-
description?: string;
|
|
7
|
-
/** "稍后"按钮文案,默认 'Later' */
|
|
8
|
-
dismissText?: string;
|
|
9
|
-
/** "订阅"按钮文案,默认 'Allow' */
|
|
10
|
-
subscribeText?: string;
|
|
11
|
-
/** 图标区域内容,默认渲染 🔔 */
|
|
12
|
-
icon?: React.ReactNode;
|
|
13
|
-
/** 用户点击"订阅"按钮时触发 */
|
|
14
|
-
onSubscribe: () => void;
|
|
15
|
-
/** 用户点击"稍后"按钮时触发 */
|
|
16
|
-
onDismiss: () => void;
|
|
17
|
-
/** 额外的容器 className */
|
|
18
|
-
className?: string;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* WebPushPopup
|
|
22
|
-
*
|
|
23
|
-
* Emarsys Web Push 订阅引导弹窗(非侵入式,固定在右上角)。
|
|
24
|
-
* 所有文案、图标均通过 props 传入,不硬编码,支持多品牌自定义。
|
|
25
|
-
*
|
|
26
|
-
* 配合 `useEmarsysWebPush` Hook 使用:
|
|
27
|
-
*
|
|
28
|
-
* ```tsx
|
|
29
|
-
* import { useEmarsysWebPush, WebPushPopup } from '@anker-in/headless-ui/biz'
|
|
30
|
-
*
|
|
31
|
-
* const { shouldShowPopup, subscribe, dismissPopup } = useEmarsysWebPush({ ... })
|
|
32
|
-
*
|
|
33
|
-
* {shouldShowPopup && (
|
|
34
|
-
* <WebPushPopup
|
|
35
|
-
* title="Welcome to Anker"
|
|
36
|
-
* description="Get the latest deals and product updates."
|
|
37
|
-
* onSubscribe={subscribe}
|
|
38
|
-
* onDismiss={dismissPopup}
|
|
39
|
-
* />
|
|
40
|
-
* )}
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
declare const WebPushPopup: React.NamedExoticComponent<WebPushPopupProps>;
|
|
44
|
-
export default WebPushPopup;
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";"use client";var x=Object.create;var n=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty;var N=(e,t)=>{for(var s in t)n(e,s,{get:t[s],enumerable:!0})},d=(e,t,s,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of h(t))!P.call(e,o)&&o!==s&&n(e,o,{get:()=>t[o],enumerable:!(l=v(t,o))||l.enumerable});return e};var w=(e,t,s)=>(s=e!=null?x(y(e)):{},d(t||!e||!e.__esModule?n(s,"default",{value:e,enumerable:!0}):s,e)),k=e=>d(n({},"__esModule",{value:!0}),e);var C={};N(C,{default:()=>W});module.exports=k(C);var i=require("react/jsx-runtime"),a=w(require("react")),u=require("../../helpers/utils.js");const c=a.default.memo(function({title:t,description:s,dismissText:l="Later",subscribeText:o="Allow",icon:b="\u{1F514}",onSubscribe:r,onDismiss:p,className:m}){const f=(0,a.useCallback)(()=>{r()},[r]),g=(0,a.useCallback)(()=>{p()},[p]);return(0,i.jsxs)("div",{role:"dialog","aria-modal":"false","aria-labelledby":t?"web-push-popup-title":void 0,className:(0,u.cn)("fixed right-4 top-4 z-[9999]","laptop:w-80 w-72","flex items-start gap-3","rounded-xl bg-white shadow-lg","border border-black/5","p-4",m),children:[(0,i.jsx)("span",{className:"mt-0.5 shrink-0 text-2xl leading-none","aria-hidden":"true",children:b}),(0,i.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col gap-2",children:[t&&(0,i.jsx)("p",{id:"web-push-popup-title",className:"truncate text-sm font-semibold leading-snug text-gray-900",children:t}),s&&(0,i.jsx)("p",{className:"text-xs leading-relaxed text-gray-500",children:s}),(0,i.jsxs)("div",{className:"flex items-center justify-end gap-2 pt-0.5",children:[(0,i.jsx)("button",{type:"button",onClick:g,className:(0,u.cn)("rounded-md px-3 py-1.5","text-xs font-medium text-gray-400","transition-colors duration-150","hover:bg-gray-100 hover:text-gray-600","focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400"),children:l}),(0,i.jsx)("button",{type:"button",onClick:f,className:(0,u.cn)("rounded-md px-3 py-1.5","text-xs font-medium text-white","bg-gray-900","transition-colors duration-150","hover:bg-gray-700","focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-900"),children:o})]})]})]})});c.displayName="WebPushPopup";var W=c;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/biz-components/WebPushPopup/index.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport React, { useCallback } from 'react'\nimport { cn } from '../../helpers/utils.js'\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Types\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface WebPushPopupProps {\n /** \u5F39\u7A97\u6807\u9898\uFF0C\u4E0D\u4F20\u5219\u4E0D\u6E32\u67D3\u6807\u9898 */\n title?: string\n /** \u5F39\u7A97\u63CF\u8FF0\u6587\u6848\uFF0C\u4E0D\u4F20\u5219\u4E0D\u6E32\u67D3\u63CF\u8FF0 */\n description?: string\n /** \"\u7A0D\u540E\"\u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'Later' */\n dismissText?: string\n /** \"\u8BA2\u9605\"\u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4 'Allow' */\n subscribeText?: string\n /** \u56FE\u6807\u533A\u57DF\u5185\u5BB9\uFF0C\u9ED8\u8BA4\u6E32\u67D3 \uD83D\uDD14 */\n icon?: React.ReactNode\n /** \u7528\u6237\u70B9\u51FB\"\u8BA2\u9605\"\u6309\u94AE\u65F6\u89E6\u53D1 */\n onSubscribe: () => void\n /** \u7528\u6237\u70B9\u51FB\"\u7A0D\u540E\"\u6309\u94AE\u65F6\u89E6\u53D1 */\n onDismiss: () => void\n /** \u989D\u5916\u7684\u5BB9\u5668 className */\n className?: string\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Component\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * WebPushPopup\n *\n * Emarsys Web Push \u8BA2\u9605\u5F15\u5BFC\u5F39\u7A97\uFF08\u975E\u4FB5\u5165\u5F0F\uFF0C\u56FA\u5B9A\u5728\u53F3\u4E0A\u89D2\uFF09\u3002\n * \u6240\u6709\u6587\u6848\u3001\u56FE\u6807\u5747\u901A\u8FC7 props \u4F20\u5165\uFF0C\u4E0D\u786C\u7F16\u7801\uFF0C\u652F\u6301\u591A\u54C1\u724C\u81EA\u5B9A\u4E49\u3002\n *\n * \u914D\u5408 `useEmarsysWebPush` Hook \u4F7F\u7528\uFF1A\n *\n * ```tsx\n * import { useEmarsysWebPush, WebPushPopup } from '@anker-in/headless-ui/biz'\n *\n * const { shouldShowPopup, subscribe, dismissPopup } = useEmarsysWebPush({ ... })\n *\n * {shouldShowPopup && (\n * <WebPushPopup\n * title=\"Welcome to Anker\"\n * description=\"Get the latest deals and product updates.\"\n * onSubscribe={subscribe}\n * onDismiss={dismissPopup}\n * />\n * )}\n * ```\n */\nconst WebPushPopup = React.memo(function WebPushPopup({\n title,\n description,\n dismissText = 'Later',\n subscribeText = 'Allow',\n icon = '\uD83D\uDD14',\n onSubscribe,\n onDismiss,\n className,\n}: WebPushPopupProps) {\n const handleSubscribe = useCallback(() => {\n onSubscribe()\n }, [onSubscribe])\n\n const handleDismiss = useCallback(() => {\n onDismiss()\n }, [onDismiss])\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={title ? 'web-push-popup-title' : undefined}\n className={cn(\n 'fixed right-4 top-4 z-[9999]',\n 'laptop:w-80 w-72',\n 'flex items-start gap-3',\n 'rounded-xl bg-white shadow-lg',\n 'border border-black/5',\n 'p-4',\n className\n )}\n >\n {/* Icon */}\n <span className=\"mt-0.5 shrink-0 text-2xl leading-none\" aria-hidden=\"true\">\n {icon}\n </span>\n\n {/* Content */}\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n {title && (\n <p id=\"web-push-popup-title\" className=\"truncate text-sm font-semibold leading-snug text-gray-900\">\n {title}\n </p>\n )}\n\n {description && <p className=\"text-xs leading-relaxed text-gray-500\">{description}</p>}\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-2 pt-0.5\">\n <button\n type=\"button\"\n onClick={handleDismiss}\n className={cn(\n 'rounded-md px-3 py-1.5',\n 'text-xs font-medium text-gray-400',\n 'transition-colors duration-150',\n 'hover:bg-gray-100 hover:text-gray-600',\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-400'\n )}\n >\n {dismissText}\n </button>\n\n <button\n type=\"button\"\n onClick={handleSubscribe}\n className={cn(\n 'rounded-md px-3 py-1.5',\n 'text-xs font-medium text-white',\n 'bg-gray-900',\n 'transition-colors duration-150',\n 'hover:bg-gray-700',\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-900'\n )}\n >\n {subscribeText}\n </button>\n </div>\n </div>\n </div>\n )\n})\n\nWebPushPopup.displayName = 'WebPushPopup'\n\nexport default WebPushPopup\n"],
|
|
5
|
-
"mappings": "ukBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAyFM,IAAAI,EAAA,6BAvFNC,EAAmC,oBACnCC,EAAmB,kCAoDnB,MAAMC,EAAe,EAAAC,QAAM,KAAK,SAAsB,CACpD,MAAAC,EACA,YAAAC,EACA,YAAAC,EAAc,QACd,cAAAC,EAAgB,QAChB,KAAAC,EAAO,YACP,YAAAC,EACA,UAAAC,EACA,UAAAC,CACF,EAAsB,CACpB,MAAMC,KAAkB,eAAY,IAAM,CACxCH,EAAY,CACd,EAAG,CAACA,CAAW,CAAC,EAEVI,KAAgB,eAAY,IAAM,CACtCH,EAAU,CACZ,EAAG,CAACA,CAAS,CAAC,EAEd,SACE,QAAC,OACC,KAAK,SACL,aAAW,QACX,kBAAiBN,EAAQ,uBAAyB,OAClD,aAAW,MACT,+BACA,mBACA,yBACA,gCACA,wBACA,MACAO,CACF,EAGA,oBAAC,QAAK,UAAU,wCAAwC,cAAY,OACjE,SAAAH,EACH,KAGA,QAAC,OAAI,UAAU,qCACZ,UAAAJ,MACC,OAAC,KAAE,GAAG,uBAAuB,UAAU,4DACpC,SAAAA,EACH,EAGDC,MAAe,OAAC,KAAE,UAAU,wCAAyC,SAAAA,EAAY,KAGlF,QAAC,OAAI,UAAU,6CACb,oBAAC,UACC,KAAK,SACL,QAASQ,EACT,aAAW,MACT,yBACA,oCACA,iCACA,wCACA,6GACF,EAEC,SAAAP,EACH,KAEA,OAAC,UACC,KAAK,SACL,QAASM,EACT,aAAW,MACT,yBACA,iCACA,cACA,iCACA,oBACA,6GACF,EAEC,SAAAL,EACH,GACF,GACF,GACF,CAEJ,CAAC,EAEDL,EAAa,YAAc,eAE3B,IAAOL,EAAQK",
|
|
6
|
-
"names": ["WebPushPopup_exports", "__export", "WebPushPopup_default", "__toCommonJS", "import_jsx_runtime", "import_react", "import_utils", "WebPushPopup", "React", "title", "description", "dismissText", "subscribeText", "icon", "onSubscribe", "onDismiss", "className", "handleSubscribe", "handleDismiss"]
|
|
7
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
export interface EmarsysContactInfo {
|
|
2
|
-
/** Emarsys 联系人字段 ID(如 10372) */
|
|
3
|
-
fieldId: number;
|
|
4
|
-
/** 字段值(如用户唯一标识) */
|
|
5
|
-
fieldValue: string;
|
|
6
|
-
}
|
|
7
|
-
export interface EmarsysInitConfig {
|
|
8
|
-
/** Emarsys Domain Code,从后台获取 */
|
|
9
|
-
applicationCode: string;
|
|
10
|
-
/** macOS Safari 16+ 使用 VAPID 替代 APNS */
|
|
11
|
-
enableMacSafariVapid?: boolean;
|
|
12
|
-
/** 默认推送通知标题 */
|
|
13
|
-
defaultNotificationTitle?: string;
|
|
14
|
-
/** 默认推送通知图标 URL */
|
|
15
|
-
defaultNotificationIcon?: string;
|
|
16
|
-
/** 是否自动触发浏览器订阅弹窗,强烈建议设为 false */
|
|
17
|
-
autoSubscribe?: boolean;
|
|
18
|
-
/** 开发阶段开启 SDK 日志 */
|
|
19
|
-
enableLogging?: boolean;
|
|
20
|
-
serviceWorker: {
|
|
21
|
-
/** Service Worker 文件路径(需放在网站根目录) */
|
|
22
|
-
url: string;
|
|
23
|
-
/** VAPID 公钥(Base64 URL-safe 编码) */
|
|
24
|
-
applicationServerPublicKey: string;
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
type EmarsysSdkEventName = 'onReady' | 'onSubscribe' | 'onUnsubscribe' | 'onPermissionPrompt' | 'onPermissionGranted' | 'onPermissionDenied' | 'onSWInitError';
|
|
28
|
-
type EmarsysSdkCommand = ['init', EmarsysInitConfig] | [EmarsysSdkEventName, () => void];
|
|
29
|
-
interface EmarsysSdkApi {
|
|
30
|
-
subscribe: () => void;
|
|
31
|
-
unsubscribe: () => void;
|
|
32
|
-
login: (contactInfo: EmarsysContactInfo) => Promise<boolean>;
|
|
33
|
-
logout: () => Promise<boolean>;
|
|
34
|
-
isSubscribed: () => Promise<boolean>;
|
|
35
|
-
isRegistered: () => boolean;
|
|
36
|
-
customEvent: (eventName: string, payload?: Record<string, unknown>) => Promise<boolean>;
|
|
37
|
-
push: (command: EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void)) => void;
|
|
38
|
-
}
|
|
39
|
-
declare global {
|
|
40
|
-
interface Window {
|
|
41
|
-
WebEmarsysSdk: EmarsysSdkApi | (EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void))[];
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
export interface UseEmarsysWebPushOptions {
|
|
45
|
-
/** Emarsys Domain Code */
|
|
46
|
-
applicationCode: string;
|
|
47
|
-
/** VAPID 公钥 */
|
|
48
|
-
applicationServerPublicKey: string;
|
|
49
|
-
/** Service Worker 路径,默认 'service-worker.js'(不含前导斜杠) */
|
|
50
|
-
serviceWorkerUrl?: string;
|
|
51
|
-
/** 默认通知标题 */
|
|
52
|
-
defaultNotificationTitle?: string;
|
|
53
|
-
/** 默认通知图标 URL */
|
|
54
|
-
defaultNotificationIcon?: string;
|
|
55
|
-
/** 联系人主键字段 ID(由 Emarsys 后台配置) */
|
|
56
|
-
fieldId: number;
|
|
57
|
-
/**
|
|
58
|
-
* 当前用户的联系人标识(如 hashed email / customer ID)。
|
|
59
|
-
* null 表示未登录的匿名访客。
|
|
60
|
-
*/
|
|
61
|
-
contactValue: string | null;
|
|
62
|
-
/** 是否开启调试日志,默认 false */
|
|
63
|
-
enableLogging?: boolean;
|
|
64
|
-
/**
|
|
65
|
-
* 点击"稍后"后的弹窗冷却天数,默认 7 天。
|
|
66
|
-
* 冷却期间不再展示自定义弹窗。
|
|
67
|
-
*/
|
|
68
|
-
dismissCooldownDays?: number;
|
|
69
|
-
/**
|
|
70
|
-
* SDK 是否已通过外部 <Script> 标签加载完毕。
|
|
71
|
-
* 传入此 flag 以便 hook 在正确时机初始化。
|
|
72
|
-
* 默认 true(假设 SDK 已经加载)。
|
|
73
|
-
*/
|
|
74
|
-
sdkLoaded?: boolean;
|
|
75
|
-
}
|
|
76
|
-
export interface UseEmarsysWebPushReturn {
|
|
77
|
-
/** 手动触发浏览器原生订阅弹窗(供"订阅"按钮调用) */
|
|
78
|
-
subscribe: () => void;
|
|
79
|
-
/** 取消推送订阅 */
|
|
80
|
-
unsubscribe: () => void;
|
|
81
|
-
/** 是否应向用户展示自定义引导弹窗 */
|
|
82
|
-
shouldShowPopup: boolean;
|
|
83
|
-
/** 关闭自定义弹窗并写入冷却标记 */
|
|
84
|
-
dismissPopup: () => void;
|
|
85
|
-
/** 当前是否已订阅(异步检测完成后更新) */
|
|
86
|
-
isSubscribed: boolean;
|
|
87
|
-
/** SDK 是否就绪 */
|
|
88
|
-
isReady: boolean;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* useEmarsysWebPush
|
|
92
|
-
*
|
|
93
|
-
* 封装 Emarsys Web Push SDK 的订阅生命周期,包括:
|
|
94
|
-
* - SDK 初始化
|
|
95
|
-
* - 自定义弹窗展示逻辑(两步策略,避免直接触发浏览器原生弹窗)
|
|
96
|
-
* - 已登录联系人的 login / logout 自动管理
|
|
97
|
-
* - 已有订阅用户的迁移(从旧推送系统迁移)
|
|
98
|
-
*
|
|
99
|
-
* @example
|
|
100
|
-
* ```tsx
|
|
101
|
-
* const { shouldShowPopup, subscribe, dismissPopup } = useEmarsysWebPush({
|
|
102
|
-
* applicationCode: process.env.NEXT_PUBLIC_EMARSYS_APP_CODE!,
|
|
103
|
-
* applicationServerPublicKey: process.env.NEXT_PUBLIC_EMARSYS_VAPID_PUBLIC_KEY!,
|
|
104
|
-
* fieldId: 10372,
|
|
105
|
-
* contactValue: user?.customerId ?? null,
|
|
106
|
-
* sdkLoaded: scriptLoaded,
|
|
107
|
-
* })
|
|
108
|
-
* ```
|
|
109
|
-
*/
|
|
110
|
-
export declare function useEmarsysWebPush({ applicationCode, applicationServerPublicKey, serviceWorkerUrl, defaultNotificationTitle, defaultNotificationIcon, fieldId, contactValue, enableLogging, dismissCooldownDays, sdkLoaded, }: UseEmarsysWebPushOptions): UseEmarsysWebPushReturn;
|
|
111
|
-
export {};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var E=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var x=(e,i)=>{for(var o in i)E(e,o,{get:i[o],enumerable:!0})},T=(e,i,o,l)=>{if(i&&typeof i=="object"||typeof i=="function")for(let u of U(i))!D.call(e,u)&&u!==o&&E(e,u,{get:()=>i[u],enumerable:!(l=O(i,u))||l.enumerable});return e};var K=e=>T(E({},"__esModule",{value:!0}),e);var j={};x(j,{useEmarsysWebPush:()=>B});module.exports=K(j);var n=require("react");const w="emarsysSubscribe",m="emarsysLogin",W="anker_push_dismissed";function M(){return typeof navigator>"u"?!1:/iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase())}function Y(){return typeof window>"u"?!1:window.matchMedia("(display-mode: standalone)").matches||"standalone"in window.navigator&&window.navigator.standalone===!0}function a(e,i,o){try{if(e==="get")return localStorage.getItem(i);e==="set"&&o!==void 0&&localStorage.setItem(i,o),e==="remove"&&localStorage.removeItem(i)}catch{}return null}function c(){if(typeof window>"u")return null;const e=window.WebEmarsysSdk;return!e||Array.isArray(e)?null:e}function B({applicationCode:e,applicationServerPublicKey:i,serviceWorkerUrl:o="service-worker.js",defaultNotificationTitle:l,defaultNotificationIcon:u,fieldId:k,contactValue:d,enableLogging:h=!1,dismissCooldownDays:v=7,sdkLoaded:b=!0}){const[p,R]=(0,n.useState)(!1),[C,S]=(0,n.useState)(!1),[L,g]=(0,n.useState)(!1),y=(0,n.useRef)(!1),P=(0,n.useRef)(!1);(0,n.useEffect)(()=>{if(!b||typeof window>"u")return;const s=o.replace(/^\/+/,"").replace(/^https?:\/\/[^/]+\//,"");window.WebEmarsysSdk=window.WebEmarsysSdk||[],window.WebEmarsysSdk.push(["init",{applicationCode:e,enableMacSafariVapid:!0,defaultNotificationTitle:l,defaultNotificationIcon:u,autoSubscribe:!1,enableLogging:h,serviceWorker:{url:s,applicationServerPublicKey:i}}])},[b,e,i,o,l,u,h]);const f=(0,n.useCallback)(s=>{if(y.current)return;const r=c();r&&r.isSubscribed().then(t=>{t&&r.login({fieldId:k,fieldValue:s}).then(I=>{I&&(a("set",m,"login"),y.current=!0)})})},[k]),A=(0,n.useCallback)(()=>{const s=c();s&&s.isSubscribed().then(r=>{r&&s.logout().then(t=>{t&&(a("remove",m),y.current=!1)})})},[]);(0,n.useEffect)(()=>{if(!b||typeof window>"u"||M()&&!Y())return;window.WebEmarsysSdk=window.WebEmarsysSdk||[];const s=window.WebEmarsysSdk;s.push(["onReady",()=>{R(!0),c()?.isSubscribed().then(t=>{S(t)}),s.push(["onPermissionGranted",()=>{!a("get",w)&&!P.current&&(c()?.subscribe(),a("set",w,"subscribe"))}]);let r=!1;s.push(["onPermissionGranted",()=>{r=!0}]),s.push(["onPermissionDenied",()=>{r=!0}]),setTimeout(()=>{if(r)return;const t=a("get",W);t&&Date.now()-parseInt(t,10)<v*24*60*60*1e3||g(!0)},2e3)}]),s.push(["onSubscribe",()=>{S(!0),a("set",w,"subscribe"),d&&f(d)}]),s.push(["onUnsubscribe",()=>{S(!1)}])},[b,d,v,f]),(0,n.useEffect)(()=>{p&&(d?a("get",m)||f(d):a("get",m)&&A())},[p,d,f,A]);const G=(0,n.useCallback)(()=>{g(!1),P.current=!0;const s=c();if(!s){window.WebEmarsysSdk.push(t=>{t.subscribe()});return}s.subscribe()},[]),_=(0,n.useCallback)(()=>{c()?.unsubscribe()},[]),N=(0,n.useCallback)(()=>{g(!1),a("set",W,String(Date.now()))},[]);return{subscribe:G,unsubscribe:_,shouldShowPopup:L,dismissPopup:N,isSubscribed:C,isReady:p}}
|
|
2
|
-
//# sourceMappingURL=useEmarsysWebPush.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/hooks/useEmarsysWebPush.ts"],
|
|
4
|
-
"sourcesContent": ["import { useCallback, useEffect, useRef, useState } from 'react'\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Emarsys Web Push SDK \u5168\u5C40\u7C7B\u578B\u58F0\u660E\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface EmarsysContactInfo {\n /** Emarsys \u8054\u7CFB\u4EBA\u5B57\u6BB5 ID\uFF08\u5982 10372\uFF09 */\n fieldId: number\n /** \u5B57\u6BB5\u503C\uFF08\u5982\u7528\u6237\u552F\u4E00\u6807\u8BC6\uFF09 */\n fieldValue: string\n}\n\nexport interface EmarsysInitConfig {\n /** Emarsys Domain Code\uFF0C\u4ECE\u540E\u53F0\u83B7\u53D6 */\n applicationCode: string\n /** macOS Safari 16+ \u4F7F\u7528 VAPID \u66FF\u4EE3 APNS */\n enableMacSafariVapid?: boolean\n /** \u9ED8\u8BA4\u63A8\u9001\u901A\u77E5\u6807\u9898 */\n defaultNotificationTitle?: string\n /** \u9ED8\u8BA4\u63A8\u9001\u901A\u77E5\u56FE\u6807 URL */\n defaultNotificationIcon?: string\n /** \u662F\u5426\u81EA\u52A8\u89E6\u53D1\u6D4F\u89C8\u5668\u8BA2\u9605\u5F39\u7A97\uFF0C\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A false */\n autoSubscribe?: boolean\n /** \u5F00\u53D1\u9636\u6BB5\u5F00\u542F SDK \u65E5\u5FD7 */\n enableLogging?: boolean\n serviceWorker: {\n /** Service Worker \u6587\u4EF6\u8DEF\u5F84\uFF08\u9700\u653E\u5728\u7F51\u7AD9\u6839\u76EE\u5F55\uFF09 */\n url: string\n /** VAPID \u516C\u94A5\uFF08Base64 URL-safe \u7F16\u7801\uFF09 */\n applicationServerPublicKey: string\n }\n}\n\ntype EmarsysSdkEventName =\n | 'onReady'\n | 'onSubscribe'\n | 'onUnsubscribe'\n | 'onPermissionPrompt'\n | 'onPermissionGranted'\n | 'onPermissionDenied'\n | 'onSWInitError'\n\ntype EmarsysSdkCommand = ['init', EmarsysInitConfig] | [EmarsysSdkEventName, () => void]\n\ninterface EmarsysSdkApi {\n subscribe: () => void\n unsubscribe: () => void\n login: (contactInfo: EmarsysContactInfo) => Promise<boolean>\n logout: () => Promise<boolean>\n isSubscribed: () => Promise<boolean>\n isRegistered: () => boolean\n customEvent: (eventName: string, payload?: Record<string, unknown>) => Promise<boolean>\n push: (command: EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void)) => void\n}\n\ndeclare global {\n interface Window {\n WebEmarsysSdk: EmarsysSdkApi | (EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void))[]\n }\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Hook \u5165\u53C2\u7C7B\u578B\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface UseEmarsysWebPushOptions {\n /** Emarsys Domain Code */\n applicationCode: string\n /** VAPID \u516C\u94A5 */\n applicationServerPublicKey: string\n /** Service Worker \u8DEF\u5F84\uFF0C\u9ED8\u8BA4 'service-worker.js'\uFF08\u4E0D\u542B\u524D\u5BFC\u659C\u6760\uFF09 */\n serviceWorkerUrl?: string\n /** \u9ED8\u8BA4\u901A\u77E5\u6807\u9898 */\n defaultNotificationTitle?: string\n /** \u9ED8\u8BA4\u901A\u77E5\u56FE\u6807 URL */\n defaultNotificationIcon?: string\n /** \u8054\u7CFB\u4EBA\u4E3B\u952E\u5B57\u6BB5 ID\uFF08\u7531 Emarsys \u540E\u53F0\u914D\u7F6E\uFF09 */\n fieldId: number\n /**\n * \u5F53\u524D\u7528\u6237\u7684\u8054\u7CFB\u4EBA\u6807\u8BC6\uFF08\u5982 hashed email / customer ID\uFF09\u3002\n * null \u8868\u793A\u672A\u767B\u5F55\u7684\u533F\u540D\u8BBF\u5BA2\u3002\n */\n contactValue: string | null\n /** \u662F\u5426\u5F00\u542F\u8C03\u8BD5\u65E5\u5FD7\uFF0C\u9ED8\u8BA4 false */\n enableLogging?: boolean\n /**\n * \u70B9\u51FB\"\u7A0D\u540E\"\u540E\u7684\u5F39\u7A97\u51B7\u5374\u5929\u6570\uFF0C\u9ED8\u8BA4 7 \u5929\u3002\n * \u51B7\u5374\u671F\u95F4\u4E0D\u518D\u5C55\u793A\u81EA\u5B9A\u4E49\u5F39\u7A97\u3002\n */\n dismissCooldownDays?: number\n /**\n * SDK \u662F\u5426\u5DF2\u901A\u8FC7\u5916\u90E8 <Script> \u6807\u7B7E\u52A0\u8F7D\u5B8C\u6BD5\u3002\n * \u4F20\u5165\u6B64 flag \u4EE5\u4FBF hook \u5728\u6B63\u786E\u65F6\u673A\u521D\u59CB\u5316\u3002\n * \u9ED8\u8BA4 true\uFF08\u5047\u8BBE SDK \u5DF2\u7ECF\u52A0\u8F7D\uFF09\u3002\n */\n sdkLoaded?: boolean\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Hook \u8FD4\u56DE\u503C\u7C7B\u578B\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface UseEmarsysWebPushReturn {\n /** \u624B\u52A8\u89E6\u53D1\u6D4F\u89C8\u5668\u539F\u751F\u8BA2\u9605\u5F39\u7A97\uFF08\u4F9B\"\u8BA2\u9605\"\u6309\u94AE\u8C03\u7528\uFF09 */\n subscribe: () => void\n /** \u53D6\u6D88\u63A8\u9001\u8BA2\u9605 */\n unsubscribe: () => void\n /** \u662F\u5426\u5E94\u5411\u7528\u6237\u5C55\u793A\u81EA\u5B9A\u4E49\u5F15\u5BFC\u5F39\u7A97 */\n shouldShowPopup: boolean\n /** \u5173\u95ED\u81EA\u5B9A\u4E49\u5F39\u7A97\u5E76\u5199\u5165\u51B7\u5374\u6807\u8BB0 */\n dismissPopup: () => void\n /** \u5F53\u524D\u662F\u5426\u5DF2\u8BA2\u9605\uFF08\u5F02\u6B65\u68C0\u6D4B\u5B8C\u6210\u540E\u66F4\u65B0\uFF09 */\n isSubscribed: boolean\n /** SDK \u662F\u5426\u5C31\u7EEA */\n isReady: boolean\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// \u5DE5\u5177\u51FD\u6570\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst STORAGE_KEY_SUBSCRIBE = 'emarsysSubscribe'\nconst STORAGE_KEY_LOGIN = 'emarsysLogin'\nconst STORAGE_KEY_DISMISSED = 'anker_push_dismissed'\n\nfunction isIOS(): boolean {\n if (typeof navigator === 'undefined') return false\n return /iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase())\n}\n\nfunction isStandaloneWebApp(): boolean {\n if (typeof window === 'undefined') return false\n return (\n window.matchMedia('(display-mode: standalone)').matches ||\n // Safari standalone \u5C5E\u6027\uFF08\u975E\u6807\u51C6\uFF09\n ('standalone' in window.navigator && (window.navigator as Navigator & { standalone?: boolean }).standalone === true)\n )\n}\n\nfunction safeLocalStorage(action: 'get', key: string): string | null\nfunction safeLocalStorage(action: 'set', key: string, value: string): void\nfunction safeLocalStorage(action: 'remove', key: string): void\nfunction safeLocalStorage(action: 'get' | 'set' | 'remove', key: string, value?: string): string | null | void {\n try {\n if (action === 'get') return localStorage.getItem(key)\n if (action === 'set' && value !== undefined) localStorage.setItem(key, value)\n if (action === 'remove') localStorage.removeItem(key)\n } catch {\n // SSR \u6216\u9690\u79C1\u6A21\u5F0F\u4E0B localStorage \u4E0D\u53EF\u7528\n }\n return null\n}\n\nfunction getSdkApi(): EmarsysSdkApi | null {\n if (typeof window === 'undefined') return null\n const sdk = window.WebEmarsysSdk\n if (!sdk || Array.isArray(sdk)) return null\n return sdk as EmarsysSdkApi\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// \u6838\u5FC3 Hook\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * useEmarsysWebPush\n *\n * \u5C01\u88C5 Emarsys Web Push SDK \u7684\u8BA2\u9605\u751F\u547D\u5468\u671F\uFF0C\u5305\u62EC\uFF1A\n * - SDK \u521D\u59CB\u5316\n * - \u81EA\u5B9A\u4E49\u5F39\u7A97\u5C55\u793A\u903B\u8F91\uFF08\u4E24\u6B65\u7B56\u7565\uFF0C\u907F\u514D\u76F4\u63A5\u89E6\u53D1\u6D4F\u89C8\u5668\u539F\u751F\u5F39\u7A97\uFF09\n * - \u5DF2\u767B\u5F55\u8054\u7CFB\u4EBA\u7684 login / logout \u81EA\u52A8\u7BA1\u7406\n * - \u5DF2\u6709\u8BA2\u9605\u7528\u6237\u7684\u8FC1\u79FB\uFF08\u4ECE\u65E7\u63A8\u9001\u7CFB\u7EDF\u8FC1\u79FB\uFF09\n *\n * @example\n * ```tsx\n * const { shouldShowPopup, subscribe, dismissPopup } = useEmarsysWebPush({\n * applicationCode: process.env.NEXT_PUBLIC_EMARSYS_APP_CODE!,\n * applicationServerPublicKey: process.env.NEXT_PUBLIC_EMARSYS_VAPID_PUBLIC_KEY!,\n * fieldId: 10372,\n * contactValue: user?.customerId ?? null,\n * sdkLoaded: scriptLoaded,\n * })\n * ```\n */\nexport function useEmarsysWebPush({\n applicationCode,\n applicationServerPublicKey,\n serviceWorkerUrl = 'service-worker.js',\n defaultNotificationTitle,\n defaultNotificationIcon,\n fieldId,\n contactValue,\n enableLogging = false,\n dismissCooldownDays = 7,\n sdkLoaded = true,\n}: UseEmarsysWebPushOptions): UseEmarsysWebPushReturn {\n const [isReady, setIsReady] = useState(false)\n const [isSubscribed, setIsSubscribed] = useState(false)\n const [shouldShowPopup, setShouldShowPopup] = useState(false)\n\n // \u907F\u514D\u91CD\u590D login/logout\n const hasPerformedLogin = useRef(false)\n // \u8FFD\u8E2A\u5F53\u524D session \u5185\u662F\u5426\u5DF2\u4E3B\u52A8\u89E6\u53D1\u8FC7 subscribe\n const isGeneralSubscribeRef = useRef(false)\n\n // \u2500\u2500 \u521D\u59CB\u5316 SDK \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n useEffect(() => {\n if (!sdkLoaded || typeof window === 'undefined') return\n\n // SDK v4.7.0 \u5185\u90E8 registerServiceWorker() \u6267\u884C `/${url}` \u62FC\u63A5\uFF0C\n // \u56E0\u6B64\u6B64\u5904\u5FC5\u987B\u4F20\u4E0D\u542B\u524D\u5BFC\u659C\u6760\u7684\u7EAF\u8DEF\u5F84\uFF08\u5982 'service-worker.js'\uFF09\uFF0C\n // \u4F20\u5165\u5E26\u659C\u6760\u7684\u8DEF\u5F84\u6216\u7EDD\u5BF9 URL \u5747\u4F1A\u5BFC\u81F4\u53CC\u659C\u6760/\u8DE8\u57DF SecurityError\u3002\n const swPath = serviceWorkerUrl.replace(/^\\/+/, '').replace(/^https?:\\/\\/[^/]+\\//, '')\n\n window.WebEmarsysSdk = window.WebEmarsysSdk || []\n const sdk = window.WebEmarsysSdk as (EmarsysSdkCommand | ((api: EmarsysSdkApi) => void))[]\n\n sdk.push([\n 'init',\n {\n applicationCode,\n enableMacSafariVapid: true,\n defaultNotificationTitle,\n defaultNotificationIcon,\n autoSubscribe: false,\n enableLogging,\n serviceWorker: {\n url: swPath,\n applicationServerPublicKey,\n },\n },\n ])\n }, [\n sdkLoaded,\n applicationCode,\n applicationServerPublicKey,\n serviceWorkerUrl,\n defaultNotificationTitle,\n defaultNotificationIcon,\n enableLogging,\n ])\n\n // \u2500\u2500 \u6267\u884C Emarsys login\uFF08\u5173\u8054\u5DF2\u77E5\u8054\u7CFB\u4EBA\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const performLogin = useCallback(\n (value: string) => {\n if (hasPerformedLogin.current) return\n const api = getSdkApi()\n if (!api) return\n\n api.isSubscribed().then(subscribed => {\n if (!subscribed) return\n api.login({ fieldId, fieldValue: value }).then(result => {\n if (result) {\n safeLocalStorage('set', STORAGE_KEY_LOGIN, 'login')\n hasPerformedLogin.current = true\n }\n })\n })\n },\n [fieldId]\n )\n\n // \u2500\u2500 \u6267\u884C Emarsys logout\uFF08\u89E3\u9664\u8054\u7CFB\u4EBA\u5173\u8054\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const performLogout = useCallback(() => {\n const api = getSdkApi()\n if (!api) return\n\n api.isSubscribed().then(subscribed => {\n if (!subscribed) return\n api.logout().then(result => {\n if (result) {\n safeLocalStorage('remove', STORAGE_KEY_LOGIN)\n hasPerformedLogin.current = false\n }\n })\n })\n }, [])\n\n // \u2500\u2500 \u6CE8\u518C SDK \u56DE\u8C03 & \u4E1A\u52A1\u903B\u8F91 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n useEffect(() => {\n if (!sdkLoaded || typeof window === 'undefined') return\n\n // iOS \u6D4F\u89C8\u5668\uFF08\u975E PWA \u6A21\u5F0F\uFF09\u4E0D\u505A\u4EFB\u4F55\u64CD\u4F5C\n if (isIOS() && !isStandaloneWebApp()) return\n\n window.WebEmarsysSdk = window.WebEmarsysSdk || []\n const sdk = window.WebEmarsysSdk as (EmarsysSdkCommand | ((api: EmarsysSdkApi) => void))[]\n\n sdk.push([\n 'onReady',\n () => {\n setIsReady(true)\n\n // \u68C0\u67E5\u5F53\u524D\u8BA2\u9605\u72B6\u6001\n getSdkApi()\n ?.isSubscribed()\n .then(subscribed => {\n setIsSubscribed(subscribed)\n })\n\n // \u5DF2\u6709\u8BA2\u9605\u7528\u6237\u8FC1\u79FB\uFF08\u65E7\u63A8\u9001\u7CFB\u7EDF \u2192 Emarsys\uFF09\n sdk.push([\n 'onPermissionGranted',\n () => {\n if (!safeLocalStorage('get', STORAGE_KEY_SUBSCRIBE) && !isGeneralSubscribeRef.current) {\n getSdkApi()?.subscribe()\n safeLocalStorage('set', STORAGE_KEY_SUBSCRIBE, 'subscribe')\n }\n },\n ])\n\n // \u5224\u65AD\u662F\u5426\u9700\u8981\u5C55\u793A\u81EA\u5B9A\u4E49\u5F15\u5BFC\u5F39\u7A97\n // \u5EF6\u8FDF 2 \u79D2\uFF0C\u7B49\u5F85 onPermissionGranted / onPermissionDenied \u5F02\u6B65\u56DE\u8C03\n let permissionAlreadyHandled = false\n sdk.push([\n 'onPermissionGranted',\n () => {\n permissionAlreadyHandled = true\n },\n ])\n sdk.push([\n 'onPermissionDenied',\n () => {\n permissionAlreadyHandled = true\n },\n ])\n\n setTimeout(() => {\n if (permissionAlreadyHandled) return\n\n // \u68C0\u67E5\u51B7\u5374\u671F\n const dismissedAt = safeLocalStorage('get', STORAGE_KEY_DISMISSED)\n if (dismissedAt) {\n const elapsed = Date.now() - parseInt(dismissedAt, 10)\n if (elapsed < dismissCooldownDays * 24 * 60 * 60 * 1000) return\n }\n\n setShouldShowPopup(true)\n }, 2000)\n },\n ])\n\n // \u8BA2\u9605\u6210\u529F\u540E\u66F4\u65B0\u72B6\u6001\u5E76\u6267\u884C login\n sdk.push([\n 'onSubscribe',\n () => {\n setIsSubscribed(true)\n safeLocalStorage('set', STORAGE_KEY_SUBSCRIBE, 'subscribe')\n if (contactValue) {\n performLogin(contactValue)\n }\n },\n ])\n\n sdk.push([\n 'onUnsubscribe',\n () => {\n setIsSubscribed(false)\n },\n ])\n }, [sdkLoaded, contactValue, dismissCooldownDays, performLogin])\n\n // \u2500\u2500 \u76D1\u542C contactValue \u53D8\u5316\uFF0C\u81EA\u52A8 login / logout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n useEffect(() => {\n if (!isReady) return\n\n if (contactValue) {\n if (!safeLocalStorage('get', STORAGE_KEY_LOGIN)) {\n performLogin(contactValue)\n }\n } else {\n if (safeLocalStorage('get', STORAGE_KEY_LOGIN)) {\n performLogout()\n }\n }\n }, [isReady, contactValue, performLogin, performLogout])\n\n // \u2500\u2500 \u5BF9\u5916\u66B4\u9732\u7684 API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const subscribe = useCallback(() => {\n setShouldShowPopup(false)\n isGeneralSubscribeRef.current = true\n const api = getSdkApi()\n if (!api) {\n const sdk = window.WebEmarsysSdk as ((api: EmarsysSdkApi) => void)[]\n sdk.push(sdkApi => {\n sdkApi.subscribe()\n })\n return\n }\n api.subscribe()\n }, [])\n\n const unsubscribe = useCallback(() => {\n getSdkApi()?.unsubscribe()\n }, [])\n\n const dismissPopup = useCallback(() => {\n setShouldShowPopup(false)\n safeLocalStorage('set', STORAGE_KEY_DISMISSED, String(Date.now()))\n }, [])\n\n return {\n subscribe,\n unsubscribe,\n shouldShowPopup,\n dismissPopup,\n isSubscribed,\n isReady,\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["useEmarsysWebPush_exports", "__export", "useEmarsysWebPush", "__toCommonJS", "import_react", "STORAGE_KEY_SUBSCRIBE", "STORAGE_KEY_LOGIN", "STORAGE_KEY_DISMISSED", "isIOS", "isStandaloneWebApp", "safeLocalStorage", "action", "key", "value", "getSdkApi", "sdk", "applicationCode", "applicationServerPublicKey", "serviceWorkerUrl", "defaultNotificationTitle", "defaultNotificationIcon", "fieldId", "contactValue", "enableLogging", "dismissCooldownDays", "sdkLoaded", "isReady", "setIsReady", "isSubscribed", "setIsSubscribed", "shouldShowPopup", "setShouldShowPopup", "hasPerformedLogin", "isGeneralSubscribeRef", "swPath", "performLogin", "api", "subscribed", "result", "performLogout", "permissionAlreadyHandled", "dismissedAt", "subscribe", "sdkApi", "unsubscribe", "dismissPopup"]
|
|
7
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { type RefObject } from 'react';
|
|
2
|
-
import type { Product } from '../biz-components/Listing/types/product.js';
|
|
3
|
-
/** 单个产品项的埋点数据(CMS 配置的简化产品) */
|
|
4
|
-
export interface ProductItem {
|
|
5
|
-
sku?: string;
|
|
6
|
-
handle?: string;
|
|
7
|
-
custom_price?: number;
|
|
8
|
-
[key: string]: any;
|
|
9
|
-
}
|
|
10
|
-
/** Hook 入参 */
|
|
11
|
-
export interface ProductListTrackOptions {
|
|
12
|
-
/** 组件容器 ref,用于 view_item_list 的视口检测 */
|
|
13
|
-
containerRef: RefObject<HTMLDivElement>;
|
|
14
|
-
/** 列表名称,用于 item_list_name 字段 */
|
|
15
|
-
listName: string;
|
|
16
|
-
/** 产品列表(简化数据,来自 CMS 配置) */
|
|
17
|
-
items: ProductItem[];
|
|
18
|
-
/** 构建时产品完整数据(来自 Shopify API) */
|
|
19
|
-
products?: Product[];
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* 产品列表埋点 Hook
|
|
23
|
-
*
|
|
24
|
-
* 封装两个 GA4 电商事件:
|
|
25
|
-
* - `view_item_list` — 组件进入视口时自动触发一次(产品列表露出)
|
|
26
|
-
* - `select_item` — 返回 trackSelectItem 函数,点击产品时手动调用(产品选择)
|
|
27
|
-
*
|
|
28
|
-
* @example
|
|
29
|
-
* ```tsx
|
|
30
|
-
* const { trackSelectItem } = useProductListTrack({
|
|
31
|
-
* containerRef: innerRef,
|
|
32
|
-
* listName: 'gift_tier_shelf',
|
|
33
|
-
* items: availableItems.map(item => item.products?.[0]).filter(Boolean),
|
|
34
|
-
* products: buildData?.products,
|
|
35
|
-
* })
|
|
36
|
-
*
|
|
37
|
-
* // 点击产品卡片时
|
|
38
|
-
* <Card onClick={() => { trackSelectItem(product, index); onCardClick?.() }} />
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export declare const useProductListTrack: ({ containerRef, listName, items, products }: ProductListTrackOptions) => {
|
|
42
|
-
trackSelectItem: (item: ProductItem, index: number) => void;
|
|
43
|
-
};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var l=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var P=(e,t)=>{for(var n in t)l(e,n,{get:t[n],enumerable:!0})},h=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of k(t))!f.call(e,r)&&r!==n&&l(e,r,{get:()=>t[r],enumerable:!(i=g(t,r))||i.enumerable});return e};var b=e=>h(l({},"__esModule",{value:!0}),e);var L={};P(L,{useProductListTrack:()=>x});module.exports=b(L);var s=require("react"),p=require("../shared/track.js"),v=require("../biz-components/AiuiProvider/index.js");const I=(e,t)=>e.map((n,i)=>{const r=t?.find(o=>o.handle===n.handle)||null,c=r?.variants?.find(o=>o?.sku===n.sku)||null;return{item_id:n.sku||c?.sku||"",item_name:c?.title||r?.title||"",item_variant:c?.title||"",price:n.custom_price??c?.price?.amount??"",index:i+1}}),x=({containerRef:e,listName:t,items:n,products:i})=>{const{trackingData:r}=(0,v.useAiuiContext)(),c=(0,s.useRef)(!1);return(0,s.useEffect)(()=>{if(!e.current||c.current||!i?.length)return;const a=new IntersectionObserver(([m])=>{m.isIntersecting&&!c.current&&(c.current=!0,(0,p.gaTrack)({event:"ga4Event",event_name:"view_item_list",event_parameters:{page_group:r?.pageGroup||"Home Page",item_list_name:t,items:I(n,i)}}),a.disconnect())},{threshold:0});return a.observe(e.current),()=>a.disconnect()},[i,n,r,t,e]),{trackSelectItem:(0,s.useCallback)((a,m)=>{const _=i?.find(d=>d.handle===a.handle)||null,u=_?.variants?.find(d=>d?.sku===a.sku)||null;(0,p.gaTrack)({event:"ga4Event",event_name:"select_item",event_parameters:{page_group:r?.pageGroup||"Home Page",item_list_name:t,items:[{item_id:a.sku||u?.sku||"",item_name:u?.title||_?.title||"",item_variant:u?.title||"",price:a.custom_price??u?.price?.amount??"",index:m+1}]}})},[i,r,t])}};
|
|
2
|
-
//# sourceMappingURL=useProductListTrack.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/hooks/useProductListTrack.ts"],
|
|
4
|
-
"sourcesContent": ["import { type RefObject, useRef, useEffect, useCallback } from 'react'\nimport { gaTrack } from '../shared/track.js'\nimport { useAiuiContext } from '../biz-components/AiuiProvider/index.js'\nimport type { Product, ProductVariant } from '../biz-components/Listing/types/product.js'\n\n/** \u5355\u4E2A\u4EA7\u54C1\u9879\u7684\u57CB\u70B9\u6570\u636E\uFF08CMS \u914D\u7F6E\u7684\u7B80\u5316\u4EA7\u54C1\uFF09 */\nexport interface ProductItem {\n sku?: string\n handle?: string\n custom_price?: number\n [key: string]: any\n}\n\n/** Hook \u5165\u53C2 */\nexport interface ProductListTrackOptions {\n /** \u7EC4\u4EF6\u5BB9\u5668 ref\uFF0C\u7528\u4E8E view_item_list \u7684\u89C6\u53E3\u68C0\u6D4B */\n containerRef: RefObject<HTMLDivElement>\n /** \u5217\u8868\u540D\u79F0\uFF0C\u7528\u4E8E item_list_name \u5B57\u6BB5 */\n listName: string\n /** \u4EA7\u54C1\u5217\u8868\uFF08\u7B80\u5316\u6570\u636E\uFF0C\u6765\u81EA CMS \u914D\u7F6E\uFF09 */\n items: ProductItem[]\n /** \u6784\u5EFA\u65F6\u4EA7\u54C1\u5B8C\u6574\u6570\u636E\uFF08\u6765\u81EA Shopify API\uFF09 */\n products?: Product[]\n}\n\n/**\n * \u6839\u636E\u7B80\u5316\u4EA7\u54C1 + \u5B8C\u6574\u4EA7\u54C1\u6570\u636E\uFF0C\u6784\u5EFA GA4 \u6807\u51C6 items \u6570\u7EC4\n */\nconst resolveItemList = (items: ProductItem[], products?: Product[]) => {\n return items.map((item, index) => {\n const matchedProduct = products?.find(p => p.handle === item.handle) || null\n const variant = matchedProduct?.variants?.find((v: ProductVariant) => v?.sku === item.sku) || null\n return {\n item_id: item.sku || variant?.sku || '',\n item_name: variant?.title || matchedProduct?.title || '',\n item_variant: variant?.title || '',\n price: item.custom_price ?? variant?.price?.amount ?? '',\n index: index + 1,\n }\n })\n}\n\n/**\n * \u4EA7\u54C1\u5217\u8868\u57CB\u70B9 Hook\n *\n * \u5C01\u88C5\u4E24\u4E2A GA4 \u7535\u5546\u4E8B\u4EF6\uFF1A\n * - `view_item_list` \u2014 \u7EC4\u4EF6\u8FDB\u5165\u89C6\u53E3\u65F6\u81EA\u52A8\u89E6\u53D1\u4E00\u6B21\uFF08\u4EA7\u54C1\u5217\u8868\u9732\u51FA\uFF09\n * - `select_item` \u2014 \u8FD4\u56DE trackSelectItem \u51FD\u6570\uFF0C\u70B9\u51FB\u4EA7\u54C1\u65F6\u624B\u52A8\u8C03\u7528\uFF08\u4EA7\u54C1\u9009\u62E9\uFF09\n *\n * @example\n * ```tsx\n * const { trackSelectItem } = useProductListTrack({\n * containerRef: innerRef,\n * listName: 'gift_tier_shelf',\n * items: availableItems.map(item => item.products?.[0]).filter(Boolean),\n * products: buildData?.products,\n * })\n *\n * // \u70B9\u51FB\u4EA7\u54C1\u5361\u7247\u65F6\n * <Card onClick={() => { trackSelectItem(product, index); onCardClick?.() }} />\n * ```\n */\nexport const useProductListTrack = ({ containerRef, listName, items, products }: ProductListTrackOptions) => {\n const { trackingData } = useAiuiContext()\n const hasViewed = useRef(false)\n\n // view_item_list \u2014 \u8FDB\u5165\u89C6\u53E3\u89E6\u53D1\u4E00\u6B21\n useEffect(() => {\n if (!containerRef.current || hasViewed.current || !products?.length) return\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting && !hasViewed.current) {\n hasViewed.current = true\n gaTrack({\n event: 'ga4Event',\n event_name: 'view_item_list',\n event_parameters: {\n page_group: trackingData?.pageGroup || 'Home Page',\n item_list_name: listName,\n items: resolveItemList(items, products),\n },\n })\n observer.disconnect()\n }\n },\n { threshold: 0 }\n )\n\n observer.observe(containerRef.current)\n return () => observer.disconnect()\n }, [products, items, trackingData, listName, containerRef])\n\n // select_item \u2014 \u70B9\u51FB\u67D0\u4EA7\u54C1\u65F6\u8C03\u7528\n const trackSelectItem = useCallback(\n (item: ProductItem, index: number) => {\n const matchedProduct = products?.find(p => p.handle === item.handle) || null\n const variant = matchedProduct?.variants?.find((v: ProductVariant) => v?.sku === item.sku) || null\n\n gaTrack({\n event: 'ga4Event',\n event_name: 'select_item',\n event_parameters: {\n page_group: trackingData?.pageGroup || 'Home Page',\n item_list_name: listName,\n items: [\n {\n item_id: item.sku || variant?.sku || '',\n item_name: variant?.title || matchedProduct?.title || '',\n item_variant: variant?.title || '',\n price: item.custom_price ?? variant?.price?.amount ?? '',\n index: index + 1,\n },\n ],\n },\n })\n },\n [products, trackingData, listName]\n )\n\n return { trackSelectItem }\n}\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA+D,iBAC/DC,EAAwB,8BACxBC,EAA+B,mDA0B/B,MAAMC,EAAkB,CAACC,EAAsBC,IACtCD,EAAM,IAAI,CAACE,EAAMC,IAAU,CAChC,MAAMC,EAAiBH,GAAU,KAAKI,GAAKA,EAAE,SAAWH,EAAK,MAAM,GAAK,KAClEI,EAAUF,GAAgB,UAAU,KAAMG,GAAsBA,GAAG,MAAQL,EAAK,GAAG,GAAK,KAC9F,MAAO,CACL,QAASA,EAAK,KAAOI,GAAS,KAAO,GACrC,UAAWA,GAAS,OAASF,GAAgB,OAAS,GACtD,aAAcE,GAAS,OAAS,GAChC,MAAOJ,EAAK,cAAgBI,GAAS,OAAO,QAAU,GACtD,MAAOH,EAAQ,CACjB,CACF,CAAC,EAuBUT,EAAsB,CAAC,CAAE,aAAAc,EAAc,SAAAC,EAAU,MAAAT,EAAO,SAAAC,CAAS,IAA+B,CAC3G,KAAM,CAAE,aAAAS,CAAa,KAAI,kBAAe,EAClCC,KAAY,UAAO,EAAK,EAG9B,sBAAU,IAAM,CACd,GAAI,CAACH,EAAa,SAAWG,EAAU,SAAW,CAACV,GAAU,OAAQ,OAErE,MAAMW,EAAW,IAAI,qBACnB,CAAC,CAACC,CAAK,IAAM,CACPA,EAAM,gBAAkB,CAACF,EAAU,UACrCA,EAAU,QAAU,MACpB,WAAQ,CACN,MAAO,WACP,WAAY,iBACZ,iBAAkB,CAChB,WAAYD,GAAc,WAAa,YACvC,eAAgBD,EAChB,MAAOV,EAAgBC,EAAOC,CAAQ,CACxC,CACF,CAAC,EACDW,EAAS,WAAW,EAExB,EACA,CAAE,UAAW,CAAE,CACjB,EAEA,OAAAA,EAAS,QAAQJ,EAAa,OAAO,EAC9B,IAAMI,EAAS,WAAW,CACnC,EAAG,CAACX,EAAUD,EAAOU,EAAcD,EAAUD,CAAY,CAAC,EA6BnD,CAAE,mBA1Be,eACtB,CAACN,EAAmBC,IAAkB,CACpC,MAAMC,EAAiBH,GAAU,KAAKI,GAAKA,EAAE,SAAWH,EAAK,MAAM,GAAK,KAClEI,EAAUF,GAAgB,UAAU,KAAMG,GAAsBA,GAAG,MAAQL,EAAK,GAAG,GAAK,QAE9F,WAAQ,CACN,MAAO,WACP,WAAY,cACZ,iBAAkB,CAChB,WAAYQ,GAAc,WAAa,YACvC,eAAgBD,EAChB,MAAO,CACL,CACE,QAASP,EAAK,KAAOI,GAAS,KAAO,GACrC,UAAWA,GAAS,OAASF,GAAgB,OAAS,GACtD,aAAcE,GAAS,OAAS,GAChC,MAAOJ,EAAK,cAAgBI,GAAS,OAAO,QAAU,GACtD,MAAOH,EAAQ,CACjB,CACF,CACF,CACF,CAAC,CACH,EACA,CAACF,EAAUS,EAAcD,CAAQ,CACnC,CAEyB,CAC3B",
|
|
6
|
-
"names": ["useProductListTrack_exports", "__export", "useProductListTrack", "__toCommonJS", "import_react", "import_track", "import_AiuiProvider", "resolveItemList", "items", "products", "item", "index", "matchedProduct", "p", "variant", "v", "containerRef", "listName", "trackingData", "hasViewed", "observer", "entry"]
|
|
7
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 移动端 TextLinks 菜单
|
|
3
|
-
* 二级菜单:折叠式分类导航(与 MobileSidebarMenu 相同的 currentMenu 切换模式)
|
|
4
|
-
* 三级菜单:对应列的纯文字链接列表
|
|
5
|
-
*/
|
|
6
|
-
export declare const MobileTextLinksMenu: {
|
|
7
|
-
({ textlinksCategoriesMetadata, textlinksColumnsMetadata, }: {
|
|
8
|
-
textlinksCategoriesMetadata: any;
|
|
9
|
-
textlinksColumnsMetadata: any;
|
|
10
|
-
}): import("react/jsx-runtime").JSX.Element | null;
|
|
11
|
-
displayName: string;
|
|
12
|
-
};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{jsx as r,jsxs as u}from"react/jsx-runtime";import{useCallback as $,useEffect as F,useMemo as k,useState as L}from"react";import{Button as T,Text as y,Link as E}from"../../components/index.js";import{cn as M,getLocalizedPath as x}from"../../helpers/utils.js";import{useNavContext as D}from"./NavProvider.js";import{useAiuiContext as z}from"../AiuiProvider/index.js";import{HeaderNavigationMenu as m}from"./types.js";import{MenuItem as B}from"./MobileMenuComponents.js";const _=({textlinksCategoriesMetadata:o,textlinksColumnsMetadata:g})=>{const{currentMenu:h,setCurrentMenu:i,subSubCategory:d,setSubSubCategory:b,onSidebarNavClick:c}=D(),{locale:p="us"}=z(),[v,f]=L([]),[S,A]=L(-1);F(()=>{const e=o?.subcategories;e?.length&&f(e.map((l,a)=>({index:a,open:!1})))},[o]);const N=k(()=>d&&g?.find(e=>e?.label?.toLowerCase()===d?.label?.toLowerCase())||null,[d,g]),C=$((e,l)=>{if(!(Array.isArray(e?.subSubCategories)&&e?.subSubCategories?.length>0)){b?.(e),i?.(m.Third);return}f(t=>t.map((n,s)=>({...n,open:s===l?!n.open:!1})))},[i,b]),w=$((e,l,a)=>{b?.(e),i?.(m.Third),A(a),f(t=>t.map(n=>({...n,open:n.index===l}))),c?.(e,a)},[i,b,c]);return k(()=>{switch(h){case m.Secondary:return u("div",{className:"tablet:px-8 laptop:px-16 flex h-full flex-col gap-8 p-4",children:[r("div",{children:o?.subcategories?.map((e,l)=>{const a=Array.isArray(e?.subSubCategories)&&e?.subSubCategories?.length>0,t=v?.find(n=>n.index===l)?.open;return u("div",{children:[r(B,{label:e?.label,active:t,onClick:()=>{C(e,l),c?.(e,l)}}),t&&a&&r("div",{className:"flex flex-col",role:"menu",children:e.subSubCategories?.map((n,s)=>r("button",{onClick:()=>w(n,l,s),className:M("w-full cursor-pointer border-0 bg-transparent px-4 py-3 text-left hover:bg-[#F5F5F7]",{"bg-[#F5F5F7]":S===s}),role:"menuitem","aria-label":n.label,children:r(y,{html:n.label,className:"text-sm font-bold leading-[1.4] text-[#4A4C56]"})},`mobile-textlinks-subSubItem-${l}-${s}`))})]},`mobile-textlinks-subcategory-${e?.label||""}-${l}`)})}),u("div",{className:"tablet:items-start flex flex-col items-center gap-4",children:[o?.primary&&r(T,{as:"a",href:`${x(o?.primary?.url,p)}?ref=${o?.primary?.label}_shopall`,variant:"primary",size:"lg",className:"tablet:w-auto w-full text-base",children:o?.primary?.label}),o?.secondary&&r(T,{as:"a",href:x(o?.secondary?.url,p),variant:"link",size:"lg",className:"tablet:w-auto tablet:px-0 w-full py-0 text-base",children:o?.secondary?.label})]})]});case m.Third:return r("div",{className:"tablet:px-8 laptop:px-16 flex flex-col gap-6 p-4",children:N?.columns?.map((e,l)=>u("div",{className:"flex flex-col gap-2",children:[e?.label&&r(y,{html:e.label,as:"p",className:"text-sm font-bold leading-[1.4] text-[#6D6D6F]"}),r("div",{className:"flex flex-col",children:e?.links?.map((a,t)=>u("div",{className:"flex min-h-[36px] items-center gap-1 py-2",children:[r(E,{href:x(a?.url,p),asChild:!a?.url,className:"text-sm font-bold leading-[1.4] no-underline",children:a.label}),a?.badge&&r(y,{as:"p",html:a.badge,className:"h-[24px] whitespace-nowrap rounded-full border-[1.6px] border-[#005D8E] px-[6px] text-xs font-bold !leading-[22px] text-[#005D8E]"})]},`mobile-textlinks-link-${a?.label||""}-${t}`))})]},`mobile-textlinks-col-${e?.label||""}-${l}`))});default:return null}},[h,o,v,S,N,C,w,c,p])};_.displayName="MobileTextLinksMenu";export{_ as MobileTextLinksMenu};
|
|
2
|
-
//# sourceMappingURL=MobileTextLinksMenu.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/biz-components/HeaderNavigation/MobileTextLinksMenu.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Button, Text, Link } from '../../components/index.js'\nimport { cn, getLocalizedPath } from '../../helpers/utils.js'\nimport { useNavContext } from './NavProvider.js'\nimport { useAiuiContext } from '../AiuiProvider/index.js'\nimport { HeaderNavigationMenu } from './types.js'\nimport { MenuItem } from './MobileMenuComponents.js'\n\n/**\n * \u79FB\u52A8\u7AEF TextLinks \u83DC\u5355\n * \u4E8C\u7EA7\u83DC\u5355\uFF1A\u6298\u53E0\u5F0F\u5206\u7C7B\u5BFC\u822A\uFF08\u4E0E MobileSidebarMenu \u76F8\u540C\u7684 currentMenu \u5207\u6362\u6A21\u5F0F\uFF09\n * \u4E09\u7EA7\u83DC\u5355\uFF1A\u5BF9\u5E94\u5217\u7684\u7EAF\u6587\u5B57\u94FE\u63A5\u5217\u8868\n */\nexport const MobileTextLinksMenu = ({\n textlinksCategoriesMetadata,\n textlinksColumnsMetadata,\n}: {\n textlinksCategoriesMetadata: any\n textlinksColumnsMetadata: any\n}) => {\n const { currentMenu, setCurrentMenu, subSubCategory, setSubSubCategory, onSidebarNavClick } = useNavContext()\n const { locale = 'us' } = useAiuiContext()\n const [expandedSubcategory, setExpandedSubcategory] = useState<{ index: number; open: boolean }[]>([])\n const [activeSubSubcategoryIndex, setActiveSubSubcategoryIndex] = useState(-1)\n\n useEffect(() => {\n const subcategories = textlinksCategoriesMetadata?.subcategories\n if (!subcategories?.length) return\n setExpandedSubcategory(subcategories.map((_: any, index: number) => ({ index, open: false })))\n }, [textlinksCategoriesMetadata])\n\n // \u901A\u8FC7 context \u7684 subSubCategory \u5339\u914D\u4E09\u7EA7\u5217\u6570\u636E\n const matchColumnsMetadata = useMemo(() => {\n if (!subSubCategory) return null\n return (\n textlinksColumnsMetadata?.find(\n (item: any) => item?.label?.toLowerCase() === subSubCategory?.label?.toLowerCase()\n ) || null\n )\n }, [subSubCategory, textlinksColumnsMetadata])\n\n // \u70B9\u51FB\u6709\u5B50\u9879\u7684 subcategory \u2014 \u53EA\u5C55\u5F00\u6298\u53E0\uFF0C\u4E0D\u8DF3\u7EA7\n // \u70B9\u51FB\u65E0\u5B50\u9879\u7684 subcategory \u2014 \u76F4\u63A5\u8DF3\u4E09\u7EA7\n const handleSubcategoryClick = useCallback(\n (subItem: any, index: number) => {\n const hasSubSubCategories = Array.isArray(subItem?.subSubCategories) && subItem?.subSubCategories?.length > 0\n\n if (!hasSubSubCategories) {\n setSubSubCategory?.(subItem)\n setCurrentMenu?.(HeaderNavigationMenu.Third)\n return\n }\n\n setExpandedSubcategory(prev => prev.map((item, i) => ({ ...item, open: i === index ? !item.open : false })))\n },\n [setCurrentMenu, setSubSubCategory]\n )\n\n // \u70B9\u51FB\u6709\u5B50\u9879\u7684\u5B50\u9879 \u2014 \u5199\u5165 context \u5E76\u8DF3\u4E09\u7EA7\n const handleSubSubcategoryClick = useCallback(\n (subSubItem: any, index: number, subSubindex: number) => {\n setSubSubCategory?.(subSubItem)\n setCurrentMenu?.(HeaderNavigationMenu.Third)\n setActiveSubSubcategoryIndex(subSubindex)\n setExpandedSubcategory(prev => prev.map(item => ({ ...item, open: item.index === index })))\n onSidebarNavClick?.(subSubItem, subSubindex)\n },\n [setCurrentMenu, setSubSubCategory, onSidebarNavClick]\n )\n\n const MobileTextLinksMenuComp = useMemo(() => {\n switch (currentMenu) {\n case HeaderNavigationMenu.Secondary:\n return (\n // \u4E8C\u7EA7\u83DC\u5355\uFF1A\u6298\u53E0\u5F0F\u5206\u7C7B\u5BFC\u822A + \u5E95\u90E8 CTA\n <div className=\"tablet:px-8 laptop:px-16 flex h-full flex-col gap-8 p-4\">\n <div>\n {textlinksCategoriesMetadata?.subcategories?.map((subItem: any, index: number) => {\n const hasSubSubCategory =\n Array.isArray(subItem?.subSubCategories) && subItem?.subSubCategories?.length > 0\n const isExpanded = expandedSubcategory?.find(item => item.index === index)?.open\n\n return (\n <div key={`mobile-textlinks-subcategory-${subItem?.label || ''}-${index}`}>\n <MenuItem\n label={subItem?.label}\n active={isExpanded}\n onClick={() => {\n handleSubcategoryClick(subItem, index)\n onSidebarNavClick?.(subItem, index)\n }}\n />\n\n {isExpanded && hasSubSubCategory && (\n <div className=\"flex flex-col\" role=\"menu\">\n {subItem.subSubCategories?.map((subSubItem: any, subSubindex: number) => (\n <button\n key={`mobile-textlinks-subSubItem-${index}-${subSubindex}`}\n onClick={() => handleSubSubcategoryClick(subSubItem, index, subSubindex)}\n className={cn(\n 'w-full cursor-pointer border-0 bg-transparent px-4 py-3 text-left hover:bg-[#F5F5F7]',\n {\n 'bg-[#F5F5F7]': activeSubSubcategoryIndex === subSubindex,\n }\n )}\n role=\"menuitem\"\n aria-label={subSubItem.label}\n >\n <Text html={subSubItem.label} className=\"text-sm font-bold leading-[1.4] text-[#4A4C56]\" />\n </button>\n ))}\n </div>\n )}\n </div>\n )\n })}\n </div>\n\n {/* \u5E95\u90E8 CTA */}\n <div className=\"tablet:items-start flex flex-col items-center gap-4\">\n {textlinksCategoriesMetadata?.primary && (\n <Button\n as=\"a\"\n href={`${getLocalizedPath(textlinksCategoriesMetadata?.primary?.url, locale)}?ref=${textlinksCategoriesMetadata?.primary?.label}_shopall`}\n variant=\"primary\"\n size=\"lg\"\n className=\"tablet:w-auto w-full text-base\"\n >\n {textlinksCategoriesMetadata?.primary?.label}\n </Button>\n )}\n {textlinksCategoriesMetadata?.secondary && (\n <Button\n as=\"a\"\n href={getLocalizedPath(textlinksCategoriesMetadata?.secondary?.url, locale)}\n variant=\"link\"\n size=\"lg\"\n className=\"tablet:w-auto tablet:px-0 w-full py-0 text-base\"\n >\n {textlinksCategoriesMetadata?.secondary?.label}\n </Button>\n )}\n </div>\n </div>\n )\n\n case HeaderNavigationMenu.Third:\n return (\n // \u4E09\u7EA7\u83DC\u5355\uFF1AmatchColumnsMetadata \u7684\u591A\u5217\u6587\u5B57\u94FE\u63A5\u5E73\u94FA\u5C55\u793A\n <div className=\"tablet:px-8 laptop:px-16 flex flex-col gap-6 p-4\">\n {matchColumnsMetadata?.columns?.map((col: any, colIndex: number) => (\n <div key={`mobile-textlinks-col-${col?.label || ''}-${colIndex}`} className=\"flex flex-col gap-2\">\n {col?.label && (\n <Text html={col.label} as=\"p\" className=\"text-sm font-bold leading-[1.4] text-[#6D6D6F]\" />\n )}\n <div className=\"flex flex-col\">\n {col?.links?.map((linkItem: any, linkIndex: number) => (\n <div\n key={`mobile-textlinks-link-${linkItem?.label || ''}-${linkIndex}`}\n className=\"flex min-h-[36px] items-center gap-1 py-2\"\n >\n <Link\n href={getLocalizedPath(linkItem?.url, locale)}\n asChild={!linkItem?.url}\n className=\"text-sm font-bold leading-[1.4] no-underline\"\n >\n {linkItem.label}\n </Link>\n {linkItem?.badge && (\n <Text\n as=\"p\"\n html={linkItem.badge}\n className=\"h-[24px] whitespace-nowrap rounded-full border-[1.6px] border-[#005D8E] px-[6px] text-xs font-bold !leading-[22px] text-[#005D8E]\"\n />\n )}\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n )\n\n default:\n return null\n }\n }, [\n currentMenu,\n textlinksCategoriesMetadata,\n expandedSubcategory,\n activeSubSubcategoryIndex,\n matchColumnsMetadata,\n handleSubcategoryClick,\n handleSubSubcategoryClick,\n onSidebarNavClick,\n locale,\n ])\n\n return MobileTextLinksMenuComp\n}\n\nMobileTextLinksMenu.displayName = 'MobileTextLinksMenu'\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["jsx", "jsxs", "useCallback", "useEffect", "useMemo", "useState", "Button", "Text", "Link", "cn", "getLocalizedPath", "useNavContext", "useAiuiContext", "HeaderNavigationMenu", "MenuItem", "MobileTextLinksMenu", "textlinksCategoriesMetadata", "textlinksColumnsMetadata", "currentMenu", "setCurrentMenu", "subSubCategory", "setSubSubCategory", "onSidebarNavClick", "locale", "expandedSubcategory", "setExpandedSubcategory", "activeSubSubcategoryIndex", "setActiveSubSubcategoryIndex", "subcategories", "_", "index", "matchColumnsMetadata", "item", "handleSubcategoryClick", "subItem", "prev", "i", "handleSubSubcategoryClick", "subSubItem", "subSubindex", "hasSubSubCategory", "isExpanded", "col", "colIndex", "linkItem", "linkIndex"]
|
|
7
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* TextLinks 下拉
|
|
4
|
-
* 左侧:折叠式分类导航(含子项)
|
|
5
|
-
* 右侧:多列纯文字链接列表(支持 badge 标签)
|
|
6
|
-
*/
|
|
7
|
-
export declare const TextLinksDropdown: React.MemoExoticComponent<({ textlinksCategoriesMetadata, textlinksColumnsMetadata, }: {
|
|
8
|
-
textlinksCategoriesMetadata: any;
|
|
9
|
-
textlinksColumnsMetadata: any;
|
|
10
|
-
}) => import("react/jsx-runtime").JSX.Element>;
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{Fragment as $,jsx as r,jsxs as b}from"react/jsx-runtime";import E,{useCallback as C,useEffect as B,useMemo as D,useRef as w,useState as k}from"react";import{Button as y,Container as O,Text as u,Link as R}from"../../components/index.js";import{cn as v,getLocalizedPath as p}from"../../helpers/utils.js";import{DownArrow as T}from"./icons/index.js";import{useNavContext as j}from"./NavProvider.js";import{useAiuiContext as _}from"../AiuiProvider/index.js";const W=E.memo(({textlinksCategoriesMetadata:o,textlinksColumnsMetadata:m})=>{const{onSidebarNavClick:h}=j(),{locale:c="us"}=_(),[f,x]=k([]),[d,g]=k(-1),L=w(null),S=w(null),N=C(()=>{const e=o?.subcategories;if(!e?.length)return;const l=e.findIndex(t=>!!t?.subSubCategories),a=e.findIndex(t=>!t?.subSubCategories),n=e.map((t,s)=>({index:s,open:l===s||a===s}));x(n)},[o]);B(()=>{N()},[N]);const i=D(()=>{const e=o?.subcategories?.[f?.find(l=>l.open)?.index||0];if(!e)return null;if(e?.subSubCategories){const l=e?.subSubCategories?.[d];if(l)return m?.find(a=>a?.label?.toLowerCase()===l?.label?.toLowerCase())||null}return m?.find(l=>l?.label?.toLowerCase()===e?.label?.toLowerCase())||null},[o,f,d,m]),F=C((e,l)=>{const a=l?.subSubCategories?.length>0;g(a?0:-1);const n=S.current;x(t=>t.map((s,A)=>A===e?{...s,open:!s.open}:a?{...s,open:!1}:!n&&d===-1?{...s,open:!1}:n&&!n.hasSubSubCategories&&!a&&d===-1?{...s,open:!1}:s)),S.current={index:e,hasSubSubCategories:a}},[d]),z=(e,l)=>{x(a=>a.map(n=>n.index===e?{...n,open:!0}:{...n,open:!1})),g(l)};return b(O,{childClassName:"lg-desktop:gap-12 flex bg-white gap-8",children:[b("div",{className:"lg-desktop:basis-[356px] flex basis-[284px] flex-col gap-4 py-4",style:{userSelect:"none"},ref:L,children:[r("div",{className:"desktop:h-[416px] flex flex-col overflow-y-auto",style:{scrollbarWidth:"none",msOverflowStyle:"none"},children:o?.subcategories?.map((e,l)=>{const a=Array.isArray(e?.subSubCategories)&&e?.subSubCategories?.length>0,n=f?.find(t=>t.index===l)?.open;return b("div",{children:[b("button",{className:v("rounded-sidebar-shelf flex w-full cursor-pointer items-center justify-between border-0 bg-transparent text-left",{"bg-[#F5F5F7]":!a&&n}),onClick:()=>{F(l,e),h?.(e,l)},"aria-expanded":a?n:void 0,"aria-haspopup":a?"true":void 0,children:[r(u,{html:e.label,className:"p-4 text-sm font-bold leading-[1.4]"}),a&&r(T,{"aria-hidden":"true",className:v("size-4",{"rotate-180":n})})]}),n&&a&&r("div",{className:"flex flex-col",role:"menu",children:e.subSubCategories?.map((t,s)=>r("button",{onClick:()=>{z(l,s),h?.(t,s)},className:v("rounded-sidebar-shelf w-full cursor-pointer border-0 bg-transparent px-6 py-4 text-left leading-none hover:bg-[#F5F5F7]",{"bg-[#F5F5F7]":d===s}),role:"menuitem","aria-label":t.label,children:r(u,{html:t.label,className:"text-sm font-bold leading-[1.4] text-[#4A4C56]"})},`textlinks-subSubItem-${l}-${s}`))})]},`${e?.label||""}textlinks-subcategoryItem-${l}`)})}),o&&r("div",{className:"flex",children:b("div",{className:"flex flex-col gap-4",children:[o?.primary&&r(y,{as:"a",href:`${p(o?.primary?.url,c)}?ref=${o?.primary?.label}_shopall`,variant:"primary",size:"lg",className:"lg-desktop:text-base text-sm",children:o?.primary?.label}),o?.secondary&&r(y,{as:"a",href:p(o?.secondary?.url,c),variant:"link",size:"lg",iconClassName:"size-4",className:"lg-desktop:text-base justify-start !p-0 text-sm",children:o?.secondary?.label})]})})]}),r("div",{className:"flex-1 py-4",children:i&&b($,{children:[b("div",{className:"mb-4 flex items-center justify-between",children:[(()=>{const e=b($,{children:[i?.label&&r(u,{html:i.label,className:"lg-desktop:text-2xl text-xl font-bold leading-[1.2]"}),i?.primary&&r(u,{html:i.primary.label,className:"lg-desktop:text-base text-sm font-bold leading-[1.2]"})]});return i?.primary?.url?r(y,{as:"a",href:`${p(i.primary.url,c)}?ref=${i.label}_viewmore`,variant:"link",size:"lg",iconClassName:"size-4",className:"flex items-center justify-start gap-2 !p-0 no-underline",children:e}):r("div",{className:"flex items-center gap-2",children:e})})(),i?.badge&&r(u,{html:i.badge,className:"h-[24px] rounded-full border-[1.6px] border-[var(--brand-color-0)] px-[6px] text-sm font-bold !leading-[22px] text-[var(--brand-color-0)]"})]}),r("div",{className:"desktop:h-[416px] grid grid-cols-3 gap-4 overflow-y-auto",style:{scrollbarWidth:"none",msOverflowStyle:"none"},children:i?.columns?.map((e,l)=>b("div",{className:"flex flex-col gap-2 pr-12",children:[e?.label&&r(u,{html:e.label,as:"p",className:"text-sm font-bold leading-[1.4] text-[#4A4C56]"}),r("div",{className:"flex flex-col",children:e?.links?.map((a,n)=>b("div",{className:"flex min-h-[36px] items-center gap-1 py-2",children:[r(R,{href:p(a?.url,c),asChild:!a?.url,className:"text-sm font-bold leading-[1.4] no-underline hover:opacity-70",children:a.label}),a?.badge&&r(u,{as:"p",html:a.badge,className:"text-brand-0 border-brand-0 h-[24px] whitespace-nowrap rounded-full border-[1.6px] px-[6px] text-xs font-bold !leading-[22px]"})]},`textlinks-link-${a?.label||""}-${n}`))})]},`textlinks-col-${e?.label||""}-${l}`))})]})})]})});W.displayName="TextLinksDropdown";export{W as TextLinksDropdown};
|
|
2
|
-
//# sourceMappingURL=TextLinksDropdown.js.map
|