@anker-in/headless-ui 1.1.84 → 1.1.85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/cjs/biz-components/ActiveShelf/index.d.ts +2 -2
  2. package/dist/cjs/biz-components/ActiveShelf/index.js +1 -1
  3. package/dist/cjs/biz-components/ActiveShelf/index.js.map +3 -3
  4. package/dist/cjs/biz-components/EventSchedule/index.d.ts +2 -7
  5. package/dist/cjs/biz-components/EventSchedule/index.js +1 -1
  6. package/dist/cjs/biz-components/EventSchedule/index.js.map +3 -3
  7. package/dist/cjs/biz-components/FeaturedBlogPosts/index.d.ts +1 -6
  8. package/dist/cjs/biz-components/FeaturedBlogPosts/index.js +1 -1
  9. package/dist/cjs/biz-components/FeaturedBlogPosts/index.js.map +3 -3
  10. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
  11. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js.map +2 -2
  12. package/dist/cjs/biz-components/ImageOverlayShelf/index.d.ts +2 -2
  13. package/dist/cjs/biz-components/ImageOverlayShelf/index.js +1 -1
  14. package/dist/cjs/biz-components/ImageOverlayShelf/index.js.map +3 -3
  15. package/dist/cjs/biz-components/LotteryShared/BaseModal.d.ts +61 -0
  16. package/dist/cjs/biz-components/LotteryShared/BaseModal.js +2 -0
  17. package/dist/cjs/biz-components/LotteryShared/BaseModal.js.map +7 -0
  18. package/dist/cjs/biz-components/LotteryShared/ChanceMethods.d.ts +25 -0
  19. package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js +2 -0
  20. package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js.map +7 -0
  21. package/dist/cjs/biz-components/LotteryShared/ErrorModal.d.ts +47 -0
  22. package/dist/cjs/biz-components/LotteryShared/ErrorModal.js +2 -0
  23. package/dist/cjs/biz-components/LotteryShared/ErrorModal.js.map +7 -0
  24. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.d.ts +101 -0
  25. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js +2 -0
  26. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js.map +7 -0
  27. package/dist/cjs/biz-components/LotteryShared/PrizePool.d.ts +29 -0
  28. package/dist/cjs/biz-components/LotteryShared/PrizePool.js +2 -0
  29. package/dist/cjs/biz-components/LotteryShared/PrizePool.js.map +7 -0
  30. package/dist/cjs/biz-components/LotteryShared/RulesModal.d.ts +56 -0
  31. package/dist/cjs/biz-components/LotteryShared/RulesModal.js +2 -0
  32. package/dist/cjs/biz-components/LotteryShared/RulesModal.js.map +7 -0
  33. package/dist/cjs/biz-components/LotteryShared/ShareModal.d.ts +79 -0
  34. package/dist/cjs/biz-components/LotteryShared/ShareModal.js +2 -0
  35. package/dist/cjs/biz-components/LotteryShared/ShareModal.js.map +7 -0
  36. package/dist/cjs/biz-components/LotteryShared/WinnerModal.d.ts +27 -0
  37. package/dist/cjs/biz-components/LotteryShared/WinnerModal.js +2 -0
  38. package/dist/cjs/biz-components/LotteryShared/WinnerModal.js.map +7 -0
  39. package/dist/cjs/biz-components/LotteryShared/index.d.ts +23 -0
  40. package/dist/cjs/biz-components/LotteryShared/index.js +2 -0
  41. package/dist/cjs/biz-components/LotteryShared/index.js.map +7 -0
  42. package/dist/cjs/biz-components/LotteryShared/types.d.ts +760 -0
  43. package/dist/cjs/biz-components/LotteryShared/types.js +2 -0
  44. package/dist/cjs/biz-components/LotteryShared/types.js.map +7 -0
  45. package/dist/cjs/biz-components/MediaEndorsement/index.js +2 -2
  46. package/dist/cjs/biz-components/MediaEndorsement/index.js.map +2 -2
  47. package/dist/cjs/biz-components/MediaShelf/index.d.ts +2 -2
  48. package/dist/cjs/biz-components/MediaShelf/index.js +1 -1
  49. package/dist/cjs/biz-components/MediaShelf/index.js.map +3 -3
  50. package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.d.ts +4 -0
  51. package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.js +2 -0
  52. package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.js.map +7 -0
  53. package/dist/cjs/biz-components/ProductLottery/index.d.ts +17 -0
  54. package/dist/cjs/biz-components/ProductLottery/index.js +2 -0
  55. package/dist/cjs/biz-components/ProductLottery/index.js.map +7 -0
  56. package/dist/cjs/biz-components/ProductLottery/types.d.ts +363 -0
  57. package/dist/cjs/biz-components/ProductLottery/types.js +2 -0
  58. package/dist/cjs/biz-components/ProductLottery/types.js.map +7 -0
  59. package/dist/cjs/biz-components/Specs/index.js +1 -1
  60. package/dist/cjs/biz-components/Specs/index.js.map +3 -3
  61. package/dist/cjs/biz-components/WheelLottery/index.d.ts +11 -11
  62. package/dist/cjs/biz-components/WheelLottery/index.js +1 -1
  63. package/dist/cjs/biz-components/WheelLottery/index.js.map +3 -3
  64. package/dist/cjs/biz-components/WheelLottery/types.d.ts +17 -723
  65. package/dist/cjs/biz-components/WheelLottery/types.js +1 -1
  66. package/dist/cjs/biz-components/WheelLottery/types.js.map +3 -3
  67. package/dist/cjs/biz-components/index.d.ts +2 -0
  68. package/dist/cjs/biz-components/index.js +1 -1
  69. package/dist/cjs/biz-components/index.js.map +3 -3
  70. package/dist/esm/biz-components/ActiveShelf/index.d.ts +2 -2
  71. package/dist/esm/biz-components/ActiveShelf/index.js +1 -1
  72. package/dist/esm/biz-components/ActiveShelf/index.js.map +3 -3
  73. package/dist/esm/biz-components/EventSchedule/index.d.ts +2 -7
  74. package/dist/esm/biz-components/EventSchedule/index.js +1 -1
  75. package/dist/esm/biz-components/EventSchedule/index.js.map +3 -3
  76. package/dist/esm/biz-components/FeaturedBlogPosts/index.d.ts +1 -6
  77. package/dist/esm/biz-components/FeaturedBlogPosts/index.js +1 -1
  78. package/dist/esm/biz-components/FeaturedBlogPosts/index.js.map +3 -3
  79. package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
  80. package/dist/esm/biz-components/HeroBanner/HeroBanner.js.map +2 -2
  81. package/dist/esm/biz-components/ImageOverlayShelf/index.d.ts +2 -2
  82. package/dist/esm/biz-components/ImageOverlayShelf/index.js +1 -1
  83. package/dist/esm/biz-components/ImageOverlayShelf/index.js.map +3 -3
  84. package/dist/esm/biz-components/LotteryShared/BaseModal.d.ts +61 -0
  85. package/dist/esm/biz-components/LotteryShared/BaseModal.js +2 -0
  86. package/dist/esm/biz-components/LotteryShared/BaseModal.js.map +7 -0
  87. package/dist/esm/biz-components/LotteryShared/ChanceMethods.d.ts +25 -0
  88. package/dist/esm/biz-components/LotteryShared/ChanceMethods.js +2 -0
  89. package/dist/esm/biz-components/LotteryShared/ChanceMethods.js.map +7 -0
  90. package/dist/esm/biz-components/LotteryShared/ErrorModal.d.ts +47 -0
  91. package/dist/esm/biz-components/LotteryShared/ErrorModal.js +2 -0
  92. package/dist/esm/biz-components/LotteryShared/ErrorModal.js.map +7 -0
  93. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.d.ts +101 -0
  94. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js +2 -0
  95. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js.map +7 -0
  96. package/dist/esm/biz-components/LotteryShared/PrizePool.d.ts +29 -0
  97. package/dist/esm/biz-components/LotteryShared/PrizePool.js +2 -0
  98. package/dist/esm/biz-components/LotteryShared/PrizePool.js.map +7 -0
  99. package/dist/esm/biz-components/LotteryShared/RulesModal.d.ts +56 -0
  100. package/dist/esm/biz-components/LotteryShared/RulesModal.js +2 -0
  101. package/dist/esm/biz-components/LotteryShared/RulesModal.js.map +7 -0
  102. package/dist/esm/biz-components/LotteryShared/ShareModal.d.ts +79 -0
  103. package/dist/esm/biz-components/LotteryShared/ShareModal.js +2 -0
  104. package/dist/esm/biz-components/LotteryShared/ShareModal.js.map +7 -0
  105. package/dist/esm/biz-components/LotteryShared/WinnerModal.d.ts +27 -0
  106. package/dist/esm/biz-components/LotteryShared/WinnerModal.js +2 -0
  107. package/dist/esm/biz-components/LotteryShared/WinnerModal.js.map +7 -0
  108. package/dist/esm/biz-components/LotteryShared/index.d.ts +23 -0
  109. package/dist/esm/biz-components/LotteryShared/index.js +2 -0
  110. package/dist/esm/biz-components/LotteryShared/index.js.map +7 -0
  111. package/dist/esm/biz-components/LotteryShared/types.d.ts +760 -0
  112. package/dist/esm/biz-components/LotteryShared/types.js +2 -0
  113. package/dist/esm/biz-components/LotteryShared/types.js.map +7 -0
  114. package/dist/esm/biz-components/MediaEndorsement/index.js +2 -2
  115. package/dist/esm/biz-components/MediaEndorsement/index.js.map +3 -3
  116. package/dist/esm/biz-components/MediaShelf/index.d.ts +2 -2
  117. package/dist/esm/biz-components/MediaShelf/index.js +1 -1
  118. package/dist/esm/biz-components/MediaShelf/index.js.map +3 -3
  119. package/dist/esm/biz-components/ProductLottery/MediaDrawArea.d.ts +4 -0
  120. package/dist/esm/biz-components/ProductLottery/MediaDrawArea.js +2 -0
  121. package/dist/esm/biz-components/ProductLottery/MediaDrawArea.js.map +7 -0
  122. package/dist/esm/biz-components/ProductLottery/index.d.ts +17 -0
  123. package/dist/esm/biz-components/ProductLottery/index.js +2 -0
  124. package/dist/esm/biz-components/ProductLottery/index.js.map +7 -0
  125. package/dist/esm/biz-components/ProductLottery/types.d.ts +363 -0
  126. package/dist/esm/biz-components/ProductLottery/types.js +2 -0
  127. package/dist/esm/biz-components/ProductLottery/types.js.map +7 -0
  128. package/dist/esm/biz-components/Specs/index.js +1 -1
  129. package/dist/esm/biz-components/Specs/index.js.map +3 -3
  130. package/dist/esm/biz-components/WheelLottery/index.d.ts +11 -11
  131. package/dist/esm/biz-components/WheelLottery/index.js +1 -1
  132. package/dist/esm/biz-components/WheelLottery/index.js.map +3 -3
  133. package/dist/esm/biz-components/WheelLottery/types.d.ts +17 -723
  134. package/dist/esm/biz-components/WheelLottery/types.js +1 -1
  135. package/dist/esm/biz-components/WheelLottery/types.js.map +3 -3
  136. package/dist/esm/biz-components/index.d.ts +2 -0
  137. package/dist/esm/biz-components/index.js +1 -1
  138. package/dist/esm/biz-components/index.js.map +2 -2
  139. package/package.json +1 -1
  140. package/style.css +77 -0
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as t,jsxs as f}from"react/jsx-runtime";import{useState as o,useCallback as P,useRef as Ye,useEffect as V,useImperativeHandle as Ve,forwardRef as Je}from"react";import{cn as m}from"../../helpers/index.js";import{DEFAULT_WHEEL_CONFIG as J,DEFAULT_CHANCE_METHODS as Qe,INITIAL_WHEEL_STATE as Xe}from"./types.js";import{Grid as Ze,GridItem as Q}from"../../components/grid.js";import{Wheel as qe}from"./Wheel.js";import{PrizePool as et}from"./PrizePool.js";import{ChanceMethods as tt}from"./ChanceMethods.js";import{WinnerModal as ot}from"./WinnerModal.js";import{RulesModal as st}from"./RulesModal.js";import{MyRewardsModal as rt}from"./MyRewardsModal.js";import{ErrorModal as X}from"./ErrorModal.js";import{ShareModal as nt}from"./ShareModal.js";import{withLayout as it}from"../../shared/Styles.js";const Z=Je(({prizes:l,theme:s,winningPrizeId:z,spinDuration:D=J.spinDuration,wheelBackgroundImage:q,pointerImage:ee,chanceMethods:L=Qe,chanceTitle:te=J.chanceTitle,chanceSubtitle:oe,chanceFooterNote:se,chanceMethodsText:E,winningInfos:re=[],prizesTitle:ne,onSpinStart:S,onSpinEnd:C,onSpinError:O,winnerModalConfig:r,rulesModalConfig:ie={},myRewardsModalConfig:ae={},errorModalConfig:u={},shareModalConfig:h={},userData:p,loginPromptText:le="Please log in to participate",loginButtonText:pe="Log In",noChancesText:de="You have no chances left",onLoginRequired:w,onCopyCode:ce,opportunitiesText:B=["Number of draws remaining today:"],className:me},fe)=>{const{rulesData:k,rulesText:F="Rules"}=ie,{rewardsData:I,myRewardsText:j="My Rewards",codeText:ue="CODE:",copyText:xe="COPY",copiedText:he="COPIED",prizeText:we="Prize time:"}=ae,ge=E?.completedText,be=E?.usedText,x=p?.isLoggedIn??!1,U=p?.availableChances||0,R=!x,G=x&&U<=0,[n,d]=o(Xe),[ye,g]=o(!1),[Te,b]=o(!1),[We,y]=o(!1),[Me,T]=o(!1),[ve,W]=o(!1),[Ee,M]=o(!1),[Ne,H]=o(""),[Pe,ze]=o(),[Se,Ce]=o(),[ke,Ie]=o(),[Re,Ae]=o(),[De,Le]=o(),[i,Oe]=o(),N=Ye(null);Ve(fe,()=>({showError:({message:e,title:a,confirmText:v})=>{H(e),ze(a),Ce(v),T(!0)},hideError:()=>{T(!1)},showNoWin:e=>{Ie(e?.title),Ae(e?.message),Le(e?.confirmText),W(!0)},hideNoWin:()=>{W(!1)},showWinner:(e,a)=>{d(v=>({...v,winningPrize:e})),Oe(a),g(!0)},hideWinner:()=>{g(!1)},showRules:()=>{b(!0)},hideRules:()=>{b(!1)},showRewards:()=>{y(!0)},hideRewards:()=>{y(!1)},showShare:()=>{M(!0)},hideShare:()=>{M(!1)},hideAllModals:()=>{g(!1),b(!1),y(!1),T(!1),W(!1),M(!1)}}),[]),V(()=>{},[l,z]),V(()=>()=>{N.current!==null&&cancelAnimationFrame(N.current)},[]);const _=P(async()=>{if(!n.isSpinning){if(!p?.isLoggedIn){w?.();return}if(!(p.availableChances<=0)){d(e=>({...e,isSpinning:!0,isButtonDisabled:!0}));try{let e=z;S&&(e=await S());const a=l.find(c=>c.prizeKey===e)||l[0],v=l.findIndex(c=>c.prizeKey===a.prizeKey),Ue=360/l.length,Ge=v*Ue,K=3*360+(360-Ge);await new Promise(c=>setTimeout(c,1500)),d(c=>({...c,isFinished:!0,currentRotation:0}));const He=Date.now(),$=()=>{const _e=Date.now()-He,Y=Math.min(_e/D,1),Ke=1-Math.pow(1-Y,3),$e=K*Ke;d(A=>({...A,currentRotation:$e})),Y<1?N.current=requestAnimationFrame($):(d(A=>({...A,isSpinning:!1,isButtonDisabled:!0,winningPrize:a,currentRotation:K})),C?C?.(a):setTimeout(()=>{a.prizeKey==="try-again"?W(!0):g(!0)},500))};N.current=requestAnimationFrame($)}catch(e){d(a=>({...a,isSpinning:!1,isButtonDisabled:!1})),H(e.message||"An error occurred"),T(!0),O?.(e),console.error("\u62BD\u5956\u63A5\u53E3\u8C03\u7528\u5931\u8D25:",e)}}}},[n.isSpinning,l,z,D,S,C,O,p,w]),Be=P(()=>{if(x){_();return}w?.()},[_,x,w]),Fe=P(()=>{g(!1),d(e=>({...e,isButtonDisabled:!1,isFinished:!1}))},[]),je=P(()=>{W(!1),d(e=>({...e,isButtonDisabled:!1,isFinished:!1}))},[]);return f("div",{className:m("wheel-lottery-container","w-full",s==="dark"?"aiui-dark":"",me),children:[f("div",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:[n.isSpinning&&"\u62BD\u5956\u8FDB\u884C\u4E2D...",n.winningPrize&&!n.isSpinning&&`\u5DF2\u4E2D\u5956: ${n.winningPrize.name}`]}),f(Ze,{className:m("wheel-lottery-main","tablet:mb-4 mb-3"),children:[t(Q,{span:7,className:m("wheel-section","relative flex w-full flex-1 items-center justify-center overflow-hidden","rounded-box","laptop:min-h-[288px] min-h-[240px]","lg-desktop:aspect-w-[964] lg-desktop:aspect-h-[480]","desktop:aspect-w-[759] desktop:aspect-h-[384]","laptop:aspect-w-[516] laptop:aspect-h-[288]","l-tablet:col-span-12","l-tablet:mb-3",s==="dark"?"bg-[#1E2024]":"bg-[#EAEAEC]"),children:f("div",{className:m("w-full px-[16px] pt-[16px]","lg-desktop:pb-[32px] lg-desktop:px-[32px]","desktop:pt-[24px] desktop:px-[24px]","laptop:pt-[16px] laptop:px-[16px]","tablet:px-[24px]","l-tablet:absolute l-tablet:top-0 l-tablet:inset-x-0 l-tablet:z-10"),children:[f("div",{className:"relative z-10 mb-2 flex max-h-[24px] w-full flex-wrap items-center justify-between gap-3",children:[t("div",{children:x&&f("p",{className:"text-info-primary font-[700]",children:[B?.[0],t("span",{className:"text-[#FF6B35]",children:U}),B?.[1]||""]})}),f("div",{className:"flex items-center gap-4",children:[k&&t("button",{onClick:()=>b(!0),className:"cursor-pointer touch-manipulation",type:"button",children:t("span",{className:"text-info-primary font-[700] underline",children:F})}),p?.isLoggedIn&&I&&t("button",{onClick:()=>y(!0),className:"cursor-pointer touch-manipulation whitespace-nowrap",type:"button",children:t("span",{className:"text-info-primary font-[700] underline",children:j})})]})]}),t(qe,{theme:s,prizes:l,rotation:n.currentRotation,isSpinning:n.isSpinning,isFinished:n.isFinished,isButtonDisabled:n.isButtonDisabled||!x||G,userData:p,onGoClick:Be,wheelBackgroundImage:q,pointerImage:ee}),(R||G)&&t("div",{className:m("rounded-box absolute inset-0 z-20 flex items-center justify-center bg-black/60 backdrop-blur-sm","px-6 text-center"),children:f("div",{className:"flex flex-col items-center gap-4",children:[t("p",{className:"lg-desktop:text-[24px] text-[18px] font-semibold text-white",children:R?le:de}),R&&t("button",{type:"button",onClick:w,className:m("rounded-full bg-white px-6 py-2 text-[14px] font-semibold text-[#1D1D1F]","transition-transform hover:scale-105 active:scale-95"),children:pe})]})})]})}),L.length>0&&t(Q,{span:5,className:m("info-section","rounded-box","relative flex flex-col overflow-hidden","lg-desktop:aspect-w-[684] lg-desktop:aspect-h-[480]","desktop:aspect-w-[536] desktop:aspect-h-[384]","laptop:aspect-w-[364] laptop:aspect-h-[288]","l-tablet:min-h-[280px] laptop:max-h-[320px]","w-full","l-tablet:col-span-12",s==="dark"?"bg-[#1E2024]":"bg-[#EAEAEC]"),children:t(tt,{theme:s,userData:p,methods:L,title:te,subtitle:oe,footerNote:se,onOpenShareModal:()=>M(!0),chanceBadgeText:E?.chanceBadgeText,completedText:ge,usedText:be,loadingText:E?.loadingText})})]}),t("div",{className:m("wheel-lottery-footer","rounded-box","flex flex-col overflow-hidden",s==="dark"?"bg-[#1E2024]":"bg-[#EAEAEC]"),children:t(et,{theme:s,prizes:l,title:ne,winningInfos:re})}),t(ot,{isOpen:ye,prize:n.winningPrize,title:i?.title||r?.title,prizeTitle:i?.prizeTitle||r?.prizeTitle,prizeImage:i?.prizeImage||r?.prizeImage,prizeDescription:i?.prizeDescription||r?.prizeDescription,learnMoreUrl:i?.learnMoreUrl||r?.learnMoreUrl,learnMoreText:i?.learnMoreText||r?.learnMoreText,couponCode:i?.couponCode||r?.couponCode,expiresAt:i?.expiresAt||r?.expiresAt,couponDiscount:i?.couponDiscount||r?.couponDiscount,couponUnit:i?.couponUnit||r?.couponUnit,confirmText:i?.confirmText||r?.confirmText,onClose:Fe,theme:s}),k&&t(st,{title:F,isOpen:Te,onClose:()=>b(!1),rules:k,theme:s}),I&&t(rt,{isOpen:We,onClose:()=>y(!1),rewards:I,onCopyCode:ce,codeText:ue,copyText:xe,copiedText:he,prizeText:we,theme:s,title:j}),t(X,{isOpen:Me,onClose:()=>T(!1),title:Pe||u?.title,message:Ne||u?.message,confirmText:Se||u?.confirmText,theme:s}),t(X,{isOpen:ve,onClose:je,title:ke||u?.title,message:Re||u?.message,confirmText:De||u?.confirmText,theme:s}),t(nt,{isOpen:Ee,onClose:()=>M(!1),title:h?.title,subtitle:h?.subtitle,note:h?.note,platforms:h?.platforms,onShareSuccess:h?.onShareSuccess,theme:s})]})});Z.displayName="WheelLottery";var Tt=it(Z);import{WinnerModal as vt}from"./WinnerModal.js";import{RulesModal as Nt}from"./RulesModal.js";import{MyRewardsModal as zt}from"./MyRewardsModal.js";import{ErrorModal as Ct}from"./ErrorModal.js";import{ShareModal as It}from"./ShareModal.js";import{BaseModal as At}from"./BaseModal.js";export{At as BaseModal,Ct as ErrorModal,zt as MyRewardsModal,Nt as RulesModal,It as ShareModal,Z as WheelLottery,vt as WinnerModal,Tt as default};
1
+ "use client";import{jsx as t,jsxs as f}from"react/jsx-runtime";import{useState as o,useCallback as N,useRef as Je,useEffect as V,useImperativeHandle as Qe,forwardRef as Xe}from"react";import{cn as m}from"../../helpers/index.js";import{DEFAULT_WHEEL_CONFIG as J,DEFAULT_CHANCE_METHODS as Ze,INITIAL_WHEEL_STATE as qe}from"./types.js";import{Grid as et,GridItem as Q}from"../../components/grid.js";import{Wheel as tt}from"./Wheel.js";import{PrizePool as ot}from"../LotteryShared/PrizePool.js";import{ChanceMethods as st}from"../LotteryShared/ChanceMethods.js";import{WinnerModal as rt}from"../LotteryShared/WinnerModal.js";import{RulesModal as nt}from"../LotteryShared/RulesModal.js";import{MyRewardsModal as it}from"../LotteryShared/MyRewardsModal.js";import{ErrorModal as X}from"../LotteryShared/ErrorModal.js";import{ShareModal as at}from"../LotteryShared/ShareModal.js";import{withLayout as lt}from"../../shared/Styles.js";const Z=Xe(({prizes:l,theme:s,winningPrizeId:P,spinDuration:A=J.spinDuration,wheelBackgroundImage:q,pointerImage:ee,chanceMethods:D=Ze,chanceTitle:te=J.chanceTitle,chanceSubtitle:oe,chanceFooterNote:se,chanceMethodsText:v,mechanismType:re,inputConfig:ne,winningInfos:ie=[],prizesTitle:ae,onSpinStart:z,onSpinEnd:C,onSpinError:O,winnerModalConfig:r,rulesModalConfig:le={},myRewardsModalConfig:pe={},errorModalConfig:u={},shareModalConfig:x={},userData:p,loginPromptText:de="Please log in to participate",loginButtonText:ce="Log In",noChancesText:me="You have no chances left",onLoginRequired:w,onCopyCode:fe,opportunitiesText:B=["Number of draws remaining today:"],className:ue},he)=>{const{rulesData:k,rulesText:F="Rules"}=le,{rewardsData:I,myRewardsText:j="My Rewards",codeText:xe="CODE:",copyText:we="COPY",copiedText:ge="COPIED",prizeText:ye="Prize time:"}=pe,be=v?.completedText,Te=v?.usedText,h=p?.isLoggedIn??!1,U=p?.availableChances||0,R=!h,G=h&&U<=0,[n,d]=o(qe),[We,g]=o(!1),[Me,y]=o(!1),[Se,b]=o(!1),[ve,T]=o(!1),[Ee,W]=o(!1),[Ne,M]=o(!1),[Pe,H]=o(""),[ze,Ce]=o(),[ke,Ie]=o(),[Re,Le]=o(),[Ae,De]=o(),[Oe,Be]=o(),[i,Fe]=o(),E=Je(null);Qe(he,()=>({showError:({message:e,title:a,confirmText:S})=>{H(e),Ce(a),Ie(S),T(!0)},hideError:()=>{T(!1)},showNoWin:e=>{Le(e?.title),De(e?.message),Be(e?.confirmText),W(!0)},hideNoWin:()=>{W(!1)},showWinner:(e,a)=>{d(S=>({...S,winningPrize:e})),Fe(a),g(!0)},hideWinner:()=>{g(!1)},showRules:()=>{y(!0)},hideRules:()=>{y(!1)},showRewards:()=>{b(!0)},hideRewards:()=>{b(!1)},showShare:()=>{M(!0)},hideShare:()=>{M(!1)},hideAllModals:()=>{g(!1),y(!1),b(!1),T(!1),W(!1),M(!1)}}),[]),V(()=>{},[l,P]),V(()=>()=>{E.current!==null&&cancelAnimationFrame(E.current)},[]);const _=N(async()=>{if(!n.isSpinning){if(!p?.isLoggedIn){w?.();return}if(!(p.availableChances<=0)){d(e=>({...e,isSpinning:!0,isButtonDisabled:!0}));try{let e=P;z&&(e=await z());const a=l.find(c=>c.prizeKey===e)||l[0],S=l.findIndex(c=>c.prizeKey===a.prizeKey),He=360/l.length,_e=S*He,K=3*360+(360-_e);await new Promise(c=>setTimeout(c,1500)),d(c=>({...c,isFinished:!0,currentRotation:0}));const Ke=Date.now(),$=()=>{const $e=Date.now()-Ke,Y=Math.min($e/A,1),Ye=1-Math.pow(1-Y,3),Ve=K*Ye;d(L=>({...L,currentRotation:Ve})),Y<1?E.current=requestAnimationFrame($):(d(L=>({...L,isSpinning:!1,isButtonDisabled:!0,winningPrize:a,currentRotation:K})),C?C?.(a):setTimeout(()=>{a.prizeKey==="try-again"?W(!0):g(!0)},500))};E.current=requestAnimationFrame($)}catch(e){d(a=>({...a,isSpinning:!1,isButtonDisabled:!1})),H(e.message||"An error occurred"),T(!0),O?.(e),console.error("\u62BD\u5956\u63A5\u53E3\u8C03\u7528\u5931\u8D25:",e)}}}},[n.isSpinning,l,P,A,z,C,O,p,w]),je=N(()=>{if(h){_();return}w?.()},[_,h,w]),Ue=N(()=>{g(!1),d(e=>({...e,isButtonDisabled:!1,isFinished:!1}))},[]),Ge=N(()=>{W(!1),d(e=>({...e,isButtonDisabled:!1,isFinished:!1}))},[]);return f("div",{className:m("wheel-lottery-container","w-full",s==="dark"?"aiui-dark":"",ue),children:[f("div",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:[n.isSpinning&&"\u62BD\u5956\u8FDB\u884C\u4E2D...",n.winningPrize&&!n.isSpinning&&`\u5DF2\u4E2D\u5956: ${n.winningPrize.name}`]}),f(et,{className:m("wheel-lottery-main","tablet:mb-4 mb-3"),children:[t(Q,{span:7,className:m("wheel-section","relative flex w-full flex-1 items-center justify-center overflow-hidden","rounded-box","laptop:min-h-[288px] min-h-[240px]","lg-desktop:aspect-w-[964] lg-desktop:aspect-h-[480]","desktop:aspect-w-[759] desktop:aspect-h-[384]","laptop:aspect-w-[516] laptop:aspect-h-[288]","l-tablet:col-span-12","l-tablet:mb-3",s==="dark"?"bg-[#1E2024]":"bg-[#EAEAEC]"),children:f("div",{className:m("w-full px-[16px] pt-[16px]","lg-desktop:pb-[32px] lg-desktop:px-[32px]","desktop:pt-[24px] desktop:px-[24px]","laptop:pt-[16px] laptop:px-[16px]","tablet:px-[24px]","l-tablet:absolute l-tablet:top-0 l-tablet:inset-x-0 l-tablet:z-10"),children:[f("div",{className:"relative z-10 mb-2 flex max-h-[24px] w-full flex-wrap items-center justify-between gap-3",children:[t("div",{children:h&&f("p",{className:"text-info-primary font-[700]",children:[B?.[0],t("span",{className:"ml-1 text-[#FF6B35]",children:U}),B?.[1]||""]})}),f("div",{className:"flex items-center gap-4",children:[k&&t("button",{onClick:()=>y(!0),className:"cursor-pointer touch-manipulation",type:"button",children:t("span",{className:"text-info-primary font-[700] underline",children:F})}),p?.isLoggedIn&&I&&t("button",{onClick:()=>b(!0),className:"cursor-pointer touch-manipulation whitespace-nowrap",type:"button",children:t("span",{className:"text-info-primary font-[700] underline",children:j})})]})]}),t(tt,{theme:s,prizes:l,rotation:n.currentRotation,isSpinning:n.isSpinning,isFinished:n.isFinished,isButtonDisabled:n.isButtonDisabled||!h||G,userData:p,onGoClick:je,wheelBackgroundImage:q,pointerImage:ee}),(R||G)&&t("div",{className:m("rounded-box absolute inset-0 z-20 flex items-center justify-center bg-black/60 backdrop-blur-sm","px-6 text-center"),children:f("div",{className:"flex flex-col items-center gap-4",children:[t("p",{className:"lg-desktop:text-[24px] text-[18px] font-semibold text-white",children:R?de:me}),R&&t("button",{type:"button",onClick:w,className:m("rounded-full bg-white px-6 py-2 text-[14px] font-semibold text-[#1D1D1F]","transition-transform hover:scale-105 active:scale-95"),children:ce})]})})]})}),D.length>0&&t(Q,{span:5,className:m("info-section","rounded-box","relative flex flex-col overflow-hidden","lg-desktop:aspect-w-[684] lg-desktop:aspect-h-[480]","desktop:aspect-w-[536] desktop:aspect-h-[384]","laptop:aspect-w-[364] laptop:aspect-h-[288]","l-tablet:min-h-[280px] laptop:max-h-[320px]","w-full","l-tablet:col-span-12",s==="dark"?"bg-[#1E2024]":"bg-[#EAEAEC]"),children:t(st,{theme:s,userData:p,methods:D,title:te,subtitle:oe,footerNote:se,onOpenShareModal:()=>M(!0),chanceBadgeText:v?.chanceBadgeText,completedText:be,usedText:Te,loadingText:v?.loadingText,mechanismType:re,inputConfig:ne})})]}),t("div",{className:m("wheel-lottery-footer","rounded-box","flex flex-col overflow-hidden",s==="dark"?"bg-[#1E2024]":"bg-[#EAEAEC]"),children:t(ot,{theme:s,prizes:l,title:ae,winningInfos:ie})}),t(rt,{isOpen:We,prize:n.winningPrize,title:i?.title||r?.title,prizeTitle:i?.prizeTitle||r?.prizeTitle,prizeImage:i?.prizeImage||r?.prizeImage,prizeDescription:i?.prizeDescription||r?.prizeDescription,learnMoreUrl:i?.learnMoreUrl||r?.learnMoreUrl,learnMoreText:i?.learnMoreText||r?.learnMoreText,couponCode:i?.couponCode||r?.couponCode,expiresAt:i?.expiresAt||r?.expiresAt,couponDiscount:i?.couponDiscount||r?.couponDiscount,couponUnit:i?.couponUnit||r?.couponUnit,confirmText:i?.confirmText||r?.confirmText,onClose:Ue,theme:s}),k&&t(nt,{title:F,isOpen:Me,onClose:()=>y(!1),rules:k,theme:s}),I&&t(it,{isOpen:Se,onClose:()=>b(!1),rewards:I,onCopyCode:fe,codeText:xe,copyText:we,copiedText:ge,prizeText:ye,theme:s,title:j}),t(X,{isOpen:ve,onClose:()=>T(!1),title:ze||u?.title,message:Pe||u?.message,confirmText:ke||u?.confirmText,theme:s}),t(X,{isOpen:Ee,onClose:Ge,title:Re||u?.title,message:Ae||u?.message,confirmText:Oe||u?.confirmText,theme:s}),t(at,{isOpen:Ne,onClose:()=>M(!1),title:x?.title,subtitle:x?.subtitle,note:x?.note,platforms:x?.platforms,onShareSuccess:x?.onShareSuccess,theme:s})]})});Z.displayName="WheelLottery";var Mt=lt(Z);import{WinnerModal as Et}from"../LotteryShared/WinnerModal.js";import{RulesModal as Pt}from"../LotteryShared/RulesModal.js";import{MyRewardsModal as Ct}from"../LotteryShared/MyRewardsModal.js";import{ErrorModal as It}from"../LotteryShared/ErrorModal.js";import{ShareModal as Lt}from"../LotteryShared/ShareModal.js";import{BaseModal as Dt}from"../LotteryShared/BaseModal.js";export{Dt as BaseModal,It as ErrorModal,Ct as MyRewardsModal,Pt as RulesModal,Lt as ShareModal,Z as WheelLottery,Et as WinnerModal,Mt as default};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/WheelLottery/index.tsx"],
4
- "sourcesContent": ["/**\n * WheelLottery - \u5927\u8F6C\u76D8\u62BD\u5956\u7EC4\u4EF6\n *\n * \u7528\u4E8E\u8425\u9500\u6D3B\u52A8\u7684\u4EA4\u4E92\u5F0F\u62BD\u5956\u8F6C\u76D8\uFF0C\u652F\u6301\u591A\u54C1\u724C\u4E3B\u9898\u548C\u54CD\u5E94\u5F0F\u5E03\u5C40\u3002\n *\n * @module WheelLottery\n * @date 2025-12-17\n */\n\n'use client'\n\nimport { useState, useCallback, useRef, useEffect, useImperativeHandle, forwardRef } from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { DEFAULT_WHEEL_CONFIG, DEFAULT_CHANCE_METHODS, INITIAL_WHEEL_STATE } from './types.js'\nimport { Grid, GridItem } from '../../components/grid.js'\nimport { Wheel } from './Wheel.js'\nimport { PrizePool } from './PrizePool.js'\nimport { ChanceMethods } from './ChanceMethods.js'\nimport { WinnerModal } from './WinnerModal.js'\nimport { RulesModal } from './RulesModal.js'\nimport { MyRewardsModal } from './MyRewardsModal.js'\nimport { ErrorModal } from './ErrorModal.js'\nimport { ShareModal } from './ShareModal.js'\nimport { withLayout } from '../../shared/Styles.js'\n\nimport type { WheelLotteryProps, WheelState, WheelLotteryHandle, WinnerModalConfig } from './types.js'\n\n// ============================================================================\n// \u4E3B\u7EC4\u4EF6\n// ============================================================================\n\n/**\n * WheelLottery \u7EC4\u4EF6\n *\n * @example\n * ```tsx\n * // \u57FA\u7840\u4F7F\u7528\n * <WheelLottery\n * prizes={prizes}\n * winningPrizeId=\"prize-003\"\n * onSpinEnd={(prize) => alert(`You won ${prize.name}`)}\n * />\n *\n * // \u4F7F\u7528 ref \u63A7\u5236\u5F39\u7A97\n * const lotteryRef = useRef<WheelLotteryHandle>(null)\n *\n * <WheelLottery ref={lotteryRef} prizes={prizes} />\n *\n * // \u5916\u90E8\u89E6\u53D1\u5F39\u7A97\n * lotteryRef.current?.showError({\n * title: 'Error',\n * message: 'Something went wrong'\n * })\n * ```\n */\nexport const WheelLottery = forwardRef<WheelLotteryHandle, WheelLotteryProps>(\n (\n {\n prizes,\n theme,\n winningPrizeId,\n spinDuration = DEFAULT_WHEEL_CONFIG.spinDuration,\n wheelBackgroundImage,\n pointerImage,\n chanceMethods = DEFAULT_CHANCE_METHODS,\n chanceTitle = DEFAULT_WHEEL_CONFIG.chanceTitle,\n chanceSubtitle,\n chanceFooterNote,\n chanceMethodsText,\n winningInfos = [],\n prizesTitle,\n onSpinStart,\n onSpinEnd,\n onSpinError,\n winnerModalConfig,\n rulesModalConfig = {},\n myRewardsModalConfig = {},\n errorModalConfig = {},\n shareModalConfig = {},\n userData,\n loginPromptText = 'Please log in to participate',\n loginButtonText = 'Log In',\n noChancesText = 'You have no chances left',\n onLoginRequired,\n onCopyCode,\n opportunitiesText = ['Number of draws remaining today:'],\n className,\n },\n ref\n ) => {\n const { rulesData, rulesText = 'Rules' } = rulesModalConfig\n const {\n rewardsData,\n myRewardsText = 'My Rewards',\n codeText = 'CODE:',\n copyText = 'COPY',\n copiedText = 'COPIED',\n prizeText = 'Prize time:',\n } = myRewardsModalConfig\n const completedText = chanceMethodsText?.completedText\n const usedText = chanceMethodsText?.usedText\n const isLoggedIn = userData?.isLoggedIn ?? false\n const availableChances = userData?.availableChances || 0\n const showLoginOverlay = !isLoggedIn\n const showNoChancesOverlay = isLoggedIn && availableChances <= 0\n // ==========================================================================\n // State \u7BA1\u7406\n // ==========================================================================\n\n const [wheelState, setWheelState] = useState<WheelState>(INITIAL_WHEEL_STATE)\n const [showWinnerModal, setShowWinnerModal] = useState(false)\n const [showRulesModal, setShowRulesModal] = useState(false)\n const [showRewardsModal, setShowRewardsModal] = useState(false)\n const [showErrorModal, setShowErrorModal] = useState(false)\n const [showNoWinModal, setShowNoWinModal] = useState(false)\n const [showShareModal, setShowShareModal] = useState(false)\n const [errorMessage, setErrorMessage] = useState('')\n const [errorTitle, setErrorTitle] = useState<string | undefined>()\n const [errorConfirmText, setErrorConfirmText] = useState<string | undefined>()\n const [noWinTitle, setNoWinTitle] = useState<string | undefined>()\n const [noWinMessage, setNoWinMessage] = useState<string | undefined>()\n const [noWinConfirmText, setNoWinConfirmText] = useState<string | undefined>()\n const [externalWinnerConfig, setExternalWinnerConfig] = useState<Partial<WinnerModalConfig> | undefined>()\n const animationRef = useRef<number | null>(null)\n\n // ==========================================================================\n // Imperative Handle - \u66B4\u9732\u65B9\u6CD5\u7ED9\u7236\u7EC4\u4EF6\n // ==========================================================================\n\n useImperativeHandle(\n ref,\n () => ({\n showError: ({ message, title, confirmText }) => {\n setErrorMessage(message)\n setErrorTitle(title)\n setErrorConfirmText(confirmText)\n setShowErrorModal(true)\n },\n hideError: () => {\n setShowErrorModal(false)\n },\n showNoWin: config => {\n setNoWinTitle(config?.title)\n setNoWinMessage(config?.message)\n setNoWinConfirmText(config?.confirmText)\n setShowNoWinModal(true)\n },\n hideNoWin: () => {\n setShowNoWinModal(false)\n },\n showWinner: (prize, config) => {\n setWheelState(prev => ({ ...prev, winningPrize: prize }))\n setExternalWinnerConfig(config)\n setShowWinnerModal(true)\n },\n hideWinner: () => {\n setShowWinnerModal(false)\n },\n showRules: () => {\n setShowRulesModal(true)\n },\n hideRules: () => {\n setShowRulesModal(false)\n },\n showRewards: () => {\n setShowRewardsModal(true)\n },\n hideRewards: () => {\n setShowRewardsModal(false)\n },\n showShare: () => {\n setShowShareModal(true)\n },\n hideShare: () => {\n setShowShareModal(false)\n },\n hideAllModals: () => {\n setShowWinnerModal(false)\n setShowRulesModal(false)\n setShowRewardsModal(false)\n setShowErrorModal(false)\n setShowNoWinModal(false)\n setShowShareModal(false)\n },\n }),\n []\n )\n\n // ==========================================================================\n // Props \u9A8C\u8BC1\uFF08\u5F00\u53D1\u73AF\u5883\uFF09\n // ==========================================================================\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development' && prizes) {\n if (prizes.length !== 8) {\n console.warn(\n `WheelLottery expects exactly 8 prizes, got ${prizes.length}. The component may not render correctly.`\n )\n }\n\n if (winningPrizeId && !prizes.find(p => p.prizeKey === winningPrizeId)) {\n console.warn(`WheelLottery: winningPrizeId \"${winningPrizeId}\" not found in prizes array.`)\n }\n }\n }, [prizes, winningPrizeId])\n\n // ==========================================================================\n // \u6E05\u7406\u52A8\u753B\n // ==========================================================================\n\n useEffect(() => {\n return () => {\n // \u7EC4\u4EF6\u5378\u8F7D\u65F6\u53D6\u6D88\u52A8\u753B\u5E27\n if (animationRef.current !== null) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n // ==========================================================================\n // \u62BD\u5956\u903B\u8F91\n // ==========================================================================\n\n /**\n * \u5F00\u59CB\u62BD\u5956 - \u652F\u6301\u5F02\u6B65\u63A5\u53E3\u8C03\u7528\n * \u5229\u7528\u521D\u59CB\u6162\u901F\u65CB\u8F6C\uFF0C\u70B9\u51FB\u540E\u8FDB\u5165\u5FEB\u901F\u65CB\u8F6C\u72B6\u6001\uFF0C\u63A5\u53E3\u8FD4\u56DE\u540E\u51CF\u901F\u505C\u6B62\n */\n const handleSpinStart = useCallback(async () => {\n if (wheelState.isSpinning) return\n\n // \u68C0\u67E5\u7528\u6237\u662F\u5426\u5DF2\u767B\u5F55\n if (!userData?.isLoggedIn) {\n onLoginRequired?.()\n return\n }\n\n // \u2705 \u6B21\u6570\u4E3A 0 \u65F6\uFF0C\u6309\u94AE\u5DF2\u88AB\u7981\u7528\uFF0C\u8FD9\u91CC\u4E0D\u9700\u8981\u989D\u5916\u68C0\u67E5\n // \u9632\u5FA1\u6027\u7F16\u7A0B\uFF1A\u5982\u679C\u4ECD\u7136\u89E6\u53D1\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (userData.availableChances <= 0) {\n return\n }\n\n // \u8FDB\u5165\u5FEB\u901F\u65CB\u8F6C\u72B6\u6001\uFF08\u521D\u59CB\u6162\u901F\u65CB\u8F6C\u4F1A\u81EA\u52A8\u53D8\u4E3A\u5FEB\u901F\u65CB\u8F6C\uFF09\n setWheelState(prev => ({\n ...prev,\n isSpinning: true,\n isButtonDisabled: true,\n }))\n\n try {\n // \u8C03\u7528\u5916\u90E8\u63A5\u53E3\u83B7\u53D6\u4E2D\u5956\u7ED3\u679C\n let finalWinningPrizeId = winningPrizeId\n\n if (onSpinStart) {\n // \u7B49\u5F85\u63A5\u53E3\u8FD4\u56DE\u4E2D\u5956 ID\uFF08\u63A5\u53E3\u65F6\u95F4\u4E0D\u56FA\u5B9A\uFF0C1-30s\uFF09\n // \u5728\u6B64\u671F\u95F4\uFF0C\u8F6C\u76D8\u4F1A\u4FDD\u6301\u5FEB\u901F\u65CB\u8F6C\uFF08\u7531 CSS \u52A8\u753B\u63A7\u5236\uFF09\n finalWinningPrizeId = await onSpinStart()\n }\n\n // \u786E\u5B9A\u4E2D\u5956\u5956\u54C1\n const winningPrize = prizes.find(p => p.prizeKey === finalWinningPrizeId) || prizes[0]\n const winningIndex = prizes.findIndex(p => p.prizeKey === winningPrize.prizeKey)\n\n // \u8BA1\u7B97\u76EE\u6807\u89D2\u5EA6\n const degreesPerPrize = 360 / prizes.length\n const basePrizeAngle = winningIndex * degreesPerPrize\n // \u81F3\u5C11\u65CB\u8F6C 3 \u5708\uFF081080\u5EA6\uFF09+ \u76EE\u6807\u89D2\u5EA6\n const minRotations = 3\n const targetAngle = minRotations * 360 + (360 - basePrizeAngle)\n\n // \u63A5\u53E3\u8FD4\u56DE\u540E\uFF0C\u7B49\u5F85 1.5s \u518D\u5F00\u59CB\u505C\u6B62\u52A8\u753B\n await new Promise(resolve => setTimeout(resolve, 1500))\n\n // \u7ACB\u5373\u8FDB\u5165\u51CF\u901F\u72B6\u6001\uFF0C\u505C\u6B62 CSS \u5FAA\u73AF\u52A8\u753B\n setWheelState(prev => ({\n ...prev,\n isFinished: true,\n currentRotation: 0, // \u4ECE 0 \u5EA6\u5F00\u59CB\u51CF\u901F\u52A8\u753B\n }))\n\n // \u5F00\u59CB\u505C\u6B62\u65CB\u8F6C\u52A8\u753B\n const startTime = Date.now()\n\n const animate = () => {\n const now = Date.now()\n const elapsed = now - startTime\n const progress = Math.min(elapsed / spinDuration, 1)\n\n // \u5E94\u7528 ease-out \u7F13\u52A8\u51FD\u6570\n const eased = 1 - Math.pow(1 - progress, 3)\n\n // \u8BA1\u7B97\u5F53\u524D\u65CB\u8F6C\u89D2\u5EA6\n const currentRotation = targetAngle * eased\n\n // \u66F4\u65B0\u72B6\u6001\n setWheelState(prev => ({\n ...prev,\n currentRotation,\n }))\n\n // \u7EE7\u7EED\u52A8\u753B\u6216\u7ED3\u675F\n if (progress < 1) {\n animationRef.current = requestAnimationFrame(animate)\n } else {\n // \u52A8\u753B\u7ED3\u675F - \u4FDD\u6301\u6309\u94AE\u7981\u7528\u72B6\u6001,\u76F4\u5230\u5F39\u7A97\u5173\u95ED\n setWheelState(prev => ({\n ...prev,\n isSpinning: false,\n isButtonDisabled: true,\n winningPrize,\n currentRotation: targetAngle,\n }))\n\n // \u5EF6\u8FDF\u663E\u793A\u5F39\u7A97\uFF08500ms\u540E\uFF09\n if (onSpinEnd) {\n onSpinEnd?.(winningPrize)\n } else {\n setTimeout(() => {\n // \u68C0\u67E5\u662F\u5426\u672A\u4E2D\u5956\uFF08try-again\uFF09\n if (winningPrize.prizeKey === 'try-again') {\n // \u672A\u4E2D\u5956\uFF0C\u663E\u793A ErrorModal\n setShowNoWinModal(true)\n } else {\n // \u4E2D\u5956\uFF0C\u663E\u793A WinnerModal\n setShowWinnerModal(true)\n }\n }, 500)\n }\n }\n }\n\n // \u542F\u52A8\u505C\u6B62\u52A8\u753B\n animationRef.current = requestAnimationFrame(animate)\n } catch (error) {\n // \u63A5\u53E3\u62A5\u9519\uFF0C\u6062\u590D\u5230\u521D\u59CB\u6162\u901F\u65CB\u8F6C\u72B6\u6001\n setWheelState(prev => ({\n ...prev,\n isSpinning: false,\n isButtonDisabled: false,\n }))\n\n // \u663E\u793A\u9519\u8BEF\u5F39\u7A97\n setErrorMessage((error as Error).message || 'An error occurred')\n setShowErrorModal(true)\n\n // \u89E6\u53D1\u9519\u8BEF\u56DE\u8C03\n onSpinError?.(error as Error)\n\n console.error('\u62BD\u5956\u63A5\u53E3\u8C03\u7528\u5931\u8D25:', error)\n }\n }, [\n wheelState.isSpinning,\n prizes,\n winningPrizeId,\n spinDuration,\n onSpinStart,\n onSpinEnd,\n onSpinError,\n userData,\n onLoginRequired,\n ])\n\n const handleWheelGoClick = useCallback(() => {\n if (isLoggedIn) {\n void handleSpinStart()\n return\n }\n\n onLoginRequired?.()\n }, [handleSpinStart, isLoggedIn, onLoginRequired])\n\n // ==========================================================================\n // \u5F39\u7A97\u5173\u95ED\u5904\u7406\n // ==========================================================================\n\n /**\n * \u5173\u95ED\u4E2D\u5956\u5F39\u7A97\u5E76\u91CD\u7F6E\u8F6C\u76D8\u72B6\u6001\n */\n const handleCloseWinnerModal = useCallback(() => {\n setShowWinnerModal(false)\n // \u91CD\u7F6E\u8F6C\u76D8\u72B6\u6001,\u5141\u8BB8\u4E0B\u6B21\u62BD\u5956\n setWheelState(prev => ({\n ...prev,\n isButtonDisabled: false,\n isFinished: false, // \u91CD\u7F6E\u4E3A\u672A\u5B8C\u6210,\u6062\u590D\u521D\u59CB\u65CB\u8F6C\u52A8\u753B\n }))\n }, [])\n\n /**\n * \u5173\u95ED\u672A\u4E2D\u5956\u5F39\u7A97\u5E76\u91CD\u7F6E\u8F6C\u76D8\u72B6\u6001\n */\n const handleCloseNoWinModal = useCallback(() => {\n setShowNoWinModal(false)\n // \u91CD\u7F6E\u8F6C\u76D8\u72B6\u6001,\u5141\u8BB8\u4E0B\u6B21\u62BD\u5956\n setWheelState(prev => ({\n ...prev,\n isButtonDisabled: false,\n isFinished: false, // \u91CD\u7F6E\u4E3A\u672A\u5B8C\u6210,\u6062\u590D\u521D\u59CB\u65CB\u8F6C\u52A8\u753B\n }))\n }, [])\n\n // ==========================================================================\n // \u6E32\u67D3\n // ==========================================================================\n\n return (\n <div className={cn('wheel-lottery-container', 'w-full', theme === 'dark' ? 'aiui-dark' : '', className)}>\n {/* ARIA Live Region - \u5C4F\u5E55\u9605\u8BFB\u5668\u72B6\u6001\u64AD\u62A5 */}\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {wheelState.isSpinning && '\u62BD\u5956\u8FDB\u884C\u4E2D...'}\n {wheelState.winningPrize && !wheelState.isSpinning && `\u5DF2\u4E2D\u5956: ${wheelState.winningPrize.name}`}\n </div>\n\n {/* \u4E3B\u5185\u5BB9\u533A - \u54CD\u5E94\u5F0F\u4E24\u680F/\u5355\u680F\u5E03\u5C40 */}\n <Grid className={cn('wheel-lottery-main', 'tablet:mb-4 mb-3')}>\n {/* \u5DE6\u4FA7\uFF1A\u8F6C\u76D8\u533A\u57DF */}\n <GridItem\n span={7}\n className={cn(\n 'wheel-section',\n 'relative flex w-full flex-1 items-center justify-center overflow-hidden',\n 'rounded-box',\n // \u79FB\u52A8\u7AEF\uFF08<=1024px\uFF09\u4F7F\u7528min-h\uFF0C\u684C\u9762\u7AEF\u4F7F\u7528aspect ratio\n 'laptop:min-h-[288px] min-h-[240px]',\n 'lg-desktop:aspect-w-[964] lg-desktop:aspect-h-[480]',\n 'desktop:aspect-w-[759] desktop:aspect-h-[384]',\n 'laptop:aspect-w-[516] laptop:aspect-h-[288]',\n 'l-tablet:col-span-12',\n // \u79FB\u52A8\u7AEF\u5E95\u90E8\u95F4\u8DDD\n 'l-tablet:mb-3',\n theme === 'dark' ? 'bg-[#1E2024]' : 'bg-[#EAEAEC]'\n )}\n >\n <div\n className={cn(\n 'w-full px-[16px] pt-[16px]',\n 'lg-desktop:pb-[32px] lg-desktop:px-[32px]',\n 'desktop:pt-[24px] desktop:px-[24px]',\n 'laptop:pt-[16px] laptop:px-[16px]',\n 'tablet:px-[24px]',\n // \u79FB\u52A8\u7AEF(<=1024px)\u65F6\u4F7F\u7528\u7EDD\u5BF9\u5B9A\u4F4D\u8986\u76D6\u5728\u8F6C\u76D8\u80CC\u666F\u4E0A\n 'l-tablet:absolute l-tablet:top-0 l-tablet:inset-x-0 l-tablet:z-10'\n )}\n >\n {/* \u9876\u90E8\u4FE1\u606F\u680F\uFF1A\u5DE6\u4FA7\u673A\u4F1A\u8FDB\u5EA6\uFF0C\u53F3\u4FA7\u94FE\u63A5 */}\n <div className=\"relative z-10 mb-2 flex max-h-[24px] w-full flex-wrap items-center justify-between gap-3\">\n {/* \u5DE6\u4FA7\uFF1A\u673A\u4F1A\u5C55\u793A - \u4EC5\u767B\u5F55\u65F6\u663E\u793A */}\n <div>\n {isLoggedIn && (\n <p className=\"text-info-primary font-[700]\">\n {opportunitiesText?.[0]}\n <span className=\"text-[#FF6B35]\">{availableChances}</span>\n {opportunitiesText?.[1] || ''}\n </p>\n )}\n </div>\n {/* \u53F3\u4FA7\uFF1ARules \u548C My Rewards \u6309\u94AE */}\n <div className=\"flex items-center gap-4\">\n {rulesData && (\n <button\n onClick={() => setShowRulesModal(true)}\n className=\"cursor-pointer touch-manipulation\"\n type=\"button\"\n >\n <span className=\"text-info-primary font-[700] underline\">{rulesText}</span>\n </button>\n )}\n {/* My Rewards \u6309\u94AE - \u4EC5\u767B\u5F55\u65F6\u663E\u793A */}\n {userData?.isLoggedIn && rewardsData && (\n <button\n onClick={() => setShowRewardsModal(true)}\n className=\"cursor-pointer touch-manipulation whitespace-nowrap\"\n type=\"button\"\n >\n <span className=\"text-info-primary font-[700] underline\">{myRewardsText}</span>\n </button>\n )}\n </div>\n </div>\n {/* \u8F6C\u76D8\u7EC4\u4EF6 */}\n <Wheel\n theme={theme}\n prizes={prizes}\n rotation={wheelState.currentRotation}\n isSpinning={wheelState.isSpinning}\n isFinished={wheelState.isFinished}\n isButtonDisabled={wheelState.isButtonDisabled || !isLoggedIn || showNoChancesOverlay}\n userData={userData}\n onGoClick={handleWheelGoClick}\n wheelBackgroundImage={wheelBackgroundImage}\n pointerImage={pointerImage}\n />\n\n {(showLoginOverlay || showNoChancesOverlay) && (\n <div\n className={cn(\n 'rounded-box absolute inset-0 z-20 flex items-center justify-center bg-black/60 backdrop-blur-sm',\n 'px-6 text-center'\n )}\n >\n <div className=\"flex flex-col items-center gap-4\">\n <p className=\"lg-desktop:text-[24px] text-[18px] font-semibold text-white\">\n {showLoginOverlay ? loginPromptText : noChancesText}\n </p>\n {showLoginOverlay && (\n <button\n type=\"button\"\n onClick={onLoginRequired}\n className={cn(\n 'rounded-full bg-white px-6 py-2 text-[14px] font-semibold text-[#1D1D1F]',\n 'transition-transform hover:scale-105 active:scale-95'\n )}\n >\n {loginButtonText}\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n </GridItem>\n\n {/* \u53F3\u4FA7\uFF1A\u83B7\u53D6\u673A\u4F1A\u533A\u57DF */}\n {chanceMethods.length > 0 && (\n <GridItem\n span={5}\n className={cn(\n 'info-section',\n 'rounded-box',\n 'relative flex flex-col overflow-hidden',\n 'lg-desktop:aspect-w-[684] lg-desktop:aspect-h-[480]',\n 'desktop:aspect-w-[536] desktop:aspect-h-[384]',\n 'laptop:aspect-w-[364] laptop:aspect-h-[288]',\n // \u79FB\u52A8\u7AEF\u4F7F\u7528min-h\u800C\u4E0D\u662Fmax-h\uFF0C\u786E\u4FDD\u5185\u5BB9\u5B8C\u6574\u663E\u793A\n 'l-tablet:min-h-[280px] laptop:max-h-[320px]',\n 'w-full',\n 'l-tablet:col-span-12',\n theme === 'dark' ? 'bg-[#1E2024]' : 'bg-[#EAEAEC]'\n )}\n >\n <ChanceMethods\n theme={theme}\n userData={userData}\n methods={chanceMethods}\n title={chanceTitle}\n subtitle={chanceSubtitle}\n footerNote={chanceFooterNote}\n onOpenShareModal={() => setShowShareModal(true)}\n chanceBadgeText={chanceMethodsText?.chanceBadgeText}\n completedText={completedText}\n usedText={usedText}\n loadingText={chanceMethodsText?.loadingText}\n />\n </GridItem>\n )}\n </Grid>\n\n {/* \u5E95\u90E8\u533A\u57DF\uFF1A\u5956\u54C1\u6C60(\u5305\u542B\u4E2D\u5956\u4EBA\u540D\u5355) */}\n <div\n className={cn(\n 'wheel-lottery-footer',\n 'rounded-box',\n 'flex flex-col overflow-hidden',\n theme === 'dark' ? 'bg-[#1E2024]' : 'bg-[#EAEAEC]'\n )}\n >\n {/* \u5956\u54C1\u6C60(\u5305\u542B\u4E2D\u5956\u4EBA\u540D\u5355\u81EA\u52A8\u6EDA\u52A8) */}\n <PrizePool theme={theme} prizes={prizes} title={prizesTitle} winningInfos={winningInfos} />\n </div>\n\n {/* \u4E2D\u5956\u5F39\u7A97 */}\n <WinnerModal\n isOpen={showWinnerModal}\n prize={wheelState.winningPrize}\n title={externalWinnerConfig?.title || winnerModalConfig?.title}\n prizeTitle={externalWinnerConfig?.prizeTitle || winnerModalConfig?.prizeTitle}\n prizeImage={externalWinnerConfig?.prizeImage || winnerModalConfig?.prizeImage}\n prizeDescription={externalWinnerConfig?.prizeDescription || winnerModalConfig?.prizeDescription}\n learnMoreUrl={externalWinnerConfig?.learnMoreUrl || winnerModalConfig?.learnMoreUrl}\n learnMoreText={externalWinnerConfig?.learnMoreText || winnerModalConfig?.learnMoreText}\n couponCode={externalWinnerConfig?.couponCode || winnerModalConfig?.couponCode}\n expiresAt={externalWinnerConfig?.expiresAt || winnerModalConfig?.expiresAt}\n couponDiscount={externalWinnerConfig?.couponDiscount || winnerModalConfig?.couponDiscount}\n couponUnit={externalWinnerConfig?.couponUnit || winnerModalConfig?.couponUnit}\n confirmText={externalWinnerConfig?.confirmText || winnerModalConfig?.confirmText}\n onClose={handleCloseWinnerModal}\n theme={theme}\n />\n\n {/* Rules \u5F39\u7A97 */}\n {rulesData && (\n <RulesModal\n title={rulesText}\n isOpen={showRulesModal}\n onClose={() => setShowRulesModal(false)}\n rules={rulesData}\n theme={theme}\n />\n )}\n\n {/* My Rewards \u5F39\u7A97 */}\n {rewardsData && (\n <MyRewardsModal\n isOpen={showRewardsModal}\n onClose={() => setShowRewardsModal(false)}\n rewards={rewardsData}\n onCopyCode={onCopyCode}\n codeText={codeText}\n copyText={copyText}\n copiedText={copiedText}\n prizeText={prizeText}\n theme={theme}\n title={myRewardsText}\n />\n )}\n\n {/* \u9519\u8BEF\u5F39\u7A97 */}\n <ErrorModal\n isOpen={showErrorModal}\n onClose={() => setShowErrorModal(false)}\n title={errorTitle || errorModalConfig?.title}\n message={errorMessage || errorModalConfig?.message}\n confirmText={errorConfirmText || errorModalConfig?.confirmText}\n theme={theme}\n />\n\n {/* \u672A\u4E2D\u5956\u5F39\u7A97 */}\n <ErrorModal\n isOpen={showNoWinModal}\n onClose={handleCloseNoWinModal}\n title={noWinTitle || errorModalConfig?.title}\n message={noWinMessage || errorModalConfig?.message}\n confirmText={noWinConfirmText || errorModalConfig?.confirmText}\n theme={theme}\n />\n\n {/* \u5206\u4EAB\u5F39\u7A97 */}\n <ShareModal\n isOpen={showShareModal}\n onClose={() => setShowShareModal(false)}\n title={shareModalConfig?.title}\n subtitle={shareModalConfig?.subtitle}\n note={shareModalConfig?.note}\n platforms={shareModalConfig?.platforms}\n onShareSuccess={shareModalConfig?.onShareSuccess}\n theme={theme}\n />\n </div>\n )\n }\n)\n\n// \u8BBE\u7F6E displayName \u7528\u4E8E\u8C03\u8BD5\nWheelLottery.displayName = 'WheelLottery'\n\n// ============================================================================\n// \u5BFC\u51FA\n// ============================================================================\n\nexport default withLayout(WheelLottery)\nexport { WinnerModal } from './WinnerModal.js'\nexport { RulesModal } from './RulesModal.js'\nexport { MyRewardsModal } from './MyRewardsModal.js'\nexport { ErrorModal } from './ErrorModal.js'\nexport { ShareModal } from './ShareModal.js'\nexport { BaseModal } from './BaseModal.js'\nexport type {\n WheelLotteryProps,\n WheelLotteryHandle,\n Prize,\n ChanceMethod,\n ChanceMethodStatus,\n WinningInfo,\n WheelProps,\n PrizePoolProps,\n ChanceMethodsProps,\n WinnerModalProps,\n WinnerModalConfig,\n UserData,\n ShareModalConfig,\n SocialPlatform,\n SharePlatformConfig,\n} from './types.js'\nexport type { RulesModalProps, RuleItem } from './RulesModal.js'\nexport type { MyRewardsModalProps, Reward, RewardStatus } from './MyRewardsModal.js'\nexport type { ErrorModalProps } from './ErrorModal.js'\nexport type { ShareModalProps } from './ShareModal.js'\nexport type { BaseModalProps } from './BaseModal.js'\n"],
5
- "mappings": "aAwZQ,OA2Cc,OAAAA,EA3Cd,QAAAC,MAAA,oBA7YR,OAAS,YAAAC,EAAU,eAAAC,EAAa,UAAAC,GAAQ,aAAAC,EAAW,uBAAAC,GAAqB,cAAAC,OAAkB,QAC1F,OAAS,MAAAC,MAAU,yBACnB,OAAS,wBAAAC,EAAsB,0BAAAC,GAAwB,uBAAAC,OAA2B,aAClF,OAAS,QAAAC,GAAM,YAAAC,MAAgB,2BAC/B,OAAS,SAAAC,OAAa,aACtB,OAAS,aAAAC,OAAiB,iBAC1B,OAAS,iBAAAC,OAAqB,qBAC9B,OAAS,eAAAC,OAAmB,mBAC5B,OAAS,cAAAC,OAAkB,kBAC3B,OAAS,kBAAAC,OAAsB,sBAC/B,OAAS,cAAAC,MAAkB,kBAC3B,OAAS,cAAAC,OAAkB,kBAC3B,OAAS,cAAAC,OAAkB,yBAgCpB,MAAMC,EAAehB,GAC1B,CACE,CACE,OAAAiB,EACA,MAAAC,EACA,eAAAC,EACA,aAAAC,EAAelB,EAAqB,aACpC,qBAAAmB,EACA,aAAAC,GACA,cAAAC,EAAgBpB,GAChB,YAAAqB,GAActB,EAAqB,YACnC,eAAAuB,GACA,iBAAAC,GACA,kBAAAC,EACA,aAAAC,GAAe,CAAC,EAChB,YAAAC,GACA,YAAAC,EACA,UAAAC,EACA,YAAAC,EACA,kBAAAC,EACA,iBAAAC,GAAmB,CAAC,EACpB,qBAAAC,GAAuB,CAAC,EACxB,iBAAAC,EAAmB,CAAC,EACpB,iBAAAC,EAAmB,CAAC,EACpB,SAAAC,EACA,gBAAAC,GAAkB,+BAClB,gBAAAC,GAAkB,SAClB,cAAAC,GAAgB,2BAChB,gBAAAC,EACA,WAAAC,GACA,kBAAAC,EAAoB,CAAC,kCAAkC,EACvD,UAAAC,EACF,EACAC,KACG,CACH,KAAM,CAAE,UAAAC,EAAW,UAAAC,EAAY,OAAQ,EAAId,GACrC,CACJ,YAAAe,EACA,cAAAC,EAAgB,aAChB,SAAAC,GAAW,QACX,SAAAC,GAAW,OACX,WAAAC,GAAa,SACb,UAAAC,GAAY,aACd,EAAInB,GACEoB,GAAgB5B,GAAmB,cACnC6B,GAAW7B,GAAmB,SAC9B8B,EAAanB,GAAU,YAAc,GACrCoB,EAAmBpB,GAAU,kBAAoB,EACjDqB,EAAmB,CAACF,EACpBG,EAAuBH,GAAcC,GAAoB,EAKzD,CAACG,EAAYC,CAAa,EAAInE,EAAqBS,EAAmB,EACtE,CAAC2D,GAAiBC,CAAkB,EAAIrE,EAAS,EAAK,EACtD,CAACsE,GAAgBC,CAAiB,EAAIvE,EAAS,EAAK,EACpD,CAACwE,GAAkBC,CAAmB,EAAIzE,EAAS,EAAK,EACxD,CAAC0E,GAAgBC,CAAiB,EAAI3E,EAAS,EAAK,EACpD,CAAC4E,GAAgBC,CAAiB,EAAI7E,EAAS,EAAK,EACpD,CAAC8E,GAAgBC,CAAiB,EAAI/E,EAAS,EAAK,EACpD,CAACgF,GAAcC,CAAe,EAAIjF,EAAS,EAAE,EAC7C,CAACkF,GAAYC,EAAa,EAAInF,EAA6B,EAC3D,CAACoF,GAAkBC,EAAmB,EAAIrF,EAA6B,EACvE,CAACsF,GAAYC,EAAa,EAAIvF,EAA6B,EAC3D,CAACwF,GAAcC,EAAe,EAAIzF,EAA6B,EAC/D,CAAC0F,GAAkBC,EAAmB,EAAI3F,EAA6B,EACvE,CAAC4F,EAAsBC,EAAuB,EAAI7F,EAAiD,EACnG8F,EAAe5F,GAAsB,IAAI,EAM/CE,GACE+C,GACA,KAAO,CACL,UAAW,CAAC,CAAE,QAAA4C,EAAS,MAAAC,EAAO,YAAAC,CAAY,IAAM,CAC9ChB,EAAgBc,CAAO,EACvBZ,GAAca,CAAK,EACnBX,GAAoBY,CAAW,EAC/BtB,EAAkB,EAAI,CACxB,EACA,UAAW,IAAM,CACfA,EAAkB,EAAK,CACzB,EACA,UAAWuB,GAAU,CACnBX,GAAcW,GAAQ,KAAK,EAC3BT,GAAgBS,GAAQ,OAAO,EAC/BP,GAAoBO,GAAQ,WAAW,EACvCrB,EAAkB,EAAI,CACxB,EACA,UAAW,IAAM,CACfA,EAAkB,EAAK,CACzB,EACA,WAAY,CAACsB,EAAOD,IAAW,CAC7B/B,EAAciC,IAAS,CAAE,GAAGA,EAAM,aAAcD,CAAM,EAAE,EACxDN,GAAwBK,CAAM,EAC9B7B,EAAmB,EAAI,CACzB,EACA,WAAY,IAAM,CAChBA,EAAmB,EAAK,CAC1B,EACA,UAAW,IAAM,CACfE,EAAkB,EAAI,CACxB,EACA,UAAW,IAAM,CACfA,EAAkB,EAAK,CACzB,EACA,YAAa,IAAM,CACjBE,EAAoB,EAAI,CAC1B,EACA,YAAa,IAAM,CACjBA,EAAoB,EAAK,CAC3B,EACA,UAAW,IAAM,CACfM,EAAkB,EAAI,CACxB,EACA,UAAW,IAAM,CACfA,EAAkB,EAAK,CACzB,EACA,cAAe,IAAM,CACnBV,EAAmB,EAAK,EACxBE,EAAkB,EAAK,EACvBE,EAAoB,EAAK,EACzBE,EAAkB,EAAK,EACvBE,EAAkB,EAAK,EACvBE,EAAkB,EAAK,CACzB,CACF,GACA,CAAC,CACH,EAMA5E,EAAU,IAAM,CAYhB,EAAG,CAACmB,EAAQE,CAAc,CAAC,EAM3BrB,EAAU,IACD,IAAM,CAEP2F,EAAa,UAAY,MAC3B,qBAAqBA,EAAa,OAAO,CAE7C,EACC,CAAC,CAAC,EAUL,MAAMO,EAAkBpG,EAAY,SAAY,CAC9C,GAAI,CAAAiE,EAAW,WAGf,IAAI,CAACvB,GAAU,WAAY,CACzBI,IAAkB,EAClB,MACF,CAIA,GAAI,EAAAJ,EAAS,kBAAoB,GAKjC,CAAAwB,EAAciC,IAAS,CACrB,GAAGA,EACH,WAAY,GACZ,iBAAkB,EACpB,EAAE,EAEF,GAAI,CAEF,IAAIE,EAAsB9E,EAEtBW,IAGFmE,EAAsB,MAAMnE,EAAY,GAI1C,MAAMoE,EAAejF,EAAO,KAAKkF,GAAKA,EAAE,WAAaF,CAAmB,GAAKhF,EAAO,CAAC,EAC/EmF,EAAenF,EAAO,UAAUkF,GAAKA,EAAE,WAAaD,EAAa,QAAQ,EAGzEG,GAAkB,IAAMpF,EAAO,OAC/BqF,GAAiBF,EAAeC,GAGhCE,EADe,EACc,KAAO,IAAMD,IAGhD,MAAM,IAAI,QAAQE,GAAW,WAAWA,EAAS,IAAI,CAAC,EAGtD1C,EAAciC,IAAS,CACrB,GAAGA,EACH,WAAY,GACZ,gBAAiB,CACnB,EAAE,EAGF,MAAMU,GAAY,KAAK,IAAI,EAErBC,EAAU,IAAM,CAEpB,MAAMC,GADM,KAAK,IAAI,EACCF,GAChBG,EAAW,KAAK,IAAID,GAAUvF,EAAc,CAAC,EAG7CyF,GAAQ,EAAI,KAAK,IAAI,EAAID,EAAU,CAAC,EAGpCE,GAAkBP,EAAcM,GAGtC/C,EAAciC,IAAS,CACrB,GAAGA,EACH,gBAAAe,EACF,EAAE,EAGEF,EAAW,EACbnB,EAAa,QAAU,sBAAsBiB,CAAO,GAGpD5C,EAAciC,IAAS,CACrB,GAAGA,EACH,WAAY,GACZ,iBAAkB,GAClB,aAAAG,EACA,gBAAiBK,CACnB,EAAE,EAGExE,EACFA,IAAYmE,CAAY,EAExB,WAAW,IAAM,CAEXA,EAAa,WAAa,YAE5B1B,EAAkB,EAAI,EAGtBR,EAAmB,EAAI,CAE3B,EAAG,GAAG,EAGZ,EAGAyB,EAAa,QAAU,sBAAsBiB,CAAO,CACtD,OAASK,EAAO,CAEdjD,EAAciC,IAAS,CACrB,GAAGA,EACH,WAAY,GACZ,iBAAkB,EACpB,EAAE,EAGFnB,EAAiBmC,EAAgB,SAAW,mBAAmB,EAC/DzC,EAAkB,EAAI,EAGtBtC,IAAc+E,CAAc,EAE5B,QAAQ,MAAM,oDAAaA,CAAK,CAClC,GACF,EAAG,CACDlD,EAAW,WACX5C,EACAE,EACAC,EACAU,EACAC,EACAC,EACAM,EACAI,CACF,CAAC,EAEKsE,GAAqBpH,EAAY,IAAM,CAC3C,GAAI6D,EAAY,CACTuC,EAAgB,EACrB,MACF,CAEAtD,IAAkB,CACpB,EAAG,CAACsD,EAAiBvC,EAAYf,CAAe,CAAC,EAS3CuE,GAAyBrH,EAAY,IAAM,CAC/CoE,EAAmB,EAAK,EAExBF,EAAciC,IAAS,CACrB,GAAGA,EACH,iBAAkB,GAClB,WAAY,EACd,EAAE,CACJ,EAAG,CAAC,CAAC,EAKCmB,GAAwBtH,EAAY,IAAM,CAC9C4E,EAAkB,EAAK,EAEvBV,EAAciC,IAAS,CACrB,GAAGA,EACH,iBAAkB,GAClB,WAAY,EACd,EAAE,CACJ,EAAG,CAAC,CAAC,EAML,OACErG,EAAC,OAAI,UAAWO,EAAG,0BAA2B,SAAUiB,IAAU,OAAS,YAAc,GAAI2B,EAAS,EAEpG,UAAAnD,EAAC,OAAI,KAAK,SAAS,YAAU,SAAS,cAAY,OAAO,UAAU,UAChE,UAAAmE,EAAW,YAAc,oCACzBA,EAAW,cAAgB,CAACA,EAAW,YAAc,uBAAQA,EAAW,aAAa,IAAI,IAC5F,EAGAnE,EAACW,GAAA,CAAK,UAAWJ,EAAG,qBAAsB,kBAAkB,EAE1D,UAAAR,EAACa,EAAA,CACC,KAAM,EACN,UAAWL,EACT,gBACA,0EACA,cAEA,qCACA,sDACA,gDACA,8CACA,uBAEA,gBACAiB,IAAU,OAAS,eAAiB,cACtC,EAEA,SAAAxB,EAAC,OACC,UAAWO,EACT,6BACA,4CACA,sCACA,oCACA,mBAEA,mEACF,EAGA,UAAAP,EAAC,OAAI,UAAU,2FAEb,UAAAD,EAAC,OACE,SAAAgE,GACC/D,EAAC,KAAE,UAAU,+BACV,UAAAkD,IAAoB,CAAC,EACtBnD,EAAC,QAAK,UAAU,iBAAkB,SAAAiE,EAAiB,EAClDd,IAAoB,CAAC,GAAK,IAC7B,EAEJ,EAEAlD,EAAC,OAAI,UAAU,0BACZ,UAAAqD,GACCtD,EAAC,UACC,QAAS,IAAMyE,EAAkB,EAAI,EACrC,UAAU,oCACV,KAAK,SAEL,SAAAzE,EAAC,QAAK,UAAU,yCAA0C,SAAAuD,EAAU,EACtE,EAGDV,GAAU,YAAcW,GACvBxD,EAAC,UACC,QAAS,IAAM2E,EAAoB,EAAI,EACvC,UAAU,sDACV,KAAK,SAEL,SAAA3E,EAAC,QAAK,UAAU,yCAA0C,SAAAyD,EAAc,EAC1E,GAEJ,GACF,EAEAzD,EAACc,GAAA,CACC,MAAOW,EACP,OAAQD,EACR,SAAU4C,EAAW,gBACrB,WAAYA,EAAW,WACvB,WAAYA,EAAW,WACvB,iBAAkBA,EAAW,kBAAoB,CAACJ,GAAcG,EAChE,SAAUtB,EACV,UAAW0E,GACX,qBAAsB3F,EACtB,aAAcC,GAChB,GAEEqC,GAAoBC,IACpBnE,EAAC,OACC,UAAWQ,EACT,kGACA,kBACF,EAEA,SAAAP,EAAC,OAAI,UAAU,mCACb,UAAAD,EAAC,KAAE,UAAU,8DACV,SAAAkE,EAAmBpB,GAAkBE,GACxC,EACCkB,GACClE,EAAC,UACC,KAAK,SACL,QAASiD,EACT,UAAWzC,EACT,2EACA,sDACF,EAEC,SAAAuC,GACH,GAEJ,EACF,GAEJ,EACF,EAGCjB,EAAc,OAAS,GACtB9B,EAACa,EAAA,CACC,KAAM,EACN,UAAWL,EACT,eACA,cACA,yCACA,sDACA,gDACA,8CAEA,8CACA,SACA,uBACAiB,IAAU,OAAS,eAAiB,cACtC,EAEA,SAAAzB,EAACgB,GAAA,CACC,MAAOS,EACP,SAAUoB,EACV,QAASf,EACT,MAAOC,GACP,SAAUC,GACV,WAAYC,GACZ,iBAAkB,IAAMgD,EAAkB,EAAI,EAC9C,gBAAiB/C,GAAmB,gBACpC,cAAe4B,GACf,SAAUC,GACV,YAAa7B,GAAmB,YAClC,EACF,GAEJ,EAGAlC,EAAC,OACC,UAAWQ,EACT,uBACA,cACA,gCACAiB,IAAU,OAAS,eAAiB,cACtC,EAGA,SAAAzB,EAACe,GAAA,CAAU,MAAOU,EAAO,OAAQD,EAAQ,MAAOY,GAAa,aAAcD,GAAc,EAC3F,EAGAnC,EAACiB,GAAA,CACC,OAAQqD,GACR,MAAOF,EAAW,aAClB,MAAO0B,GAAsB,OAAStD,GAAmB,MACzD,WAAYsD,GAAsB,YAActD,GAAmB,WACnE,WAAYsD,GAAsB,YAActD,GAAmB,WACnE,iBAAkBsD,GAAsB,kBAAoBtD,GAAmB,iBAC/E,aAAcsD,GAAsB,cAAgBtD,GAAmB,aACvE,cAAesD,GAAsB,eAAiBtD,GAAmB,cACzE,WAAYsD,GAAsB,YAActD,GAAmB,WACnE,UAAWsD,GAAsB,WAAatD,GAAmB,UACjE,eAAgBsD,GAAsB,gBAAkBtD,GAAmB,eAC3E,WAAYsD,GAAsB,YAActD,GAAmB,WACnE,YAAasD,GAAsB,aAAetD,GAAmB,YACrE,QAASgF,GACT,MAAO/F,EACT,EAGC6B,GACCtD,EAACkB,GAAA,CACC,MAAOqC,EACP,OAAQiB,GACR,QAAS,IAAMC,EAAkB,EAAK,EACtC,MAAOnB,EACP,MAAO7B,EACT,EAID+B,GACCxD,EAACmB,GAAA,CACC,OAAQuD,GACR,QAAS,IAAMC,EAAoB,EAAK,EACxC,QAASnB,EACT,WAAYN,GACZ,SAAUQ,GACV,SAAUC,GACV,WAAYC,GACZ,UAAWC,GACX,MAAOpC,EACP,MAAOgC,EACT,EAIFzD,EAACoB,EAAA,CACC,OAAQwD,GACR,QAAS,IAAMC,EAAkB,EAAK,EACtC,MAAOO,IAAczC,GAAkB,MACvC,QAASuC,IAAgBvC,GAAkB,QAC3C,YAAa2C,IAAoB3C,GAAkB,YACnD,MAAOlB,EACT,EAGAzB,EAACoB,EAAA,CACC,OAAQ0D,GACR,QAAS2C,GACT,MAAOjC,IAAc7C,GAAkB,MACvC,QAAS+C,IAAgB/C,GAAkB,QAC3C,YAAaiD,IAAoBjD,GAAkB,YACnD,MAAOlB,EACT,EAGAzB,EAACqB,GAAA,CACC,OAAQ2D,GACR,QAAS,IAAMC,EAAkB,EAAK,EACtC,MAAOrC,GAAkB,MACzB,SAAUA,GAAkB,SAC5B,KAAMA,GAAkB,KACxB,UAAWA,GAAkB,UAC7B,eAAgBA,GAAkB,eAClC,MAAOnB,EACT,GACF,CAEJ,CACF,EAGAF,EAAa,YAAc,eAM3B,IAAOmG,GAAQpG,GAAWC,CAAY,EACtC,OAAS,eAAAN,OAAmB,mBAC5B,OAAS,cAAAC,OAAkB,kBAC3B,OAAS,kBAAAC,OAAsB,sBAC/B,OAAS,cAAAC,OAAkB,kBAC3B,OAAS,cAAAC,OAAkB,kBAC3B,OAAS,aAAAsG,OAAiB",
6
- "names": ["jsx", "jsxs", "useState", "useCallback", "useRef", "useEffect", "useImperativeHandle", "forwardRef", "cn", "DEFAULT_WHEEL_CONFIG", "DEFAULT_CHANCE_METHODS", "INITIAL_WHEEL_STATE", "Grid", "GridItem", "Wheel", "PrizePool", "ChanceMethods", "WinnerModal", "RulesModal", "MyRewardsModal", "ErrorModal", "ShareModal", "withLayout", "WheelLottery", "prizes", "theme", "winningPrizeId", "spinDuration", "wheelBackgroundImage", "pointerImage", "chanceMethods", "chanceTitle", "chanceSubtitle", "chanceFooterNote", "chanceMethodsText", "winningInfos", "prizesTitle", "onSpinStart", "onSpinEnd", "onSpinError", "winnerModalConfig", "rulesModalConfig", "myRewardsModalConfig", "errorModalConfig", "shareModalConfig", "userData", "loginPromptText", "loginButtonText", "noChancesText", "onLoginRequired", "onCopyCode", "opportunitiesText", "className", "ref", "rulesData", "rulesText", "rewardsData", "myRewardsText", "codeText", "copyText", "copiedText", "prizeText", "completedText", "usedText", "isLoggedIn", "availableChances", "showLoginOverlay", "showNoChancesOverlay", "wheelState", "setWheelState", "showWinnerModal", "setShowWinnerModal", "showRulesModal", "setShowRulesModal", "showRewardsModal", "setShowRewardsModal", "showErrorModal", "setShowErrorModal", "showNoWinModal", "setShowNoWinModal", "showShareModal", "setShowShareModal", "errorMessage", "setErrorMessage", "errorTitle", "setErrorTitle", "errorConfirmText", "setErrorConfirmText", "noWinTitle", "setNoWinTitle", "noWinMessage", "setNoWinMessage", "noWinConfirmText", "setNoWinConfirmText", "externalWinnerConfig", "setExternalWinnerConfig", "animationRef", "message", "title", "confirmText", "config", "prize", "prev", "handleSpinStart", "finalWinningPrizeId", "winningPrize", "p", "winningIndex", "degreesPerPrize", "basePrizeAngle", "targetAngle", "resolve", "startTime", "animate", "elapsed", "progress", "eased", "currentRotation", "error", "handleWheelGoClick", "handleCloseWinnerModal", "handleCloseNoWinModal", "WheelLottery_default", "BaseModal"]
4
+ "sourcesContent": ["/**\n * WheelLottery - \u5927\u8F6C\u76D8\u62BD\u5956\u7EC4\u4EF6\n *\n * \u7528\u4E8E\u8425\u9500\u6D3B\u52A8\u7684\u4EA4\u4E92\u5F0F\u62BD\u5956\u8F6C\u76D8\uFF0C\u652F\u6301\u591A\u54C1\u724C\u4E3B\u9898\u548C\u54CD\u5E94\u5F0F\u5E03\u5C40\u3002\n *\n * @module WheelLottery\n * @date 2025-12-17\n */\n\n'use client'\n\nimport { useState, useCallback, useRef, useEffect, useImperativeHandle, forwardRef } from 'react'\nimport { cn } from '../../helpers/index.js'\nimport { DEFAULT_WHEEL_CONFIG, DEFAULT_CHANCE_METHODS, INITIAL_WHEEL_STATE } from './types.js'\nimport { Grid, GridItem } from '../../components/grid.js'\nimport { Wheel } from './Wheel.js'\nimport { PrizePool } from '../LotteryShared/PrizePool.js'\nimport { ChanceMethods } from '../LotteryShared/ChanceMethods.js'\nimport { WinnerModal } from '../LotteryShared/WinnerModal.js'\nimport { RulesModal } from '../LotteryShared/RulesModal.js'\nimport { MyRewardsModal } from '../LotteryShared/MyRewardsModal.js'\nimport { ErrorModal } from '../LotteryShared/ErrorModal.js'\nimport { ShareModal } from '../LotteryShared/ShareModal.js'\nimport { withLayout } from '../../shared/Styles.js'\n\nimport type { WheelLotteryProps, WheelState, WheelLotteryHandle, WinnerModalConfig } from './types.js'\n\n// ============================================================================\n// \u4E3B\u7EC4\u4EF6\n// ============================================================================\n\n/**\n * WheelLottery \u7EC4\u4EF6\n *\n * @example\n * ```tsx\n * // \u57FA\u7840\u4F7F\u7528\n * <WheelLottery\n * prizes={prizes}\n * winningPrizeId=\"prize-003\"\n * onSpinEnd={(prize) => alert(`You won ${prize.name}`)}\n * />\n *\n * // \u4F7F\u7528 ref \u63A7\u5236\u5F39\u7A97\n * const lotteryRef = useRef<WheelLotteryHandle>(null)\n *\n * <WheelLottery ref={lotteryRef} prizes={prizes} />\n *\n * // \u5916\u90E8\u89E6\u53D1\u5F39\u7A97\n * lotteryRef.current?.showError({\n * title: 'Error',\n * message: 'Something went wrong'\n * })\n * ```\n */\nexport const WheelLottery = forwardRef<WheelLotteryHandle, WheelLotteryProps>(\n (\n {\n prizes,\n theme,\n winningPrizeId,\n spinDuration = DEFAULT_WHEEL_CONFIG.spinDuration,\n wheelBackgroundImage,\n pointerImage,\n chanceMethods = DEFAULT_CHANCE_METHODS,\n chanceTitle = DEFAULT_WHEEL_CONFIG.chanceTitle,\n chanceSubtitle,\n chanceFooterNote,\n chanceMethodsText,\n mechanismType,\n inputConfig,\n winningInfos = [],\n prizesTitle,\n onSpinStart,\n onSpinEnd,\n onSpinError,\n winnerModalConfig,\n rulesModalConfig = {},\n myRewardsModalConfig = {},\n errorModalConfig = {},\n shareModalConfig = {},\n userData,\n loginPromptText = 'Please log in to participate',\n loginButtonText = 'Log In',\n noChancesText = 'You have no chances left',\n onLoginRequired,\n onCopyCode,\n opportunitiesText = ['Number of draws remaining today:'],\n className,\n },\n ref\n ) => {\n const { rulesData, rulesText = 'Rules' } = rulesModalConfig\n const {\n rewardsData,\n myRewardsText = 'My Rewards',\n codeText = 'CODE:',\n copyText = 'COPY',\n copiedText = 'COPIED',\n prizeText = 'Prize time:',\n } = myRewardsModalConfig\n const completedText = chanceMethodsText?.completedText\n const usedText = chanceMethodsText?.usedText\n const isLoggedIn = userData?.isLoggedIn ?? false\n const availableChances = userData?.availableChances || 0\n const showLoginOverlay = !isLoggedIn\n const showNoChancesOverlay = isLoggedIn && availableChances <= 0\n // ==========================================================================\n // State \u7BA1\u7406\n // ==========================================================================\n\n const [wheelState, setWheelState] = useState<WheelState>(INITIAL_WHEEL_STATE)\n const [showWinnerModal, setShowWinnerModal] = useState(false)\n const [showRulesModal, setShowRulesModal] = useState(false)\n const [showRewardsModal, setShowRewardsModal] = useState(false)\n const [showErrorModal, setShowErrorModal] = useState(false)\n const [showNoWinModal, setShowNoWinModal] = useState(false)\n const [showShareModal, setShowShareModal] = useState(false)\n const [errorMessage, setErrorMessage] = useState('')\n const [errorTitle, setErrorTitle] = useState<string | undefined>()\n const [errorConfirmText, setErrorConfirmText] = useState<string | undefined>()\n const [noWinTitle, setNoWinTitle] = useState<string | undefined>()\n const [noWinMessage, setNoWinMessage] = useState<string | undefined>()\n const [noWinConfirmText, setNoWinConfirmText] = useState<string | undefined>()\n const [externalWinnerConfig, setExternalWinnerConfig] = useState<Partial<WinnerModalConfig> | undefined>()\n const animationRef = useRef<number | null>(null)\n\n // ==========================================================================\n // Imperative Handle - \u66B4\u9732\u65B9\u6CD5\u7ED9\u7236\u7EC4\u4EF6\n // ==========================================================================\n\n useImperativeHandle(\n ref,\n () => ({\n showError: ({ message, title, confirmText }) => {\n setErrorMessage(message)\n setErrorTitle(title)\n setErrorConfirmText(confirmText)\n setShowErrorModal(true)\n },\n hideError: () => {\n setShowErrorModal(false)\n },\n showNoWin: config => {\n setNoWinTitle(config?.title)\n setNoWinMessage(config?.message)\n setNoWinConfirmText(config?.confirmText)\n setShowNoWinModal(true)\n },\n hideNoWin: () => {\n setShowNoWinModal(false)\n },\n showWinner: (prize, config) => {\n setWheelState(prev => ({ ...prev, winningPrize: prize }))\n setExternalWinnerConfig(config)\n setShowWinnerModal(true)\n },\n hideWinner: () => {\n setShowWinnerModal(false)\n },\n showRules: () => {\n setShowRulesModal(true)\n },\n hideRules: () => {\n setShowRulesModal(false)\n },\n showRewards: () => {\n setShowRewardsModal(true)\n },\n hideRewards: () => {\n setShowRewardsModal(false)\n },\n showShare: () => {\n setShowShareModal(true)\n },\n hideShare: () => {\n setShowShareModal(false)\n },\n hideAllModals: () => {\n setShowWinnerModal(false)\n setShowRulesModal(false)\n setShowRewardsModal(false)\n setShowErrorModal(false)\n setShowNoWinModal(false)\n setShowShareModal(false)\n },\n }),\n []\n )\n\n // ==========================================================================\n // Props \u9A8C\u8BC1\uFF08\u5F00\u53D1\u73AF\u5883\uFF09\n // ==========================================================================\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'development' && prizes) {\n if (prizes.length !== 8) {\n console.warn(\n `WheelLottery expects exactly 8 prizes, got ${prizes.length}. The component may not render correctly.`\n )\n }\n\n if (winningPrizeId && !prizes.find(p => p.prizeKey === winningPrizeId)) {\n console.warn(`WheelLottery: winningPrizeId \"${winningPrizeId}\" not found in prizes array.`)\n }\n }\n }, [prizes, winningPrizeId])\n\n // ==========================================================================\n // \u6E05\u7406\u52A8\u753B\n // ==========================================================================\n\n useEffect(() => {\n return () => {\n // \u7EC4\u4EF6\u5378\u8F7D\u65F6\u53D6\u6D88\u52A8\u753B\u5E27\n if (animationRef.current !== null) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n // ==========================================================================\n // \u62BD\u5956\u903B\u8F91\n // ==========================================================================\n\n /**\n * \u5F00\u59CB\u62BD\u5956 - \u652F\u6301\u5F02\u6B65\u63A5\u53E3\u8C03\u7528\n * \u5229\u7528\u521D\u59CB\u6162\u901F\u65CB\u8F6C\uFF0C\u70B9\u51FB\u540E\u8FDB\u5165\u5FEB\u901F\u65CB\u8F6C\u72B6\u6001\uFF0C\u63A5\u53E3\u8FD4\u56DE\u540E\u51CF\u901F\u505C\u6B62\n */\n const handleSpinStart = useCallback(async () => {\n if (wheelState.isSpinning) return\n\n // \u68C0\u67E5\u7528\u6237\u662F\u5426\u5DF2\u767B\u5F55\n if (!userData?.isLoggedIn) {\n onLoginRequired?.()\n return\n }\n\n // \u2705 \u6B21\u6570\u4E3A 0 \u65F6\uFF0C\u6309\u94AE\u5DF2\u88AB\u7981\u7528\uFF0C\u8FD9\u91CC\u4E0D\u9700\u8981\u989D\u5916\u68C0\u67E5\n // \u9632\u5FA1\u6027\u7F16\u7A0B\uFF1A\u5982\u679C\u4ECD\u7136\u89E6\u53D1\uFF0C\u76F4\u63A5\u8FD4\u56DE\n if (userData.availableChances <= 0) {\n return\n }\n\n // \u8FDB\u5165\u5FEB\u901F\u65CB\u8F6C\u72B6\u6001\uFF08\u521D\u59CB\u6162\u901F\u65CB\u8F6C\u4F1A\u81EA\u52A8\u53D8\u4E3A\u5FEB\u901F\u65CB\u8F6C\uFF09\n setWheelState(prev => ({\n ...prev,\n isSpinning: true,\n isButtonDisabled: true,\n }))\n\n try {\n // \u8C03\u7528\u5916\u90E8\u63A5\u53E3\u83B7\u53D6\u4E2D\u5956\u7ED3\u679C\n let finalWinningPrizeId = winningPrizeId\n\n if (onSpinStart) {\n // \u7B49\u5F85\u63A5\u53E3\u8FD4\u56DE\u4E2D\u5956 ID\uFF08\u63A5\u53E3\u65F6\u95F4\u4E0D\u56FA\u5B9A\uFF0C1-30s\uFF09\n // \u5728\u6B64\u671F\u95F4\uFF0C\u8F6C\u76D8\u4F1A\u4FDD\u6301\u5FEB\u901F\u65CB\u8F6C\uFF08\u7531 CSS \u52A8\u753B\u63A7\u5236\uFF09\n finalWinningPrizeId = await onSpinStart()\n }\n\n // \u786E\u5B9A\u4E2D\u5956\u5956\u54C1\n const winningPrize = prizes.find(p => p.prizeKey === finalWinningPrizeId) || prizes[0]\n const winningIndex = prizes.findIndex(p => p.prizeKey === winningPrize.prizeKey)\n\n // \u8BA1\u7B97\u76EE\u6807\u89D2\u5EA6\n const degreesPerPrize = 360 / prizes.length\n const basePrizeAngle = winningIndex * degreesPerPrize\n // \u81F3\u5C11\u65CB\u8F6C 3 \u5708\uFF081080\u5EA6\uFF09+ \u76EE\u6807\u89D2\u5EA6\n const minRotations = 3\n const targetAngle = minRotations * 360 + (360 - basePrizeAngle)\n\n // \u63A5\u53E3\u8FD4\u56DE\u540E\uFF0C\u7B49\u5F85 1.5s \u518D\u5F00\u59CB\u505C\u6B62\u52A8\u753B\n await new Promise(resolve => setTimeout(resolve, 1500))\n\n // \u7ACB\u5373\u8FDB\u5165\u51CF\u901F\u72B6\u6001\uFF0C\u505C\u6B62 CSS \u5FAA\u73AF\u52A8\u753B\n setWheelState(prev => ({\n ...prev,\n isFinished: true,\n currentRotation: 0, // \u4ECE 0 \u5EA6\u5F00\u59CB\u51CF\u901F\u52A8\u753B\n }))\n\n // \u5F00\u59CB\u505C\u6B62\u65CB\u8F6C\u52A8\u753B\n const startTime = Date.now()\n\n const animate = () => {\n const now = Date.now()\n const elapsed = now - startTime\n const progress = Math.min(elapsed / spinDuration, 1)\n\n // \u5E94\u7528 ease-out \u7F13\u52A8\u51FD\u6570\n const eased = 1 - Math.pow(1 - progress, 3)\n\n // \u8BA1\u7B97\u5F53\u524D\u65CB\u8F6C\u89D2\u5EA6\n const currentRotation = targetAngle * eased\n\n // \u66F4\u65B0\u72B6\u6001\n setWheelState(prev => ({\n ...prev,\n currentRotation,\n }))\n\n // \u7EE7\u7EED\u52A8\u753B\u6216\u7ED3\u675F\n if (progress < 1) {\n animationRef.current = requestAnimationFrame(animate)\n } else {\n // \u52A8\u753B\u7ED3\u675F - \u4FDD\u6301\u6309\u94AE\u7981\u7528\u72B6\u6001,\u76F4\u5230\u5F39\u7A97\u5173\u95ED\n setWheelState(prev => ({\n ...prev,\n isSpinning: false,\n isButtonDisabled: true,\n winningPrize,\n currentRotation: targetAngle,\n }))\n\n // \u5EF6\u8FDF\u663E\u793A\u5F39\u7A97\uFF08500ms\u540E\uFF09\n if (onSpinEnd) {\n onSpinEnd?.(winningPrize)\n } else {\n setTimeout(() => {\n // \u68C0\u67E5\u662F\u5426\u672A\u4E2D\u5956\uFF08try-again\uFF09\n if (winningPrize.prizeKey === 'try-again') {\n // \u672A\u4E2D\u5956\uFF0C\u663E\u793A ErrorModal\n setShowNoWinModal(true)\n } else {\n // \u4E2D\u5956\uFF0C\u663E\u793A WinnerModal\n setShowWinnerModal(true)\n }\n }, 500)\n }\n }\n }\n\n // \u542F\u52A8\u505C\u6B62\u52A8\u753B\n animationRef.current = requestAnimationFrame(animate)\n } catch (error) {\n // \u63A5\u53E3\u62A5\u9519\uFF0C\u6062\u590D\u5230\u521D\u59CB\u6162\u901F\u65CB\u8F6C\u72B6\u6001\n setWheelState(prev => ({\n ...prev,\n isSpinning: false,\n isButtonDisabled: false,\n }))\n\n // \u663E\u793A\u9519\u8BEF\u5F39\u7A97\n setErrorMessage((error as Error).message || 'An error occurred')\n setShowErrorModal(true)\n\n // \u89E6\u53D1\u9519\u8BEF\u56DE\u8C03\n onSpinError?.(error as Error)\n\n console.error('\u62BD\u5956\u63A5\u53E3\u8C03\u7528\u5931\u8D25:', error)\n }\n }, [\n wheelState.isSpinning,\n prizes,\n winningPrizeId,\n spinDuration,\n onSpinStart,\n onSpinEnd,\n onSpinError,\n userData,\n onLoginRequired,\n ])\n\n const handleWheelGoClick = useCallback(() => {\n if (isLoggedIn) {\n void handleSpinStart()\n return\n }\n\n onLoginRequired?.()\n }, [handleSpinStart, isLoggedIn, onLoginRequired])\n\n // ==========================================================================\n // \u5F39\u7A97\u5173\u95ED\u5904\u7406\n // ==========================================================================\n\n /**\n * \u5173\u95ED\u4E2D\u5956\u5F39\u7A97\u5E76\u91CD\u7F6E\u8F6C\u76D8\u72B6\u6001\n */\n const handleCloseWinnerModal = useCallback(() => {\n setShowWinnerModal(false)\n // \u91CD\u7F6E\u8F6C\u76D8\u72B6\u6001,\u5141\u8BB8\u4E0B\u6B21\u62BD\u5956\n setWheelState(prev => ({\n ...prev,\n isButtonDisabled: false,\n isFinished: false, // \u91CD\u7F6E\u4E3A\u672A\u5B8C\u6210,\u6062\u590D\u521D\u59CB\u65CB\u8F6C\u52A8\u753B\n }))\n }, [])\n\n /**\n * \u5173\u95ED\u672A\u4E2D\u5956\u5F39\u7A97\u5E76\u91CD\u7F6E\u8F6C\u76D8\u72B6\u6001\n */\n const handleCloseNoWinModal = useCallback(() => {\n setShowNoWinModal(false)\n // \u91CD\u7F6E\u8F6C\u76D8\u72B6\u6001,\u5141\u8BB8\u4E0B\u6B21\u62BD\u5956\n setWheelState(prev => ({\n ...prev,\n isButtonDisabled: false,\n isFinished: false, // \u91CD\u7F6E\u4E3A\u672A\u5B8C\u6210,\u6062\u590D\u521D\u59CB\u65CB\u8F6C\u52A8\u753B\n }))\n }, [])\n\n // ==========================================================================\n // \u6E32\u67D3\n // ==========================================================================\n\n return (\n <div className={cn('wheel-lottery-container', 'w-full', theme === 'dark' ? 'aiui-dark' : '', className)}>\n {/* ARIA Live Region - \u5C4F\u5E55\u9605\u8BFB\u5668\u72B6\u6001\u64AD\u62A5 */}\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {wheelState.isSpinning && '\u62BD\u5956\u8FDB\u884C\u4E2D...'}\n {wheelState.winningPrize && !wheelState.isSpinning && `\u5DF2\u4E2D\u5956: ${wheelState.winningPrize.name}`}\n </div>\n\n {/* \u4E3B\u5185\u5BB9\u533A - \u54CD\u5E94\u5F0F\u4E24\u680F/\u5355\u680F\u5E03\u5C40 */}\n <Grid className={cn('wheel-lottery-main', 'tablet:mb-4 mb-3')}>\n {/* \u5DE6\u4FA7\uFF1A\u8F6C\u76D8\u533A\u57DF */}\n <GridItem\n span={7}\n className={cn(\n 'wheel-section',\n 'relative flex w-full flex-1 items-center justify-center overflow-hidden',\n 'rounded-box',\n // \u79FB\u52A8\u7AEF\uFF08<=1024px\uFF09\u4F7F\u7528min-h\uFF0C\u684C\u9762\u7AEF\u4F7F\u7528aspect ratio\n 'laptop:min-h-[288px] min-h-[240px]',\n 'lg-desktop:aspect-w-[964] lg-desktop:aspect-h-[480]',\n 'desktop:aspect-w-[759] desktop:aspect-h-[384]',\n 'laptop:aspect-w-[516] laptop:aspect-h-[288]',\n 'l-tablet:col-span-12',\n // \u79FB\u52A8\u7AEF\u5E95\u90E8\u95F4\u8DDD\n 'l-tablet:mb-3',\n theme === 'dark' ? 'bg-[#1E2024]' : 'bg-[#EAEAEC]'\n )}\n >\n <div\n className={cn(\n 'w-full px-[16px] pt-[16px]',\n 'lg-desktop:pb-[32px] lg-desktop:px-[32px]',\n 'desktop:pt-[24px] desktop:px-[24px]',\n 'laptop:pt-[16px] laptop:px-[16px]',\n 'tablet:px-[24px]',\n // \u79FB\u52A8\u7AEF(<=1024px)\u65F6\u4F7F\u7528\u7EDD\u5BF9\u5B9A\u4F4D\u8986\u76D6\u5728\u8F6C\u76D8\u80CC\u666F\u4E0A\n 'l-tablet:absolute l-tablet:top-0 l-tablet:inset-x-0 l-tablet:z-10'\n )}\n >\n {/* \u9876\u90E8\u4FE1\u606F\u680F\uFF1A\u5DE6\u4FA7\u673A\u4F1A\u8FDB\u5EA6\uFF0C\u53F3\u4FA7\u94FE\u63A5 */}\n <div className=\"relative z-10 mb-2 flex max-h-[24px] w-full flex-wrap items-center justify-between gap-3\">\n {/* \u5DE6\u4FA7\uFF1A\u673A\u4F1A\u5C55\u793A - \u4EC5\u767B\u5F55\u65F6\u663E\u793A */}\n <div>\n {isLoggedIn && (\n <p className=\"text-info-primary font-[700]\">\n {opportunitiesText?.[0]}\n <span className=\"ml-1 text-[#FF6B35]\">{availableChances}</span>\n {opportunitiesText?.[1] || ''}\n </p>\n )}\n </div>\n {/* \u53F3\u4FA7\uFF1ARules \u548C My Rewards \u6309\u94AE */}\n <div className=\"flex items-center gap-4\">\n {rulesData && (\n <button\n onClick={() => setShowRulesModal(true)}\n className=\"cursor-pointer touch-manipulation\"\n type=\"button\"\n >\n <span className=\"text-info-primary font-[700] underline\">{rulesText}</span>\n </button>\n )}\n {/* My Rewards \u6309\u94AE - \u4EC5\u767B\u5F55\u65F6\u663E\u793A */}\n {userData?.isLoggedIn && rewardsData && (\n <button\n onClick={() => setShowRewardsModal(true)}\n className=\"cursor-pointer touch-manipulation whitespace-nowrap\"\n type=\"button\"\n >\n <span className=\"text-info-primary font-[700] underline\">{myRewardsText}</span>\n </button>\n )}\n </div>\n </div>\n {/* \u8F6C\u76D8\u7EC4\u4EF6 */}\n <Wheel\n theme={theme}\n prizes={prizes}\n rotation={wheelState.currentRotation}\n isSpinning={wheelState.isSpinning}\n isFinished={wheelState.isFinished}\n isButtonDisabled={wheelState.isButtonDisabled || !isLoggedIn || showNoChancesOverlay}\n userData={userData}\n onGoClick={handleWheelGoClick}\n wheelBackgroundImage={wheelBackgroundImage}\n pointerImage={pointerImage}\n />\n\n {(showLoginOverlay || showNoChancesOverlay) && (\n <div\n className={cn(\n 'rounded-box absolute inset-0 z-20 flex items-center justify-center bg-black/60 backdrop-blur-sm',\n 'px-6 text-center'\n )}\n >\n <div className=\"flex flex-col items-center gap-4\">\n <p className=\"lg-desktop:text-[24px] text-[18px] font-semibold text-white\">\n {showLoginOverlay ? loginPromptText : noChancesText}\n </p>\n {showLoginOverlay && (\n <button\n type=\"button\"\n onClick={onLoginRequired}\n className={cn(\n 'rounded-full bg-white px-6 py-2 text-[14px] font-semibold text-[#1D1D1F]',\n 'transition-transform hover:scale-105 active:scale-95'\n )}\n >\n {loginButtonText}\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n </GridItem>\n\n {/* \u53F3\u4FA7\uFF1A\u83B7\u53D6\u673A\u4F1A\u533A\u57DF */}\n {chanceMethods.length > 0 && (\n <GridItem\n span={5}\n className={cn(\n 'info-section',\n 'rounded-box',\n 'relative flex flex-col overflow-hidden',\n 'lg-desktop:aspect-w-[684] lg-desktop:aspect-h-[480]',\n 'desktop:aspect-w-[536] desktop:aspect-h-[384]',\n 'laptop:aspect-w-[364] laptop:aspect-h-[288]',\n // \u79FB\u52A8\u7AEF\u4F7F\u7528min-h\u800C\u4E0D\u662Fmax-h\uFF0C\u786E\u4FDD\u5185\u5BB9\u5B8C\u6574\u663E\u793A\n 'l-tablet:min-h-[280px] laptop:max-h-[320px]',\n 'w-full',\n 'l-tablet:col-span-12',\n theme === 'dark' ? 'bg-[#1E2024]' : 'bg-[#EAEAEC]'\n )}\n >\n <ChanceMethods\n theme={theme}\n userData={userData}\n methods={chanceMethods}\n title={chanceTitle}\n subtitle={chanceSubtitle}\n footerNote={chanceFooterNote}\n onOpenShareModal={() => setShowShareModal(true)}\n chanceBadgeText={chanceMethodsText?.chanceBadgeText}\n completedText={completedText}\n usedText={usedText}\n loadingText={chanceMethodsText?.loadingText}\n mechanismType={mechanismType}\n inputConfig={inputConfig}\n />\n </GridItem>\n )}\n </Grid>\n\n {/* \u5E95\u90E8\u533A\u57DF\uFF1A\u5956\u54C1\u6C60(\u5305\u542B\u4E2D\u5956\u4EBA\u540D\u5355) */}\n <div\n className={cn(\n 'wheel-lottery-footer',\n 'rounded-box',\n 'flex flex-col overflow-hidden',\n theme === 'dark' ? 'bg-[#1E2024]' : 'bg-[#EAEAEC]'\n )}\n >\n {/* \u5956\u54C1\u6C60(\u5305\u542B\u4E2D\u5956\u4EBA\u540D\u5355\u81EA\u52A8\u6EDA\u52A8) */}\n <PrizePool theme={theme} prizes={prizes} title={prizesTitle} winningInfos={winningInfos} />\n </div>\n\n {/* \u4E2D\u5956\u5F39\u7A97 */}\n <WinnerModal\n isOpen={showWinnerModal}\n prize={wheelState.winningPrize}\n title={externalWinnerConfig?.title || winnerModalConfig?.title}\n prizeTitle={externalWinnerConfig?.prizeTitle || winnerModalConfig?.prizeTitle}\n prizeImage={externalWinnerConfig?.prizeImage || winnerModalConfig?.prizeImage}\n prizeDescription={externalWinnerConfig?.prizeDescription || winnerModalConfig?.prizeDescription}\n learnMoreUrl={externalWinnerConfig?.learnMoreUrl || winnerModalConfig?.learnMoreUrl}\n learnMoreText={externalWinnerConfig?.learnMoreText || winnerModalConfig?.learnMoreText}\n couponCode={externalWinnerConfig?.couponCode || winnerModalConfig?.couponCode}\n expiresAt={externalWinnerConfig?.expiresAt || winnerModalConfig?.expiresAt}\n couponDiscount={externalWinnerConfig?.couponDiscount || winnerModalConfig?.couponDiscount}\n couponUnit={externalWinnerConfig?.couponUnit || winnerModalConfig?.couponUnit}\n confirmText={externalWinnerConfig?.confirmText || winnerModalConfig?.confirmText}\n onClose={handleCloseWinnerModal}\n theme={theme}\n />\n\n {/* Rules \u5F39\u7A97 */}\n {rulesData && (\n <RulesModal\n title={rulesText}\n isOpen={showRulesModal}\n onClose={() => setShowRulesModal(false)}\n rules={rulesData}\n theme={theme}\n />\n )}\n\n {/* My Rewards \u5F39\u7A97 */}\n {rewardsData && (\n <MyRewardsModal\n isOpen={showRewardsModal}\n onClose={() => setShowRewardsModal(false)}\n rewards={rewardsData}\n onCopyCode={onCopyCode}\n codeText={codeText}\n copyText={copyText}\n copiedText={copiedText}\n prizeText={prizeText}\n theme={theme}\n title={myRewardsText}\n />\n )}\n\n {/* \u9519\u8BEF\u5F39\u7A97 */}\n <ErrorModal\n isOpen={showErrorModal}\n onClose={() => setShowErrorModal(false)}\n title={errorTitle || errorModalConfig?.title}\n message={errorMessage || errorModalConfig?.message}\n confirmText={errorConfirmText || errorModalConfig?.confirmText}\n theme={theme}\n />\n\n {/* \u672A\u4E2D\u5956\u5F39\u7A97 */}\n <ErrorModal\n isOpen={showNoWinModal}\n onClose={handleCloseNoWinModal}\n title={noWinTitle || errorModalConfig?.title}\n message={noWinMessage || errorModalConfig?.message}\n confirmText={noWinConfirmText || errorModalConfig?.confirmText}\n theme={theme}\n />\n\n {/* \u5206\u4EAB\u5F39\u7A97 */}\n <ShareModal\n isOpen={showShareModal}\n onClose={() => setShowShareModal(false)}\n title={shareModalConfig?.title}\n subtitle={shareModalConfig?.subtitle}\n note={shareModalConfig?.note}\n platforms={shareModalConfig?.platforms}\n onShareSuccess={shareModalConfig?.onShareSuccess}\n theme={theme}\n />\n </div>\n )\n }\n)\n\n// \u8BBE\u7F6E displayName \u7528\u4E8E\u8C03\u8BD5\nWheelLottery.displayName = 'WheelLottery'\n\n// ============================================================================\n// \u5BFC\u51FA\n// ============================================================================\n\nexport default withLayout(WheelLottery)\nexport { WinnerModal } from '../LotteryShared/WinnerModal.js'\nexport { RulesModal } from '../LotteryShared/RulesModal.js'\nexport { MyRewardsModal } from '../LotteryShared/MyRewardsModal.js'\nexport { ErrorModal } from '../LotteryShared/ErrorModal.js'\nexport { ShareModal } from '../LotteryShared/ShareModal.js'\nexport { BaseModal } from '../LotteryShared/BaseModal.js'\nexport type {\n WheelLotteryProps,\n WheelLotteryHandle,\n Prize,\n ChanceMethod,\n ChanceMethodStatus,\n WinningInfo,\n WheelProps,\n PrizePoolProps,\n ChanceMethodsProps,\n WinnerModalProps,\n WinnerModalConfig,\n UserData,\n ShareModalConfig,\n SocialPlatform,\n SharePlatformConfig,\n} from './types.js'\nexport type { RulesModalProps, RuleItem } from '../LotteryShared/RulesModal.js'\nexport type { MyRewardsModalProps, Reward, RewardStatus } from '../LotteryShared/MyRewardsModal.js'\nexport type { ErrorModalProps } from '../LotteryShared/ErrorModal.js'\nexport type { ShareModalProps } from '../LotteryShared/ShareModal.js'\nexport type { BaseModalProps } from '../LotteryShared/BaseModal.js'\n"],
5
+ "mappings": "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",
6
+ "names": ["jsx", "jsxs", "useState", "useCallback", "useRef", "useEffect", "useImperativeHandle", "forwardRef", "cn", "DEFAULT_WHEEL_CONFIG", "DEFAULT_CHANCE_METHODS", "INITIAL_WHEEL_STATE", "Grid", "GridItem", "Wheel", "PrizePool", "ChanceMethods", "WinnerModal", "RulesModal", "MyRewardsModal", "ErrorModal", "ShareModal", "withLayout", "WheelLottery", "prizes", "theme", "winningPrizeId", "spinDuration", "wheelBackgroundImage", "pointerImage", "chanceMethods", "chanceTitle", "chanceSubtitle", "chanceFooterNote", "chanceMethodsText", "mechanismType", "inputConfig", "winningInfos", "prizesTitle", "onSpinStart", "onSpinEnd", "onSpinError", "winnerModalConfig", "rulesModalConfig", "myRewardsModalConfig", "errorModalConfig", "shareModalConfig", "userData", "loginPromptText", "loginButtonText", "noChancesText", "onLoginRequired", "onCopyCode", "opportunitiesText", "className", "ref", "rulesData", "rulesText", "rewardsData", "myRewardsText", "codeText", "copyText", "copiedText", "prizeText", "completedText", "usedText", "isLoggedIn", "availableChances", "showLoginOverlay", "showNoChancesOverlay", "wheelState", "setWheelState", "showWinnerModal", "setShowWinnerModal", "showRulesModal", "setShowRulesModal", "showRewardsModal", "setShowRewardsModal", "showErrorModal", "setShowErrorModal", "showNoWinModal", "setShowNoWinModal", "showShareModal", "setShowShareModal", "errorMessage", "setErrorMessage", "errorTitle", "setErrorTitle", "errorConfirmText", "setErrorConfirmText", "noWinTitle", "setNoWinTitle", "noWinMessage", "setNoWinMessage", "noWinConfirmText", "setNoWinConfirmText", "externalWinnerConfig", "setExternalWinnerConfig", "animationRef", "message", "title", "confirmText", "config", "prize", "prev", "handleSpinStart", "finalWinningPrizeId", "winningPrize", "p", "winningIndex", "degreesPerPrize", "basePrizeAngle", "targetAngle", "resolve", "startTime", "animate", "elapsed", "progress", "eased", "currentRotation", "error", "handleWheelGoClick", "handleCloseWinnerModal", "handleCloseNoWinModal", "WheelLottery_default", "BaseModal"]
7
7
  }