@anker-in/headless-ui 1.1.74 → 1.1.76
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/ActiveShelf/ProductCard.js +1 -1
- package/dist/cjs/biz-components/ActiveShelf/ProductCard.js.map +2 -2
- package/dist/cjs/biz-components/ActivityMechanism/index.d.ts +9 -0
- package/dist/cjs/biz-components/ActivityMechanism/index.js +2 -0
- package/dist/cjs/biz-components/ActivityMechanism/index.js.map +7 -0
- package/dist/cjs/biz-components/ActivityMechanism/types.d.ts +43 -0
- package/dist/cjs/biz-components/ActivityMechanism/types.js +2 -0
- package/dist/cjs/biz-components/ActivityMechanism/types.js.map +7 -0
- package/dist/cjs/biz-components/ActivitySchedule/index.d.ts +3 -0
- package/dist/cjs/biz-components/ActivitySchedule/index.js +2 -0
- package/dist/cjs/biz-components/ActivitySchedule/index.js.map +7 -0
- package/dist/cjs/biz-components/ActivitySchedule/types.d.ts +44 -0
- package/dist/cjs/biz-components/ActivitySchedule/types.js +2 -0
- package/dist/cjs/biz-components/ActivitySchedule/types.js.map +7 -0
- package/dist/cjs/biz-components/AnchorNavigation/index.d.ts +20 -0
- 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/EventSchedule/index.js +1 -1
- package/dist/cjs/biz-components/EventSchedule/index.js.map +2 -2
- package/dist/cjs/biz-components/FooterNavigation/index.js +1 -1
- package/dist/cjs/biz-components/FooterNavigation/index.js.map +3 -3
- package/dist/cjs/biz-components/FooterNavigation/types.d.ts +7 -0
- package/dist/cjs/biz-components/FooterNavigation/types.js +1 -1
- package/dist/cjs/biz-components/FooterNavigation/types.js.map +2 -2
- package/dist/cjs/biz-components/GiftShelf/index.d.ts +3 -0
- package/dist/cjs/biz-components/GiftShelf/index.js +2 -0
- package/dist/cjs/biz-components/GiftShelf/index.js.map +7 -0
- package/dist/cjs/biz-components/GiftShelf/types.d.ts +120 -0
- package/dist/cjs/biz-components/GiftShelf/types.js +2 -0
- package/dist/cjs/biz-components/GiftShelf/types.js.map +7 -0
- package/dist/cjs/biz-components/GiftTierShelf/index.d.ts +3 -0
- package/dist/cjs/biz-components/GiftTierShelf/index.js +2 -0
- package/dist/cjs/biz-components/GiftTierShelf/index.js.map +7 -0
- package/dist/cjs/biz-components/GiftTierShelf/types.d.ts +75 -0
- package/dist/cjs/biz-components/GiftTierShelf/types.js +2 -0
- package/dist/cjs/biz-components/GiftTierShelf/types.js.map +7 -0
- package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
- package/dist/cjs/biz-components/HeroBanner/HeroBanner.js.map +2 -2
- package/dist/cjs/biz-components/HeroBanner/types.d.ts +2 -0
- package/dist/cjs/biz-components/HeroBanner/types.js +1 -1
- package/dist/cjs/biz-components/HeroBanner/types.js.map +1 -1
- package/dist/cjs/biz-components/ImageWithText/ImageWithText.js +1 -1
- package/dist/cjs/biz-components/ImageWithText/ImageWithText.js.map +2 -2
- package/dist/cjs/biz-components/Ksp/index.d.ts +45 -6
- package/dist/cjs/biz-components/Ksp/index.js +1 -1
- package/dist/cjs/biz-components/Ksp/index.js.map +3 -3
- 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/PromotionalBar/index.js +1 -1
- package/dist/cjs/biz-components/PromotionalBar/index.js.map +3 -3
- package/dist/cjs/biz-components/ThreeDCarousel/ThreeDCarousel.js +1 -1
- package/dist/cjs/biz-components/ThreeDCarousel/ThreeDCarousel.js.map +2 -2
- 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/Title/types.d.ts +10 -1
- package/dist/cjs/biz-components/Title/types.js +1 -1
- package/dist/cjs/biz-components/Title/types.js.map +1 -1
- package/dist/cjs/biz-components/VideoModal/index.js +1 -1
- package/dist/cjs/biz-components/VideoModal/index.js.map +2 -2
- package/dist/cjs/biz-components/WheelLottery/BaseModal.d.ts +61 -0
- package/dist/cjs/biz-components/WheelLottery/BaseModal.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/BaseModal.js.map +7 -0
- package/dist/cjs/biz-components/WheelLottery/ChanceMethods.d.ts +25 -0
- package/dist/cjs/biz-components/WheelLottery/ChanceMethods.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/ChanceMethods.js.map +7 -0
- package/dist/cjs/biz-components/WheelLottery/ErrorModal.d.ts +47 -0
- package/dist/cjs/biz-components/WheelLottery/ErrorModal.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/ErrorModal.js.map +7 -0
- package/dist/cjs/biz-components/WheelLottery/MyRewardsModal.d.ts +101 -0
- package/dist/cjs/biz-components/WheelLottery/MyRewardsModal.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/MyRewardsModal.js.map +7 -0
- package/dist/cjs/biz-components/WheelLottery/PrizePool.d.ts +29 -0
- package/dist/cjs/biz-components/WheelLottery/PrizePool.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/PrizePool.js.map +7 -0
- package/dist/cjs/biz-components/WheelLottery/RulesModal.d.ts +56 -0
- package/dist/cjs/biz-components/WheelLottery/RulesModal.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/RulesModal.js.map +7 -0
- package/dist/cjs/biz-components/WheelLottery/ShareModal.d.ts +79 -0
- package/dist/cjs/biz-components/WheelLottery/ShareModal.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/ShareModal.js.map +7 -0
- package/dist/cjs/biz-components/WheelLottery/Wheel.d.ts +27 -0
- package/dist/cjs/biz-components/WheelLottery/Wheel.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/Wheel.js.map +7 -0
- package/dist/cjs/biz-components/WheelLottery/WinnerModal.d.ts +27 -0
- package/dist/cjs/biz-components/WheelLottery/WinnerModal.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/WinnerModal.js.map +7 -0
- package/dist/cjs/biz-components/WheelLottery/index.d.ts +48 -0
- package/dist/cjs/biz-components/WheelLottery/index.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/index.js.map +7 -0
- package/dist/cjs/biz-components/WheelLottery/types.d.ts +1229 -0
- package/dist/cjs/biz-components/WheelLottery/types.js +2 -0
- package/dist/cjs/biz-components/WheelLottery/types.js.map +7 -0
- package/dist/cjs/biz-components/index.d.ts +11 -0
- package/dist/cjs/biz-components/index.js +1 -1
- package/dist/cjs/biz-components/index.js.map +3 -3
- package/dist/cjs/components/Countdown.d.ts +27 -4
- package/dist/cjs/components/Countdown.js +1 -1
- package/dist/cjs/components/Countdown.js.map +3 -3
- package/dist/cjs/hooks/useCountDown.js +1 -1
- package/dist/cjs/hooks/useCountDown.js.map +3 -3
- package/dist/cjs/hooks/useDraggableScroll.d.ts +77 -0
- package/dist/cjs/hooks/useDraggableScroll.js +2 -0
- package/dist/cjs/hooks/useDraggableScroll.js.map +7 -0
- package/dist/esm/biz-components/ActiveShelf/ProductCard.js +1 -1
- package/dist/esm/biz-components/ActiveShelf/ProductCard.js.map +2 -2
- package/dist/esm/biz-components/ActivityMechanism/index.d.ts +9 -0
- package/dist/esm/biz-components/ActivityMechanism/index.js +2 -0
- package/dist/esm/biz-components/ActivityMechanism/index.js.map +7 -0
- package/dist/esm/biz-components/ActivityMechanism/types.d.ts +43 -0
- package/dist/esm/biz-components/ActivityMechanism/types.js +1 -0
- package/dist/esm/biz-components/ActivityMechanism/types.js.map +7 -0
- package/dist/esm/biz-components/ActivitySchedule/index.d.ts +3 -0
- package/dist/esm/biz-components/ActivitySchedule/index.js +2 -0
- package/dist/esm/biz-components/ActivitySchedule/index.js.map +7 -0
- package/dist/esm/biz-components/ActivitySchedule/types.d.ts +44 -0
- package/dist/esm/biz-components/ActivitySchedule/types.js +1 -0
- package/dist/esm/biz-components/ActivitySchedule/types.js.map +7 -0
- package/dist/esm/biz-components/AnchorNavigation/index.d.ts +20 -0
- 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/EventSchedule/index.js +1 -1
- package/dist/esm/biz-components/EventSchedule/index.js.map +3 -3
- package/dist/esm/biz-components/FooterNavigation/index.js +1 -1
- package/dist/esm/biz-components/FooterNavigation/index.js.map +3 -3
- package/dist/esm/biz-components/FooterNavigation/types.d.ts +7 -0
- package/dist/esm/biz-components/FooterNavigation/types.js.map +2 -2
- package/dist/esm/biz-components/GiftShelf/index.d.ts +3 -0
- package/dist/esm/biz-components/GiftShelf/index.js +2 -0
- package/dist/esm/biz-components/GiftShelf/index.js.map +7 -0
- package/dist/esm/biz-components/GiftShelf/types.d.ts +120 -0
- package/dist/esm/biz-components/GiftShelf/types.js +1 -0
- package/dist/esm/biz-components/GiftShelf/types.js.map +7 -0
- package/dist/esm/biz-components/GiftTierShelf/index.d.ts +3 -0
- package/dist/esm/biz-components/GiftTierShelf/index.js +2 -0
- package/dist/esm/biz-components/GiftTierShelf/index.js.map +7 -0
- package/dist/esm/biz-components/GiftTierShelf/types.d.ts +75 -0
- package/dist/esm/biz-components/GiftTierShelf/types.js +1 -0
- package/dist/esm/biz-components/GiftTierShelf/types.js.map +7 -0
- package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
- package/dist/esm/biz-components/HeroBanner/HeroBanner.js.map +2 -2
- package/dist/esm/biz-components/HeroBanner/types.d.ts +2 -0
- package/dist/esm/biz-components/ImageWithText/ImageWithText.js +1 -1
- package/dist/esm/biz-components/ImageWithText/ImageWithText.js.map +2 -2
- package/dist/esm/biz-components/Ksp/index.d.ts +45 -6
- package/dist/esm/biz-components/Ksp/index.js +1 -1
- package/dist/esm/biz-components/Ksp/index.js.map +3 -3
- 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/PromotionalBar/index.js +1 -1
- package/dist/esm/biz-components/PromotionalBar/index.js.map +3 -3
- package/dist/esm/biz-components/ThreeDCarousel/ThreeDCarousel.js +1 -1
- package/dist/esm/biz-components/ThreeDCarousel/ThreeDCarousel.js.map +2 -2
- 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/Title/types.d.ts +10 -1
- package/dist/esm/biz-components/VideoModal/index.js +1 -1
- package/dist/esm/biz-components/VideoModal/index.js.map +2 -2
- package/dist/esm/biz-components/WheelLottery/BaseModal.d.ts +61 -0
- package/dist/esm/biz-components/WheelLottery/BaseModal.js +2 -0
- package/dist/esm/biz-components/WheelLottery/BaseModal.js.map +7 -0
- package/dist/esm/biz-components/WheelLottery/ChanceMethods.d.ts +25 -0
- package/dist/esm/biz-components/WheelLottery/ChanceMethods.js +2 -0
- package/dist/esm/biz-components/WheelLottery/ChanceMethods.js.map +7 -0
- package/dist/esm/biz-components/WheelLottery/ErrorModal.d.ts +47 -0
- package/dist/esm/biz-components/WheelLottery/ErrorModal.js +2 -0
- package/dist/esm/biz-components/WheelLottery/ErrorModal.js.map +7 -0
- package/dist/esm/biz-components/WheelLottery/MyRewardsModal.d.ts +101 -0
- package/dist/esm/biz-components/WheelLottery/MyRewardsModal.js +2 -0
- package/dist/esm/biz-components/WheelLottery/MyRewardsModal.js.map +7 -0
- package/dist/esm/biz-components/WheelLottery/PrizePool.d.ts +29 -0
- package/dist/esm/biz-components/WheelLottery/PrizePool.js +2 -0
- package/dist/esm/biz-components/WheelLottery/PrizePool.js.map +7 -0
- package/dist/esm/biz-components/WheelLottery/RulesModal.d.ts +56 -0
- package/dist/esm/biz-components/WheelLottery/RulesModal.js +2 -0
- package/dist/esm/biz-components/WheelLottery/RulesModal.js.map +7 -0
- package/dist/esm/biz-components/WheelLottery/ShareModal.d.ts +79 -0
- package/dist/esm/biz-components/WheelLottery/ShareModal.js +2 -0
- package/dist/esm/biz-components/WheelLottery/ShareModal.js.map +7 -0
- package/dist/esm/biz-components/WheelLottery/Wheel.d.ts +27 -0
- package/dist/esm/biz-components/WheelLottery/Wheel.js +2 -0
- package/dist/esm/biz-components/WheelLottery/Wheel.js.map +7 -0
- package/dist/esm/biz-components/WheelLottery/WinnerModal.d.ts +27 -0
- package/dist/esm/biz-components/WheelLottery/WinnerModal.js +2 -0
- package/dist/esm/biz-components/WheelLottery/WinnerModal.js.map +7 -0
- package/dist/esm/biz-components/WheelLottery/index.d.ts +48 -0
- package/dist/esm/biz-components/WheelLottery/index.js +2 -0
- package/dist/esm/biz-components/WheelLottery/index.js.map +7 -0
- package/dist/esm/biz-components/WheelLottery/types.d.ts +1229 -0
- package/dist/esm/biz-components/WheelLottery/types.js +2 -0
- package/dist/esm/biz-components/WheelLottery/types.js.map +7 -0
- package/dist/esm/biz-components/index.d.ts +11 -0
- package/dist/esm/biz-components/index.js +1 -1
- package/dist/esm/biz-components/index.js.map +2 -2
- package/dist/esm/components/Countdown.d.ts +27 -4
- package/dist/esm/components/Countdown.js +1 -1
- package/dist/esm/components/Countdown.js.map +3 -3
- package/dist/esm/hooks/useCountDown.js +1 -1
- package/dist/esm/hooks/useCountDown.js.map +3 -3
- package/dist/esm/hooks/useDraggableScroll.d.ts +77 -0
- package/dist/esm/hooks/useDraggableScroll.js +2 -0
- package/dist/esm/hooks/useDraggableScroll.js.map +7 -0
- package/package.json +1 -1
- package/style.css +6252 -862
- package/tailwind.config.js +18 -2
- package/dist/cjs/biz-components/HeroBanner/Countdown.d.ts +0 -10
- package/dist/cjs/biz-components/HeroBanner/Countdown.js +0 -2
- package/dist/cjs/biz-components/HeroBanner/Countdown.js.map +0 -7
- package/dist/cjs/biz-components/Title/Countdown.d.ts +0 -14
- package/dist/cjs/biz-components/Title/Countdown.js +0 -2
- package/dist/cjs/biz-components/Title/Countdown.js.map +0 -7
- package/dist/esm/biz-components/HeroBanner/Countdown.d.ts +0 -10
- package/dist/esm/biz-components/HeroBanner/Countdown.js +0 -2
- package/dist/esm/biz-components/HeroBanner/Countdown.js.map +0 -7
- package/dist/esm/biz-components/Title/Countdown.d.ts +0 -14
- package/dist/esm/biz-components/Title/Countdown.js +0 -2
- package/dist/esm/biz-components/Title/Countdown.js.map +0 -7
|
@@ -0,0 +1,1229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 大转盘抽奖组件(WheelLottery)类型定义
|
|
3
|
+
*
|
|
4
|
+
* @module WheelLotteryTypes
|
|
5
|
+
* @date 2025-12-17
|
|
6
|
+
*/
|
|
7
|
+
import type { Theme, Img } from '../../types/props.js';
|
|
8
|
+
/**
|
|
9
|
+
* WheelLottery 组件命令式控制接口
|
|
10
|
+
*
|
|
11
|
+
* 通过 ref 暴露给父组件,用于外部控制弹窗等状态
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* const lotteryRef = useRef<WheelLotteryHandle>(null)
|
|
16
|
+
*
|
|
17
|
+
* <WheelLottery ref={lotteryRef} prizes={prizes} />
|
|
18
|
+
*
|
|
19
|
+
* // 外部触发错误弹窗
|
|
20
|
+
* lotteryRef.current?.showError({
|
|
21
|
+
* title: 'Network Error',
|
|
22
|
+
* message: 'Failed to connect to server',
|
|
23
|
+
* confirmText: 'Retry'
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* // 显示规则弹窗
|
|
27
|
+
* lotteryRef.current?.showRules()
|
|
28
|
+
*
|
|
29
|
+
* // 关闭所有弹窗
|
|
30
|
+
* lotteryRef.current?.hideAllModals()
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export interface WheelLotteryHandle {
|
|
34
|
+
/**
|
|
35
|
+
* 显示错误弹窗
|
|
36
|
+
* @param config 错误弹窗配置
|
|
37
|
+
*/
|
|
38
|
+
showError: (config: {
|
|
39
|
+
/** 错误信息 */
|
|
40
|
+
message: string;
|
|
41
|
+
/** 标题(可选) */
|
|
42
|
+
title?: string;
|
|
43
|
+
/** 确认按钮文本(可选) */
|
|
44
|
+
confirmText?: string;
|
|
45
|
+
}) => void;
|
|
46
|
+
/**
|
|
47
|
+
* 隐藏错误弹窗
|
|
48
|
+
*/
|
|
49
|
+
hideError: () => void;
|
|
50
|
+
/**
|
|
51
|
+
* 显示未中奖弹窗(使用 ErrorModal)
|
|
52
|
+
* @param config 未中奖弹窗配置
|
|
53
|
+
*/
|
|
54
|
+
showNoWin: (config?: {
|
|
55
|
+
/** 标题(可选) */
|
|
56
|
+
title?: string;
|
|
57
|
+
/** 提示信息(可选) */
|
|
58
|
+
message?: string;
|
|
59
|
+
/** 确认按钮文本(可选) */
|
|
60
|
+
confirmText?: string;
|
|
61
|
+
}) => void;
|
|
62
|
+
/**
|
|
63
|
+
* 隐藏未中奖弹窗
|
|
64
|
+
*/
|
|
65
|
+
hideNoWin: () => void;
|
|
66
|
+
/**
|
|
67
|
+
* 显示中奖弹窗
|
|
68
|
+
* @param prize 中奖奖品
|
|
69
|
+
* @param config 中奖弹窗配置(可选)
|
|
70
|
+
*/
|
|
71
|
+
showWinner: (prize: Prize, config?: Partial<WinnerModalConfig>) => void;
|
|
72
|
+
/**
|
|
73
|
+
* 隐藏中奖弹窗
|
|
74
|
+
*/
|
|
75
|
+
hideWinner: () => void;
|
|
76
|
+
/**
|
|
77
|
+
* 显示规则弹窗
|
|
78
|
+
*/
|
|
79
|
+
showRules: () => void;
|
|
80
|
+
/**
|
|
81
|
+
* 隐藏规则弹窗
|
|
82
|
+
*/
|
|
83
|
+
hideRules: () => void;
|
|
84
|
+
/**
|
|
85
|
+
* 显示我的奖励弹窗
|
|
86
|
+
*/
|
|
87
|
+
showRewards: () => void;
|
|
88
|
+
/**
|
|
89
|
+
* 隐藏我的奖励弹窗
|
|
90
|
+
*/
|
|
91
|
+
hideRewards: () => void;
|
|
92
|
+
/**
|
|
93
|
+
* 显示分享弹窗
|
|
94
|
+
* @param config 分享弹窗配置(可选)
|
|
95
|
+
*/
|
|
96
|
+
showShare: (config?: Partial<ShareModalConfig>) => void;
|
|
97
|
+
/**
|
|
98
|
+
* 隐藏分享弹窗
|
|
99
|
+
*/
|
|
100
|
+
hideShare: () => void;
|
|
101
|
+
/**
|
|
102
|
+
* 关闭所有弹窗
|
|
103
|
+
*/
|
|
104
|
+
hideAllModals: () => void;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 默认转盘指针图片 URL
|
|
108
|
+
*/
|
|
109
|
+
export declare const DEFAULT_POINTER_IMAGE = "https://cdn.shopify.com/s/files/1/0517/2199/4432/files/2790697ba78c1a85d953787a8be9b258.png?v=1766371471";
|
|
110
|
+
export declare const DEFAULT_POINTER_DISABLE_IMAGE = "https://cdn.shopify.com/s/files/1/0582/4669/3040/files/2790697ba78c1a85d953787a8be9b258.png?v=1767610632";
|
|
111
|
+
/**
|
|
112
|
+
* 默认转盘底图(6 个奖品)
|
|
113
|
+
*/
|
|
114
|
+
export declare const DEFAULT_WHEEL_BG_6_PRIZES = "https://cdn.shopify.com/s/files/1/0517/2199/4432/files/be866c03-4d29-4d59-a8d4-39f5d64bbc0e_ae_e_6.png?v=1766374361";
|
|
115
|
+
/**
|
|
116
|
+
* 默认转盘底图(8 个奖品)
|
|
117
|
+
*/
|
|
118
|
+
export declare const DEFAULT_WHEEL_BG_8_PRIZES = "https://cdn.shopify.com/s/files/1/0517/2199/4432/files/ad63174a-3da0-4dcd-ac61-c83172c7893c_ae_e_8.png?v=1766374392";
|
|
119
|
+
/**
|
|
120
|
+
* 奖品(Prize)
|
|
121
|
+
*
|
|
122
|
+
* 代表转盘上的一个奖品区块,包含显示所需的所有信息。
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```tsx
|
|
126
|
+
* const prize: Prize = {
|
|
127
|
+
* prizeKey: 'prize-001',
|
|
128
|
+
* name: 'Anker Prime Charger (100W, 3 Ports, GaN)',
|
|
129
|
+
* image: { url: 'https://images.unsplash.com/photo-123', alt: 'Charger' },
|
|
130
|
+
* rank: '1st',
|
|
131
|
+
* price: '$79.99'
|
|
132
|
+
* }
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export interface Prize {
|
|
136
|
+
/**
|
|
137
|
+
* 唯一标识符,用于 React key 和中奖结果匹配
|
|
138
|
+
*/
|
|
139
|
+
prizeKey: string;
|
|
140
|
+
/**
|
|
141
|
+
* 奖品名称,显示在转盘和奖池中
|
|
142
|
+
* @maxLength 100
|
|
143
|
+
*/
|
|
144
|
+
name: string;
|
|
145
|
+
/**
|
|
146
|
+
* 奖品图片对象,包含 url 和 alt
|
|
147
|
+
*/
|
|
148
|
+
image: Img;
|
|
149
|
+
/**
|
|
150
|
+
* 排名标识,仅在 Prize Pool 中显示
|
|
151
|
+
* @optional
|
|
152
|
+
*/
|
|
153
|
+
rank?: '1st' | '2nd' | '3rd';
|
|
154
|
+
/**
|
|
155
|
+
* 价格或折扣信息,显示在奖池中
|
|
156
|
+
* @example "$99.99" | "12% Off"
|
|
157
|
+
* @optional
|
|
158
|
+
*/
|
|
159
|
+
price?: string;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 中奖信息(WinningInfo)
|
|
163
|
+
*
|
|
164
|
+
* 代表一条中奖记录,用于底部滚动条展示,营造活动氛围。
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```tsx
|
|
168
|
+
* const winningInfo: WinningInfo = {
|
|
169
|
+
* winningKey: 'win-001',
|
|
170
|
+
* userName: 'Shuqi***',
|
|
171
|
+
* prizeName: '12% Off Discount',
|
|
172
|
+
* timestamp: 1702800000000
|
|
173
|
+
* }
|
|
174
|
+
* ```
|
|
175
|
+
*/
|
|
176
|
+
export interface WinningInfo {
|
|
177
|
+
/**
|
|
178
|
+
* 唯一标识符
|
|
179
|
+
*/
|
|
180
|
+
winningKey: string;
|
|
181
|
+
/**
|
|
182
|
+
* 用户名(已脱敏),如 "Shuqi***"
|
|
183
|
+
* @note 假设传入的用户名已经过脱敏处理,组件内部不再处理
|
|
184
|
+
*/
|
|
185
|
+
userName: string;
|
|
186
|
+
/**
|
|
187
|
+
* 中奖奖品名称
|
|
188
|
+
*/
|
|
189
|
+
prizeName: string;
|
|
190
|
+
/**
|
|
191
|
+
* 中奖时间戳(毫秒)
|
|
192
|
+
* @optional
|
|
193
|
+
*/
|
|
194
|
+
timestamp?: number;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 获取机会方式类型
|
|
198
|
+
*/
|
|
199
|
+
export type ChanceMethodType = 'share' | 'points' | 'refer' | string;
|
|
200
|
+
/**
|
|
201
|
+
* 获取机会方式状态
|
|
202
|
+
*/
|
|
203
|
+
export type ChanceMethodStatus = 'pending' | 'completed' | 'used';
|
|
204
|
+
/**
|
|
205
|
+
* 获取机会方式(ChanceMethod)
|
|
206
|
+
*
|
|
207
|
+
* 代表一种获取抽奖机会的方式,支持灵活配置(分享、积分、推荐等)。
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```tsx
|
|
211
|
+
* const chanceMethod: ChanceMethod = {
|
|
212
|
+
* methodKey: 'share-001',
|
|
213
|
+
* type: 'share',
|
|
214
|
+
* title: 'Share on your socials',
|
|
215
|
+
* description: 'Share this event on your social media',
|
|
216
|
+
* buttonText: 'Redeem now',
|
|
217
|
+
* onClick: () => console.log('Share clicked'),
|
|
218
|
+
* disabled: false,
|
|
219
|
+
* status: 'pending'
|
|
220
|
+
* }
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
export interface ChanceMethod {
|
|
224
|
+
/**
|
|
225
|
+
* 唯一标识符
|
|
226
|
+
*/
|
|
227
|
+
methodKey: string;
|
|
228
|
+
/**
|
|
229
|
+
* 方式类型,支持预定义类型('share', 'points', 'refer')或自定义类型
|
|
230
|
+
*/
|
|
231
|
+
type: ChanceMethodType;
|
|
232
|
+
/**
|
|
233
|
+
* 方式标题,如 "Share on your socials"
|
|
234
|
+
*/
|
|
235
|
+
title: string;
|
|
236
|
+
/**
|
|
237
|
+
* 详细说明文字
|
|
238
|
+
*/
|
|
239
|
+
description: string;
|
|
240
|
+
/**
|
|
241
|
+
* 按钮文案,默认 "Redeem now"
|
|
242
|
+
* @default "Redeem now"
|
|
243
|
+
* @optional
|
|
244
|
+
*/
|
|
245
|
+
buttonText?: string;
|
|
246
|
+
completed?: string;
|
|
247
|
+
used?: string;
|
|
248
|
+
/**
|
|
249
|
+
* 未登录时点击 GO 按钮的回调
|
|
250
|
+
* @example
|
|
251
|
+
* ```tsx
|
|
252
|
+
* onLoginRequired={() => {
|
|
253
|
+
* // 打开登录弹窗或跳转登录页
|
|
254
|
+
* router.push('/login')
|
|
255
|
+
* }}
|
|
256
|
+
* ```
|
|
257
|
+
*/
|
|
258
|
+
onLoginRequired?: () => void;
|
|
259
|
+
/**
|
|
260
|
+
* 点击按钮时的回调函数
|
|
261
|
+
* @note 业务逻辑(如积分扣除、分享验证)由父组件处理
|
|
262
|
+
*/
|
|
263
|
+
onClick: () => void;
|
|
264
|
+
/**
|
|
265
|
+
* 是否禁用该方式
|
|
266
|
+
* @default false
|
|
267
|
+
* @optional
|
|
268
|
+
*/
|
|
269
|
+
disabled?: boolean;
|
|
270
|
+
/**
|
|
271
|
+
* 获取机会方式的状态
|
|
272
|
+
* - pending: 未完成(默认状态)
|
|
273
|
+
* - completed: 已完成/已获得
|
|
274
|
+
* - used: 已使用
|
|
275
|
+
* @default "pending"
|
|
276
|
+
* @optional
|
|
277
|
+
*/
|
|
278
|
+
status?: ChanceMethodStatus;
|
|
279
|
+
/**
|
|
280
|
+
* 是否显示加载状态
|
|
281
|
+
* @default false
|
|
282
|
+
* @optional
|
|
283
|
+
*/
|
|
284
|
+
loading?: boolean;
|
|
285
|
+
/**
|
|
286
|
+
* 是否在点击时打开分享弹窗
|
|
287
|
+
* @default false
|
|
288
|
+
* @optional
|
|
289
|
+
*/
|
|
290
|
+
openShareModal?: boolean;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* 用户数据(UserData)
|
|
294
|
+
*
|
|
295
|
+
* 代表当前用户的抽奖相关数据
|
|
296
|
+
*
|
|
297
|
+
* @example
|
|
298
|
+
* ```tsx
|
|
299
|
+
* const userData: UserData = {
|
|
300
|
+
* isLoggedIn: true,
|
|
301
|
+
* availableChances: 3,
|
|
302
|
+
* wonPrizes: [
|
|
303
|
+
* { id: 'prize-001', name: 'Charger', image: 'https://...', timestamp: 1702800000000 }
|
|
304
|
+
* ]
|
|
305
|
+
* }
|
|
306
|
+
* ```
|
|
307
|
+
*/
|
|
308
|
+
export interface UserData {
|
|
309
|
+
/**
|
|
310
|
+
* 用户是否已登录
|
|
311
|
+
*/
|
|
312
|
+
isLoggedIn: boolean;
|
|
313
|
+
/**
|
|
314
|
+
* 当前可使用的抽奖次数
|
|
315
|
+
* @default 0
|
|
316
|
+
*/
|
|
317
|
+
availableChances: number;
|
|
318
|
+
/**
|
|
319
|
+
* 总机会数(用于显示进度,例如 "3/5")
|
|
320
|
+
* @default undefined
|
|
321
|
+
* @optional
|
|
322
|
+
*/
|
|
323
|
+
totalChances?: number;
|
|
324
|
+
/**
|
|
325
|
+
* 已获得的奖品列表
|
|
326
|
+
* @optional
|
|
327
|
+
*/
|
|
328
|
+
wonPrizes?: Array<Prize & {
|
|
329
|
+
timestamp?: number;
|
|
330
|
+
}>;
|
|
331
|
+
/** * 用户电子邮箱(可选,用于发送中奖通知等)
|
|
332
|
+
* @optional
|
|
333
|
+
*/
|
|
334
|
+
email?: string;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* 缓动函数类型
|
|
338
|
+
*/
|
|
339
|
+
export type EasingFunction = 'ease-out' | 'ease-in-out' | 'linear';
|
|
340
|
+
/**
|
|
341
|
+
* 复制操作相关文案配置(公共类型)
|
|
342
|
+
* 用于所有包含复制功能的组件
|
|
343
|
+
*/
|
|
344
|
+
export interface CopyTextConfig {
|
|
345
|
+
/**
|
|
346
|
+
* 复制按钮文本
|
|
347
|
+
* @default "COPY"
|
|
348
|
+
*/
|
|
349
|
+
copyText?: string;
|
|
350
|
+
/**
|
|
351
|
+
* 复制成功后的按钮文本
|
|
352
|
+
* @default "COPIED"
|
|
353
|
+
*/
|
|
354
|
+
copiedText?: string;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* 优惠码相关配置(公共类型)
|
|
358
|
+
* 用于所有展示优惠码的组件
|
|
359
|
+
*/
|
|
360
|
+
export interface CouponConfig {
|
|
361
|
+
/**
|
|
362
|
+
* 代码文本前缀
|
|
363
|
+
* @default "CODE:"
|
|
364
|
+
*/
|
|
365
|
+
codeText?: string;
|
|
366
|
+
/**
|
|
367
|
+
* 优惠码
|
|
368
|
+
*/
|
|
369
|
+
couponCode?: string;
|
|
370
|
+
/**
|
|
371
|
+
* 优惠码过期时间
|
|
372
|
+
*/
|
|
373
|
+
expiresAt?: string;
|
|
374
|
+
/**
|
|
375
|
+
* 优惠券折扣文本(例如 "20%")
|
|
376
|
+
*/
|
|
377
|
+
couponDiscount?: string;
|
|
378
|
+
/**
|
|
379
|
+
* 优惠券单位文本
|
|
380
|
+
* @default "Off"
|
|
381
|
+
*/
|
|
382
|
+
couponUnit?: string;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* 奖励时间文案配置(公共类型)
|
|
386
|
+
*/
|
|
387
|
+
export interface PrizeTimeTextConfig {
|
|
388
|
+
/**
|
|
389
|
+
* 奖励时间文本前缀
|
|
390
|
+
* @default "Prize time:"
|
|
391
|
+
*/
|
|
392
|
+
prizeText?: string;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* 中奖弹窗配置(WinnerModalConfig)
|
|
396
|
+
*
|
|
397
|
+
* 用于配置中奖弹窗的展示内容,通常由抽奖接口返回提供
|
|
398
|
+
*
|
|
399
|
+
* @example
|
|
400
|
+
* ```tsx
|
|
401
|
+
* const winnerModalConfig: WinnerModalConfig = {
|
|
402
|
+
* title: 'Congratulations!',
|
|
403
|
+
* prizeTitle: 'Anker Prime Charger',
|
|
404
|
+
* prizeImage: 'https://...',
|
|
405
|
+
* prizeDescription: 'High-speed charging for all your devices',
|
|
406
|
+
* learnMoreUrl: 'https://...',
|
|
407
|
+
* learnMoreText: 'View Details',
|
|
408
|
+
* couponCode: 'ANKER2024',
|
|
409
|
+
* expiresAt: '2024-12-31',
|
|
410
|
+
* couponDiscount: '20%',
|
|
411
|
+
* couponUnit: 'Off',
|
|
412
|
+
* confirmText: 'Claim Now'
|
|
413
|
+
* }
|
|
414
|
+
* ```
|
|
415
|
+
*/
|
|
416
|
+
export interface WinnerModalConfig extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {
|
|
417
|
+
/**
|
|
418
|
+
* 中奖弹窗标题
|
|
419
|
+
* @default "You Have Won"
|
|
420
|
+
* @optional
|
|
421
|
+
*/
|
|
422
|
+
title?: string;
|
|
423
|
+
/**
|
|
424
|
+
* 中奖弹窗奖品标题(优先级高于 prize.name)
|
|
425
|
+
* @optional
|
|
426
|
+
*/
|
|
427
|
+
prizeTitle?: string;
|
|
428
|
+
/**
|
|
429
|
+
* 中奖弹窗奖品图片 URL(优先级高于 prize.image)
|
|
430
|
+
* @optional
|
|
431
|
+
*/
|
|
432
|
+
prizeImage?: string;
|
|
433
|
+
/**
|
|
434
|
+
* 中奖弹窗奖品详情描述
|
|
435
|
+
* @optional
|
|
436
|
+
*/
|
|
437
|
+
prizeDescription?: string;
|
|
438
|
+
/**
|
|
439
|
+
* 中奖弹窗 Learn More 链接
|
|
440
|
+
* @optional
|
|
441
|
+
*/
|
|
442
|
+
learnMoreUrl?: string;
|
|
443
|
+
/**
|
|
444
|
+
* 中奖弹窗 Learn More 按钮文本
|
|
445
|
+
* @default "Learn More"
|
|
446
|
+
* @optional
|
|
447
|
+
*/
|
|
448
|
+
learnMoreText?: string;
|
|
449
|
+
/**
|
|
450
|
+
* 中奖弹窗确认按钮文本
|
|
451
|
+
* @default "Okay, Got It"
|
|
452
|
+
* @optional
|
|
453
|
+
*/
|
|
454
|
+
confirmText?: string;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Rules 弹窗配置
|
|
458
|
+
*
|
|
459
|
+
* @example
|
|
460
|
+
* ```tsx
|
|
461
|
+
* rulesModalConfig={{
|
|
462
|
+
* rulesData: [
|
|
463
|
+
* { item: '$100 instead of $200, 10 tickets/day.' },
|
|
464
|
+
* { item: '$100 for $120, 50 tickets/day.' }
|
|
465
|
+
* ],
|
|
466
|
+
* rulesText: 'Game Rules',
|
|
467
|
+
* rulesTitle: 'Activity Rules'
|
|
468
|
+
* }}
|
|
469
|
+
* ```
|
|
470
|
+
*/
|
|
471
|
+
export interface RulesModalConfig {
|
|
472
|
+
/**
|
|
473
|
+
* 规则数据列表
|
|
474
|
+
* @optional
|
|
475
|
+
*/
|
|
476
|
+
rulesData?: Array<{
|
|
477
|
+
/**
|
|
478
|
+
* 规则项内容
|
|
479
|
+
*/
|
|
480
|
+
item: string;
|
|
481
|
+
}>;
|
|
482
|
+
/**
|
|
483
|
+
* Rules 按钮文本
|
|
484
|
+
* @default "Rules"
|
|
485
|
+
* @optional
|
|
486
|
+
*/
|
|
487
|
+
rulesText?: string;
|
|
488
|
+
/**
|
|
489
|
+
* 弹窗标题
|
|
490
|
+
* @default "Rules"
|
|
491
|
+
* @optional
|
|
492
|
+
*/
|
|
493
|
+
rulesTitle?: string;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* My Rewards 弹窗配置
|
|
497
|
+
*
|
|
498
|
+
* @example
|
|
499
|
+
* ```tsx
|
|
500
|
+
* myRewardsModalConfig={{
|
|
501
|
+
* rewardsData: [
|
|
502
|
+
* {
|
|
503
|
+
* id: '1',
|
|
504
|
+
* name: 'Anker Charger',
|
|
505
|
+
* code: 'ANKER2024',
|
|
506
|
+
* status: 'Available',
|
|
507
|
+
* prizeTime: '2024-01-01',
|
|
508
|
+
* showCopyCode: true
|
|
509
|
+
* }
|
|
510
|
+
* ],
|
|
511
|
+
* myRewardsText: 'My Prizes',
|
|
512
|
+
* codeText: 'CODE:',
|
|
513
|
+
* copyText: 'COPY',
|
|
514
|
+
* prizeText: 'Prize time:',
|
|
515
|
+
* emptyText: 'No rewards yet'
|
|
516
|
+
* }}
|
|
517
|
+
* ```
|
|
518
|
+
*/
|
|
519
|
+
export interface MyRewardsModalConfig extends CopyTextConfig, PrizeTimeTextConfig {
|
|
520
|
+
/**
|
|
521
|
+
* 奖励数据列表
|
|
522
|
+
* @optional
|
|
523
|
+
*/
|
|
524
|
+
rewardsData?: Array<{
|
|
525
|
+
/**
|
|
526
|
+
* 奖励 ID
|
|
527
|
+
*/
|
|
528
|
+
id: string;
|
|
529
|
+
/**
|
|
530
|
+
* 奖励名称
|
|
531
|
+
*/
|
|
532
|
+
name: string;
|
|
533
|
+
/**
|
|
534
|
+
* 优惠码(可选)
|
|
535
|
+
*/
|
|
536
|
+
code?: string;
|
|
537
|
+
/**
|
|
538
|
+
* 状态
|
|
539
|
+
*/
|
|
540
|
+
status: 'Available' | 'Expired' | 'Used';
|
|
541
|
+
/**
|
|
542
|
+
* 奖励时间
|
|
543
|
+
*/
|
|
544
|
+
prizeTime?: string;
|
|
545
|
+
/**
|
|
546
|
+
* 是否可复制码
|
|
547
|
+
*/
|
|
548
|
+
showCopyCode?: boolean;
|
|
549
|
+
}>;
|
|
550
|
+
/**
|
|
551
|
+
* My Rewards 按钮文本
|
|
552
|
+
* @default "My Rewards"
|
|
553
|
+
* @optional
|
|
554
|
+
*/
|
|
555
|
+
myRewardsText?: string;
|
|
556
|
+
/**
|
|
557
|
+
* 弹窗标题
|
|
558
|
+
* @default "My Rewards"
|
|
559
|
+
* @optional
|
|
560
|
+
*/
|
|
561
|
+
myRewardsTitle?: string;
|
|
562
|
+
/**
|
|
563
|
+
* 代码文本前缀
|
|
564
|
+
* @default "CODE:"
|
|
565
|
+
* @optional
|
|
566
|
+
*/
|
|
567
|
+
codeText?: string;
|
|
568
|
+
/**
|
|
569
|
+
* 空状态提示文本
|
|
570
|
+
* @default "No rewards yet"
|
|
571
|
+
* @optional
|
|
572
|
+
*/
|
|
573
|
+
emptyText?: string;
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* 错误弹窗配置
|
|
577
|
+
* @example
|
|
578
|
+
* ```tsx
|
|
579
|
+
* errorModalConfig={{
|
|
580
|
+
* title: 'Oops!',
|
|
581
|
+
* message: 'Something went wrong during the lottery process.',
|
|
582
|
+
* confirmText: 'OK, I get'
|
|
583
|
+
* }}
|
|
584
|
+
* ```
|
|
585
|
+
*/
|
|
586
|
+
export interface ErrorModalConfig {
|
|
587
|
+
/**
|
|
588
|
+
* 弹窗标题
|
|
589
|
+
* @default "Oops!"
|
|
590
|
+
* @optional
|
|
591
|
+
*/
|
|
592
|
+
title?: string;
|
|
593
|
+
/**
|
|
594
|
+
* 错误消息内容
|
|
595
|
+
* @default "Something went wrong during the lottery process."
|
|
596
|
+
* @optional
|
|
597
|
+
*/
|
|
598
|
+
message?: string;
|
|
599
|
+
/**
|
|
600
|
+
* 确认按钮文本
|
|
601
|
+
* @default "OK, I get"
|
|
602
|
+
* @optional
|
|
603
|
+
*/
|
|
604
|
+
confirmText?: string;
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* 社交平台类型
|
|
608
|
+
*/
|
|
609
|
+
export type SocialPlatform = 'facebook' | 'twitter' | 'instagram' | 'linkedin' | 'tiktok' | 'youtube';
|
|
610
|
+
/**
|
|
611
|
+
* 社交平台配置
|
|
612
|
+
*/
|
|
613
|
+
export interface SharePlatformConfig {
|
|
614
|
+
/**
|
|
615
|
+
* 平台类型
|
|
616
|
+
*/
|
|
617
|
+
platform: SocialPlatform;
|
|
618
|
+
/**
|
|
619
|
+
* 平台名称
|
|
620
|
+
*/
|
|
621
|
+
name: string;
|
|
622
|
+
/**
|
|
623
|
+
* 分享 URL(可选,如果提供则直接跳转)
|
|
624
|
+
*/
|
|
625
|
+
url?: string;
|
|
626
|
+
/**
|
|
627
|
+
* 点击回调(如果提供 url 则此回调会在跳转前执行)
|
|
628
|
+
*/
|
|
629
|
+
onClick?: () => void;
|
|
630
|
+
/**
|
|
631
|
+
* 是否禁用
|
|
632
|
+
*/
|
|
633
|
+
disabled?: boolean;
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* 分享弹窗配置
|
|
637
|
+
*/
|
|
638
|
+
export interface ShareModalConfig {
|
|
639
|
+
/**
|
|
640
|
+
* 弹窗标题
|
|
641
|
+
* @default "Share to Get More Chances"
|
|
642
|
+
*/
|
|
643
|
+
title?: string;
|
|
644
|
+
/**
|
|
645
|
+
* 副标题/引导文案
|
|
646
|
+
* @default "Share to Play Again Keep Trying! You Could Still Win Big!"
|
|
647
|
+
*/
|
|
648
|
+
subtitle?: string;
|
|
649
|
+
/**
|
|
650
|
+
* 底部提示文案
|
|
651
|
+
* @default "Note: Maximum of 3 times per participant."
|
|
652
|
+
*/
|
|
653
|
+
note?: string;
|
|
654
|
+
/**
|
|
655
|
+
* 社交平台配置列表
|
|
656
|
+
*/
|
|
657
|
+
platforms?: SharePlatformConfig[];
|
|
658
|
+
/**
|
|
659
|
+
* 分享成功回调
|
|
660
|
+
*/
|
|
661
|
+
onShareSuccess?: (platform: SocialPlatform) => void;
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* WheelLottery 组件 Props
|
|
665
|
+
*
|
|
666
|
+
* @example
|
|
667
|
+
* ```tsx
|
|
668
|
+
* <WheelLottery
|
|
669
|
+
* prizes={prizes}
|
|
670
|
+
* winningPrizeId="prize-003"
|
|
671
|
+
* spinDuration={4000}
|
|
672
|
+
* easing="ease-out"
|
|
673
|
+
* chanceMethods={chanceMethods}
|
|
674
|
+
* chanceTitle="Want more chances to win?"
|
|
675
|
+
* winningInfos={winningInfos}
|
|
676
|
+
* onSpinStart={() => console.log('Spin started')}
|
|
677
|
+
* onSpinEnd={(prize) => alert(`You won ${prize.name}`)}
|
|
678
|
+
* />
|
|
679
|
+
* ```
|
|
680
|
+
*/
|
|
681
|
+
export interface WheelLotteryProps {
|
|
682
|
+
/**
|
|
683
|
+
* 8 个奖品数组(必需)
|
|
684
|
+
* @minLength 8
|
|
685
|
+
* @maxLength 8
|
|
686
|
+
* @validation 如果长度不等于 8,应在开发环境下输出警告
|
|
687
|
+
*/
|
|
688
|
+
prizes: Prize[];
|
|
689
|
+
/**
|
|
690
|
+
* 主题色
|
|
691
|
+
*/
|
|
692
|
+
theme?: Theme;
|
|
693
|
+
/**
|
|
694
|
+
* 指定中奖奖品的 ID,用于测试或服务端决定结果
|
|
695
|
+
* @note 必须是 prizes 数组中某个 Prize 的 id
|
|
696
|
+
* @optional
|
|
697
|
+
*/
|
|
698
|
+
winningPrizeId?: string;
|
|
699
|
+
/**
|
|
700
|
+
* 旋转时长(毫秒)
|
|
701
|
+
* @default 4000
|
|
702
|
+
* @range 3000-5000
|
|
703
|
+
* @optional
|
|
704
|
+
*/
|
|
705
|
+
spinDuration?: number;
|
|
706
|
+
/**
|
|
707
|
+
* 缓动函数
|
|
708
|
+
* @default "ease-out"
|
|
709
|
+
* @optional
|
|
710
|
+
*/
|
|
711
|
+
easing?: EasingFunction;
|
|
712
|
+
/**
|
|
713
|
+
* 转盘底图 URL(支持 6 个或 8 个奖品的背景图)
|
|
714
|
+
* @default 根据 prizes.length 自动选择 6 或 8 奖品底图
|
|
715
|
+
* @optional
|
|
716
|
+
*/
|
|
717
|
+
wheelBackgroundImage?: string;
|
|
718
|
+
/**
|
|
719
|
+
* 转盘指针图片 URL
|
|
720
|
+
* @default 默认指针图片
|
|
721
|
+
* @optional
|
|
722
|
+
*/
|
|
723
|
+
pointerImage?: string;
|
|
724
|
+
/**
|
|
725
|
+
* 获取机会方式数组
|
|
726
|
+
* @default DEFAULT_CHANCE_METHODS(3种默认方式:分享、积分、推荐)
|
|
727
|
+
* @note 当数组为空时,隐藏整个"获取机会"区域
|
|
728
|
+
* @optional
|
|
729
|
+
*/
|
|
730
|
+
chanceMethods?: ChanceMethod[];
|
|
731
|
+
/**
|
|
732
|
+
* 获取机会区域标题
|
|
733
|
+
* @default "Want more chances to win?"
|
|
734
|
+
* @optional
|
|
735
|
+
*/
|
|
736
|
+
chanceTitle?: string;
|
|
737
|
+
/**
|
|
738
|
+
* 获取机会区域副标题
|
|
739
|
+
* @optional
|
|
740
|
+
*/
|
|
741
|
+
chanceSubtitle?: string;
|
|
742
|
+
/**
|
|
743
|
+
* 获取机会区域底部提示
|
|
744
|
+
* @optional
|
|
745
|
+
*/
|
|
746
|
+
chanceFooterNote?: string;
|
|
747
|
+
/**
|
|
748
|
+
* 获取机会方式文案配置
|
|
749
|
+
* @optional
|
|
750
|
+
*/
|
|
751
|
+
chanceMethodsText?: {
|
|
752
|
+
chanceBadgeText?: string;
|
|
753
|
+
completedText?: string;
|
|
754
|
+
usedText?: string;
|
|
755
|
+
loadingText?: string;
|
|
756
|
+
};
|
|
757
|
+
/**
|
|
758
|
+
* 中奖信息数组,用于底部滚动条展示
|
|
759
|
+
* @default []
|
|
760
|
+
* @note 当数组为空时,隐藏底部滚动条或显示默认提示
|
|
761
|
+
* @optional
|
|
762
|
+
*/
|
|
763
|
+
winningInfos?: WinningInfo[];
|
|
764
|
+
/**
|
|
765
|
+
* 奖品池展示区域标题
|
|
766
|
+
* @default "Prize Pool"
|
|
767
|
+
* @optional
|
|
768
|
+
*/
|
|
769
|
+
prizesTitle?: string;
|
|
770
|
+
/**
|
|
771
|
+
* 抽奖开始时的回调,返回 Promise 以支持异步接口调用
|
|
772
|
+
* @returns Promise<string> - 中奖奖品的 ID,如果接口失败则 reject
|
|
773
|
+
* @optional
|
|
774
|
+
* @example
|
|
775
|
+
* ```tsx
|
|
776
|
+
* onSpinStart={async () => {
|
|
777
|
+
* const result = await fetch('/api/lottery')
|
|
778
|
+
* const data = await result.json()
|
|
779
|
+
* return data.prizeId // 返回中奖奖品 ID
|
|
780
|
+
* }}
|
|
781
|
+
* ```
|
|
782
|
+
*/
|
|
783
|
+
onSpinStart?: () => Promise<string>;
|
|
784
|
+
/**
|
|
785
|
+
* 抽奖结束时的回调,传递中奖奖品
|
|
786
|
+
* @param prize 中奖奖品对象
|
|
787
|
+
* @optional
|
|
788
|
+
*/
|
|
789
|
+
onSpinEnd?: (prize: Prize) => void;
|
|
790
|
+
/**
|
|
791
|
+
* 抽奖错误时的回调
|
|
792
|
+
* @param error 错误信息
|
|
793
|
+
* @optional
|
|
794
|
+
*/
|
|
795
|
+
onSpinError?: (error: Error) => void;
|
|
796
|
+
/**
|
|
797
|
+
* 中奖弹窗配置对象,通常由抽奖接口返回提供
|
|
798
|
+
* @optional
|
|
799
|
+
* @example
|
|
800
|
+
* ```tsx
|
|
801
|
+
* winnerModalConfig={{
|
|
802
|
+
* title: 'Congratulations!',
|
|
803
|
+
* prizeTitle: 'Anker Prime Charger',
|
|
804
|
+
* prizeImage: 'https://...',
|
|
805
|
+
* prizeDescription: 'High-speed charging',
|
|
806
|
+
* learnMoreUrl: 'https://...',
|
|
807
|
+
* couponCode: 'ANKER2024',
|
|
808
|
+
* expiresAt: '2024-12-31',
|
|
809
|
+
* couponDiscount: '20%',
|
|
810
|
+
* confirmText: 'Claim Now'
|
|
811
|
+
* }}
|
|
812
|
+
* ```
|
|
813
|
+
*/
|
|
814
|
+
winnerModalConfig?: WinnerModalConfig;
|
|
815
|
+
rulesModalConfig?: RulesModalConfig;
|
|
816
|
+
myRewardsModalConfig?: MyRewardsModalConfig;
|
|
817
|
+
errorModalConfig?: ErrorModalConfig;
|
|
818
|
+
/**
|
|
819
|
+
* 分享弹窗配置
|
|
820
|
+
* @optional
|
|
821
|
+
*/
|
|
822
|
+
shareModalConfig?: ShareModalConfig;
|
|
823
|
+
/**
|
|
824
|
+
* 未登录时点击 GO 按钮的回调
|
|
825
|
+
* @example
|
|
826
|
+
* ```tsx
|
|
827
|
+
* onLoginRequired={() => {
|
|
828
|
+
* // 打开登录弹窗或跳转登录页
|
|
829
|
+
* router.push('/login')
|
|
830
|
+
* }}
|
|
831
|
+
* ```
|
|
832
|
+
*/
|
|
833
|
+
onLoginRequired?: () => void;
|
|
834
|
+
/**
|
|
835
|
+
* 用户数据
|
|
836
|
+
* @optional
|
|
837
|
+
* @example
|
|
838
|
+
* ```tsx
|
|
839
|
+
* userData={{
|
|
840
|
+
* isLoggedIn: true,
|
|
841
|
+
* availableChances: 3,
|
|
842
|
+
* wonPrizes: [{ id: 'prize-001', name: 'Charger', image: 'https://...' }]
|
|
843
|
+
* }}
|
|
844
|
+
* ```
|
|
845
|
+
*/
|
|
846
|
+
userData?: UserData;
|
|
847
|
+
/**
|
|
848
|
+
* 未登录时的提示文案
|
|
849
|
+
* @default "Please log in to participate"
|
|
850
|
+
* @optional
|
|
851
|
+
*/
|
|
852
|
+
loginPromptText?: string;
|
|
853
|
+
/**
|
|
854
|
+
* 登录按钮文案
|
|
855
|
+
* @default "Log In"
|
|
856
|
+
* @optional
|
|
857
|
+
*/
|
|
858
|
+
loginButtonText?: string;
|
|
859
|
+
/**
|
|
860
|
+
* 次数不足时的提示文案
|
|
861
|
+
* @default "You have no chances left"
|
|
862
|
+
* @optional
|
|
863
|
+
*/
|
|
864
|
+
noChancesText?: string;
|
|
865
|
+
/**
|
|
866
|
+
* 复制优惠码回调
|
|
867
|
+
* @optional
|
|
868
|
+
*/
|
|
869
|
+
onCopyCode?: (code: string) => void;
|
|
870
|
+
/**
|
|
871
|
+
* Rules 按钮文本
|
|
872
|
+
* @default "Rules"
|
|
873
|
+
* @optional
|
|
874
|
+
*/
|
|
875
|
+
rulesText?: string;
|
|
876
|
+
/**
|
|
877
|
+
* Opportunities 文本数组
|
|
878
|
+
* @default ["Accumulate", "lottery opportunities"]
|
|
879
|
+
* @optional
|
|
880
|
+
*/
|
|
881
|
+
opportunitiesText?: string[];
|
|
882
|
+
/**
|
|
883
|
+
* My Rewards 按钮文本
|
|
884
|
+
* @default "My Rewards"
|
|
885
|
+
* @optional
|
|
886
|
+
*/
|
|
887
|
+
myRewardsText?: string;
|
|
888
|
+
/**
|
|
889
|
+
* 未中奖弹窗标题
|
|
890
|
+
* @default "Sorry, You Didn't Win This Time"
|
|
891
|
+
* @optional
|
|
892
|
+
*/
|
|
893
|
+
noWinTitle?: string;
|
|
894
|
+
/**
|
|
895
|
+
* 未中奖弹窗副标题
|
|
896
|
+
* @default "Keep Trying, You Could Still Win Big!"
|
|
897
|
+
* @optional
|
|
898
|
+
*/
|
|
899
|
+
noWinSubtitle?: string;
|
|
900
|
+
/**
|
|
901
|
+
* My Rewards 弹窗无奖励时的提示文本
|
|
902
|
+
* @default "No rewards yet"
|
|
903
|
+
* @optional
|
|
904
|
+
*/
|
|
905
|
+
rewardsEmptyText?: string;
|
|
906
|
+
/**
|
|
907
|
+
* My Rewards 弹窗 CODE 标签文本
|
|
908
|
+
* @default "CODE:"
|
|
909
|
+
* @optional
|
|
910
|
+
*/
|
|
911
|
+
rewardsCodeLabel?: string;
|
|
912
|
+
/**
|
|
913
|
+
* My Rewards 弹窗复制按钮文本
|
|
914
|
+
* @default "Copy"
|
|
915
|
+
* @optional
|
|
916
|
+
*/
|
|
917
|
+
rewardsCopyButtonText?: string;
|
|
918
|
+
/**
|
|
919
|
+
* My Rewards 弹窗奖励时间标签文本
|
|
920
|
+
* @default "Prize time:"
|
|
921
|
+
* @optional
|
|
922
|
+
*/
|
|
923
|
+
rewardsPrizeTimeLabel?: string;
|
|
924
|
+
/**
|
|
925
|
+
* 弹窗关闭按钮的 aria-label
|
|
926
|
+
* @default "关闭弹窗"
|
|
927
|
+
* @optional
|
|
928
|
+
*/
|
|
929
|
+
modalCloseButtonAriaLabel?: string;
|
|
930
|
+
/**
|
|
931
|
+
* 自定义 CSS 类名,用于覆盖或扩展默认样式
|
|
932
|
+
* @optional
|
|
933
|
+
*/
|
|
934
|
+
className?: string;
|
|
935
|
+
}
|
|
936
|
+
/**
|
|
937
|
+
* 默认获取机会方式(3种)
|
|
938
|
+
* @note 父组件需要覆盖 onClick 回调以实现具体业务逻辑
|
|
939
|
+
*/
|
|
940
|
+
export declare const DEFAULT_CHANCE_METHODS: ChanceMethod[];
|
|
941
|
+
/**
|
|
942
|
+
* 默认转盘配置
|
|
943
|
+
*/
|
|
944
|
+
export declare const DEFAULT_WHEEL_CONFIG: {
|
|
945
|
+
spinDuration: number;
|
|
946
|
+
easing: EasingFunction;
|
|
947
|
+
chanceTitle: string;
|
|
948
|
+
};
|
|
949
|
+
/**
|
|
950
|
+
* 转盘运行时状态(组件内部使用)
|
|
951
|
+
* @internal
|
|
952
|
+
*/
|
|
953
|
+
export interface WheelState {
|
|
954
|
+
/**
|
|
955
|
+
* 转盘是否正在旋转
|
|
956
|
+
*/
|
|
957
|
+
isSpinning: boolean;
|
|
958
|
+
/**
|
|
959
|
+
* 当前旋转角度(度数)
|
|
960
|
+
*/
|
|
961
|
+
currentRotation: number;
|
|
962
|
+
/**
|
|
963
|
+
* 中奖奖品,抽奖结束后设置
|
|
964
|
+
*/
|
|
965
|
+
winningPrize: Prize | null;
|
|
966
|
+
/**
|
|
967
|
+
* GO 按钮是否禁用
|
|
968
|
+
*/
|
|
969
|
+
isButtonDisabled: boolean;
|
|
970
|
+
/**
|
|
971
|
+
* 是否已完成抽奖(用于控制转盘是否显示初始旋转动画)
|
|
972
|
+
*/
|
|
973
|
+
isFinished: boolean;
|
|
974
|
+
}
|
|
975
|
+
/**
|
|
976
|
+
* 初始转盘状态
|
|
977
|
+
* @internal
|
|
978
|
+
*/
|
|
979
|
+
export declare const INITIAL_WHEEL_STATE: WheelState;
|
|
980
|
+
/**
|
|
981
|
+
* Wheel 转盘组件 Props
|
|
982
|
+
*/
|
|
983
|
+
export interface WheelProps {
|
|
984
|
+
/**
|
|
985
|
+
* 主题模式
|
|
986
|
+
* @optional
|
|
987
|
+
*/
|
|
988
|
+
theme?: Theme;
|
|
989
|
+
/**
|
|
990
|
+
* 8 个奖品数组
|
|
991
|
+
*/
|
|
992
|
+
prizes: Prize[];
|
|
993
|
+
/**
|
|
994
|
+
* 当前旋转角度(度数)
|
|
995
|
+
*/
|
|
996
|
+
rotation: number;
|
|
997
|
+
/**
|
|
998
|
+
* 是否正在旋转
|
|
999
|
+
*/
|
|
1000
|
+
isSpinning: boolean;
|
|
1001
|
+
/**
|
|
1002
|
+
* 是否已完成抽奖(用于控制转盘是否显示初始旋转动画)
|
|
1003
|
+
*/
|
|
1004
|
+
isFinished?: boolean;
|
|
1005
|
+
/**
|
|
1006
|
+
* GO 按钮是否禁用
|
|
1007
|
+
*/
|
|
1008
|
+
isButtonDisabled: boolean;
|
|
1009
|
+
/**
|
|
1010
|
+
* GO 按钮点击回调
|
|
1011
|
+
*/
|
|
1012
|
+
onGoClick: () => void;
|
|
1013
|
+
/**
|
|
1014
|
+
* 转盘底图 URL(可选)
|
|
1015
|
+
*/
|
|
1016
|
+
wheelBackgroundImage?: string;
|
|
1017
|
+
/**
|
|
1018
|
+
* 转盘指针图片 URL(可选)
|
|
1019
|
+
*/
|
|
1020
|
+
pointerImage?: string;
|
|
1021
|
+
/**
|
|
1022
|
+
* 登录用户数据(可选)
|
|
1023
|
+
* @optional
|
|
1024
|
+
*/
|
|
1025
|
+
userData?: UserData;
|
|
1026
|
+
/**
|
|
1027
|
+
* 打开分享弹窗回调(可选)
|
|
1028
|
+
* @optional
|
|
1029
|
+
*/
|
|
1030
|
+
onOpenShareModal?: () => void;
|
|
1031
|
+
/**
|
|
1032
|
+
* 自定义类名
|
|
1033
|
+
*/
|
|
1034
|
+
className?: string;
|
|
1035
|
+
}
|
|
1036
|
+
/**
|
|
1037
|
+
* PrizePool 奖品池组件 Props
|
|
1038
|
+
*/
|
|
1039
|
+
export interface PrizePoolProps {
|
|
1040
|
+
/**
|
|
1041
|
+
* 主题模式
|
|
1042
|
+
* @optional
|
|
1043
|
+
*/
|
|
1044
|
+
theme?: Theme;
|
|
1045
|
+
/**
|
|
1046
|
+
* 奖品列表(通常是全部 8 个奖品)
|
|
1047
|
+
*/
|
|
1048
|
+
prizes: Prize[];
|
|
1049
|
+
/**
|
|
1050
|
+
* 标题文本
|
|
1051
|
+
* @default "Prize Pool"
|
|
1052
|
+
*/
|
|
1053
|
+
title?: string;
|
|
1054
|
+
/**
|
|
1055
|
+
* 中奖人名单数据
|
|
1056
|
+
* @optional
|
|
1057
|
+
*/
|
|
1058
|
+
winningInfos?: WinningInfo[];
|
|
1059
|
+
/**
|
|
1060
|
+
* 自定义类名
|
|
1061
|
+
*/
|
|
1062
|
+
className?: string;
|
|
1063
|
+
}
|
|
1064
|
+
/**
|
|
1065
|
+
* ChanceMethods 获取机会组件 Props
|
|
1066
|
+
*/
|
|
1067
|
+
export interface ChanceMethodsProps {
|
|
1068
|
+
/**
|
|
1069
|
+
* 主题模式
|
|
1070
|
+
* @optional
|
|
1071
|
+
*/
|
|
1072
|
+
theme?: Theme;
|
|
1073
|
+
/**
|
|
1074
|
+
* 获取机会方式列表
|
|
1075
|
+
*/
|
|
1076
|
+
methods: ChanceMethod[];
|
|
1077
|
+
/**
|
|
1078
|
+
* 标题文本
|
|
1079
|
+
* @default "Want more chances to win?"
|
|
1080
|
+
*/
|
|
1081
|
+
title?: string;
|
|
1082
|
+
/**
|
|
1083
|
+
* 副标题(可选)
|
|
1084
|
+
*/
|
|
1085
|
+
subtitle?: string;
|
|
1086
|
+
/**
|
|
1087
|
+
* 底部提示文本(可选)
|
|
1088
|
+
*/
|
|
1089
|
+
footerNote?: string;
|
|
1090
|
+
/**
|
|
1091
|
+
* 登录用户数据(可选)
|
|
1092
|
+
* @optional
|
|
1093
|
+
*/
|
|
1094
|
+
userData?: UserData;
|
|
1095
|
+
/**
|
|
1096
|
+
* 打开分享弹窗回调(可选)
|
|
1097
|
+
* @optional
|
|
1098
|
+
*/
|
|
1099
|
+
onOpenShareModal?: () => void;
|
|
1100
|
+
/**
|
|
1101
|
+
* 徽章文案
|
|
1102
|
+
* @default "Chance +1"
|
|
1103
|
+
*/
|
|
1104
|
+
chanceBadgeText?: string;
|
|
1105
|
+
/**
|
|
1106
|
+
* 已完成状态文案
|
|
1107
|
+
* @default "Completed"
|
|
1108
|
+
*/
|
|
1109
|
+
completedText?: string;
|
|
1110
|
+
/**
|
|
1111
|
+
* 已使用状态文案
|
|
1112
|
+
* @default "Used"
|
|
1113
|
+
*/
|
|
1114
|
+
usedText?: string;
|
|
1115
|
+
/**
|
|
1116
|
+
* 加载中文案
|
|
1117
|
+
* @default "Loading..."
|
|
1118
|
+
*/
|
|
1119
|
+
loadingText?: string;
|
|
1120
|
+
/**
|
|
1121
|
+
* 自定义类名
|
|
1122
|
+
*/
|
|
1123
|
+
className?: string;
|
|
1124
|
+
}
|
|
1125
|
+
/**
|
|
1126
|
+
* WinnerModal 中奖弹窗组件 Props
|
|
1127
|
+
*/
|
|
1128
|
+
export interface WinnerModalProps extends CopyTextConfig, CouponConfig, PrizeTimeTextConfig {
|
|
1129
|
+
/**
|
|
1130
|
+
* 是否显示弹窗
|
|
1131
|
+
*/
|
|
1132
|
+
isOpen: boolean;
|
|
1133
|
+
/**
|
|
1134
|
+
* 中奖奖品信息
|
|
1135
|
+
*/
|
|
1136
|
+
prize: Prize | null;
|
|
1137
|
+
/**
|
|
1138
|
+
* 弹窗标题(可选,默认 "You Have Won")
|
|
1139
|
+
*/
|
|
1140
|
+
title?: string;
|
|
1141
|
+
/**
|
|
1142
|
+
* 奖品标题(可选,默认使用 prize.name)
|
|
1143
|
+
*/
|
|
1144
|
+
prizeTitle?: string;
|
|
1145
|
+
/**
|
|
1146
|
+
* 奖品图片 URL(可选,默认使用 prize.image)
|
|
1147
|
+
*/
|
|
1148
|
+
prizeImage?: string;
|
|
1149
|
+
/**
|
|
1150
|
+
* 奖品详情描述(可选)
|
|
1151
|
+
*/
|
|
1152
|
+
prizeDescription?: string;
|
|
1153
|
+
/**
|
|
1154
|
+
* Learn More 链接(可选)
|
|
1155
|
+
*/
|
|
1156
|
+
learnMoreUrl?: string;
|
|
1157
|
+
/**
|
|
1158
|
+
* Learn More 按钮文本(可选,默认 "Learn More")
|
|
1159
|
+
*/
|
|
1160
|
+
learnMoreText?: string;
|
|
1161
|
+
/**
|
|
1162
|
+
* 复制码点击回调
|
|
1163
|
+
*/
|
|
1164
|
+
onCopyCode?: (code: string) => void;
|
|
1165
|
+
/**
|
|
1166
|
+
* 关闭弹窗回调
|
|
1167
|
+
*/
|
|
1168
|
+
onClose: () => void;
|
|
1169
|
+
/**
|
|
1170
|
+
* 确认按钮文本(可选,默认 "Okay, Got It")
|
|
1171
|
+
*/
|
|
1172
|
+
confirmText?: string;
|
|
1173
|
+
/**
|
|
1174
|
+
* 确认按钮点击回调(可选)
|
|
1175
|
+
*/
|
|
1176
|
+
onConfirm?: () => void;
|
|
1177
|
+
/**
|
|
1178
|
+
* 自定义类名
|
|
1179
|
+
*/
|
|
1180
|
+
className?: string;
|
|
1181
|
+
}
|
|
1182
|
+
/**
|
|
1183
|
+
* 验证结果
|
|
1184
|
+
*/
|
|
1185
|
+
export interface ValidationResult {
|
|
1186
|
+
valid: boolean;
|
|
1187
|
+
error?: string;
|
|
1188
|
+
}
|
|
1189
|
+
/**
|
|
1190
|
+
* 奖品验证选项
|
|
1191
|
+
*/
|
|
1192
|
+
export interface ValidatePrizesOptions {
|
|
1193
|
+
/**
|
|
1194
|
+
* 是否允许缺少 rank 字段
|
|
1195
|
+
* @default true
|
|
1196
|
+
*/
|
|
1197
|
+
allowMissingRank?: boolean;
|
|
1198
|
+
/**
|
|
1199
|
+
* 是否允许缺少 price 字段
|
|
1200
|
+
* @default true
|
|
1201
|
+
*/
|
|
1202
|
+
allowMissingPrice?: boolean;
|
|
1203
|
+
}
|
|
1204
|
+
/**
|
|
1205
|
+
* 检查是否为有效的 Prize 对象
|
|
1206
|
+
* @param value 待检查的值
|
|
1207
|
+
* @returns 是否为有效的 Prize
|
|
1208
|
+
*/
|
|
1209
|
+
export declare function isPrize(value: unknown): value is Prize;
|
|
1210
|
+
/**
|
|
1211
|
+
* 检查是否为有效的 ChanceMethod 对象
|
|
1212
|
+
* @param value 待检查的值
|
|
1213
|
+
* @returns 是否为有效的 ChanceMethod
|
|
1214
|
+
*/
|
|
1215
|
+
export declare function isChanceMethod(value: unknown): value is ChanceMethod;
|
|
1216
|
+
/**
|
|
1217
|
+
* 检查是否为有效的 WinningInfo 对象
|
|
1218
|
+
* @param value 待检查的值
|
|
1219
|
+
* @returns 是否为有效的 WinningInfo
|
|
1220
|
+
*/
|
|
1221
|
+
export declare function isWinningInfo(value: unknown): value is WinningInfo;
|
|
1222
|
+
/**
|
|
1223
|
+
* 抽奖回调函数类型
|
|
1224
|
+
*/
|
|
1225
|
+
export type OnSpinEndCallback = (prize: Prize) => void;
|
|
1226
|
+
/**
|
|
1227
|
+
* 获取机会点击回调函数类型
|
|
1228
|
+
*/
|
|
1229
|
+
export type OnChanceMethodClick = () => void;
|