@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.
- package/dist/cjs/biz-components/ActiveShelf/index.d.ts +2 -2
- package/dist/cjs/biz-components/ActiveShelf/index.js +1 -1
- package/dist/cjs/biz-components/ActiveShelf/index.js.map +3 -3
- package/dist/cjs/biz-components/EventSchedule/index.d.ts +2 -7
- package/dist/cjs/biz-components/EventSchedule/index.js +1 -1
- package/dist/cjs/biz-components/EventSchedule/index.js.map +3 -3
- package/dist/cjs/biz-components/FeaturedBlogPosts/index.d.ts +1 -6
- package/dist/cjs/biz-components/FeaturedBlogPosts/index.js +1 -1
- package/dist/cjs/biz-components/FeaturedBlogPosts/index.js.map +3 -3
- 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/ImageOverlayShelf/index.d.ts +2 -2
- package/dist/cjs/biz-components/ImageOverlayShelf/index.js +1 -1
- package/dist/cjs/biz-components/ImageOverlayShelf/index.js.map +3 -3
- package/dist/cjs/biz-components/LotteryShared/BaseModal.d.ts +61 -0
- package/dist/cjs/biz-components/LotteryShared/BaseModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/BaseModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/ChanceMethods.d.ts +25 -0
- package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/ChanceMethods.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/ErrorModal.d.ts +47 -0
- package/dist/cjs/biz-components/LotteryShared/ErrorModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/ErrorModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.d.ts +101 -0
- package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/PrizePool.d.ts +29 -0
- package/dist/cjs/biz-components/LotteryShared/PrizePool.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/PrizePool.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/RulesModal.d.ts +56 -0
- package/dist/cjs/biz-components/LotteryShared/RulesModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/RulesModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/ShareModal.d.ts +79 -0
- package/dist/cjs/biz-components/LotteryShared/ShareModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/ShareModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/WinnerModal.d.ts +27 -0
- package/dist/cjs/biz-components/LotteryShared/WinnerModal.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/WinnerModal.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/index.d.ts +23 -0
- package/dist/cjs/biz-components/LotteryShared/index.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/index.js.map +7 -0
- package/dist/cjs/biz-components/LotteryShared/types.d.ts +760 -0
- package/dist/cjs/biz-components/LotteryShared/types.js +2 -0
- package/dist/cjs/biz-components/LotteryShared/types.js.map +7 -0
- package/dist/cjs/biz-components/MediaEndorsement/index.js +2 -2
- package/dist/cjs/biz-components/MediaEndorsement/index.js.map +2 -2
- package/dist/cjs/biz-components/MediaShelf/index.d.ts +2 -2
- package/dist/cjs/biz-components/MediaShelf/index.js +1 -1
- package/dist/cjs/biz-components/MediaShelf/index.js.map +3 -3
- package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.d.ts +4 -0
- package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.js +2 -0
- package/dist/cjs/biz-components/ProductLottery/MediaDrawArea.js.map +7 -0
- package/dist/cjs/biz-components/ProductLottery/index.d.ts +17 -0
- package/dist/cjs/biz-components/ProductLottery/index.js +2 -0
- package/dist/cjs/biz-components/ProductLottery/index.js.map +7 -0
- package/dist/cjs/biz-components/ProductLottery/types.d.ts +363 -0
- package/dist/cjs/biz-components/ProductLottery/types.js +2 -0
- package/dist/cjs/biz-components/ProductLottery/types.js.map +7 -0
- package/dist/cjs/biz-components/Specs/index.js +1 -1
- package/dist/cjs/biz-components/Specs/index.js.map +3 -3
- package/dist/cjs/biz-components/WheelLottery/index.d.ts +11 -11
- package/dist/cjs/biz-components/WheelLottery/index.js +1 -1
- package/dist/cjs/biz-components/WheelLottery/index.js.map +3 -3
- package/dist/cjs/biz-components/WheelLottery/types.d.ts +17 -723
- package/dist/cjs/biz-components/WheelLottery/types.js +1 -1
- package/dist/cjs/biz-components/WheelLottery/types.js.map +3 -3
- package/dist/cjs/biz-components/index.d.ts +2 -0
- package/dist/cjs/biz-components/index.js +1 -1
- package/dist/cjs/biz-components/index.js.map +3 -3
- package/dist/esm/biz-components/ActiveShelf/index.d.ts +2 -2
- package/dist/esm/biz-components/ActiveShelf/index.js +1 -1
- package/dist/esm/biz-components/ActiveShelf/index.js.map +3 -3
- package/dist/esm/biz-components/EventSchedule/index.d.ts +2 -7
- 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/FeaturedBlogPosts/index.d.ts +1 -6
- package/dist/esm/biz-components/FeaturedBlogPosts/index.js +1 -1
- package/dist/esm/biz-components/FeaturedBlogPosts/index.js.map +3 -3
- 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/ImageOverlayShelf/index.d.ts +2 -2
- package/dist/esm/biz-components/ImageOverlayShelf/index.js +1 -1
- package/dist/esm/biz-components/ImageOverlayShelf/index.js.map +3 -3
- package/dist/esm/biz-components/LotteryShared/BaseModal.d.ts +61 -0
- package/dist/esm/biz-components/LotteryShared/BaseModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/BaseModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/ChanceMethods.d.ts +25 -0
- package/dist/esm/biz-components/LotteryShared/ChanceMethods.js +2 -0
- package/dist/esm/biz-components/LotteryShared/ChanceMethods.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/ErrorModal.d.ts +47 -0
- package/dist/esm/biz-components/LotteryShared/ErrorModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/ErrorModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/MyRewardsModal.d.ts +101 -0
- package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/PrizePool.d.ts +29 -0
- package/dist/esm/biz-components/LotteryShared/PrizePool.js +2 -0
- package/dist/esm/biz-components/LotteryShared/PrizePool.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/RulesModal.d.ts +56 -0
- package/dist/esm/biz-components/LotteryShared/RulesModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/RulesModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/ShareModal.d.ts +79 -0
- package/dist/esm/biz-components/LotteryShared/ShareModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/ShareModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/WinnerModal.d.ts +27 -0
- package/dist/esm/biz-components/LotteryShared/WinnerModal.js +2 -0
- package/dist/esm/biz-components/LotteryShared/WinnerModal.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/index.d.ts +23 -0
- package/dist/esm/biz-components/LotteryShared/index.js +2 -0
- package/dist/esm/biz-components/LotteryShared/index.js.map +7 -0
- package/dist/esm/biz-components/LotteryShared/types.d.ts +760 -0
- package/dist/esm/biz-components/LotteryShared/types.js +2 -0
- package/dist/esm/biz-components/LotteryShared/types.js.map +7 -0
- package/dist/esm/biz-components/MediaEndorsement/index.js +2 -2
- package/dist/esm/biz-components/MediaEndorsement/index.js.map +3 -3
- package/dist/esm/biz-components/MediaShelf/index.d.ts +2 -2
- package/dist/esm/biz-components/MediaShelf/index.js +1 -1
- package/dist/esm/biz-components/MediaShelf/index.js.map +3 -3
- package/dist/esm/biz-components/ProductLottery/MediaDrawArea.d.ts +4 -0
- package/dist/esm/biz-components/ProductLottery/MediaDrawArea.js +2 -0
- package/dist/esm/biz-components/ProductLottery/MediaDrawArea.js.map +7 -0
- package/dist/esm/biz-components/ProductLottery/index.d.ts +17 -0
- package/dist/esm/biz-components/ProductLottery/index.js +2 -0
- package/dist/esm/biz-components/ProductLottery/index.js.map +7 -0
- package/dist/esm/biz-components/ProductLottery/types.d.ts +363 -0
- package/dist/esm/biz-components/ProductLottery/types.js +2 -0
- package/dist/esm/biz-components/ProductLottery/types.js.map +7 -0
- package/dist/esm/biz-components/Specs/index.js +1 -1
- package/dist/esm/biz-components/Specs/index.js.map +3 -3
- package/dist/esm/biz-components/WheelLottery/index.d.ts +11 -11
- package/dist/esm/biz-components/WheelLottery/index.js +1 -1
- package/dist/esm/biz-components/WheelLottery/index.js.map +3 -3
- package/dist/esm/biz-components/WheelLottery/types.d.ts +17 -723
- package/dist/esm/biz-components/WheelLottery/types.js +1 -1
- package/dist/esm/biz-components/WheelLottery/types.js.map +3 -3
- package/dist/esm/biz-components/index.d.ts +2 -0
- package/dist/esm/biz-components/index.js +1 -1
- package/dist/esm/biz-components/index.js.map +2 -2
- package/package.json +1 -1
- package/style.css +77 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProductLottery - 产品抽奖组件类型定义
|
|
3
|
+
*
|
|
4
|
+
* 基于媒体展示(图片/视频)的抽奖组件,点击 CTA 按钮触发抽奖。
|
|
5
|
+
* 共享类型来自 LotteryShared/types.ts。
|
|
6
|
+
*
|
|
7
|
+
* @module ProductLotteryTypes
|
|
8
|
+
* @date 2026-04-07
|
|
9
|
+
*/
|
|
10
|
+
import type { Prize, WinnerModalConfig, ShareModalConfig, ChanceMethod, WinningInfo, RulesModalConfig, MyRewardsModalConfig, ErrorModalConfig, UserData, ChanceMechanismType, ChanceInputConfig } from '../LotteryShared/types.js';
|
|
11
|
+
import type { Theme } from '../../types/props.js';
|
|
12
|
+
export type { Theme };
|
|
13
|
+
/**
|
|
14
|
+
* 响应式媒体资源
|
|
15
|
+
*
|
|
16
|
+
* 支持按断点配置不同的媒体资源 URL,实现响应式加载。
|
|
17
|
+
* 断点: tablet(768), laptop(1025), desktop(1440), lg-desktop(1920) — min-width
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* const media: ResponsiveMedia = {
|
|
22
|
+
* default: '/images/banner-mobile.jpg',
|
|
23
|
+
* tablet: '/images/banner-tablet.jpg',
|
|
24
|
+
* laptop: '/images/banner-laptop.jpg',
|
|
25
|
+
* desktop: '/images/banner-desktop.jpg',
|
|
26
|
+
* lgDesktop: '/images/banner-lg.jpg',
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export interface ResponsiveMedia {
|
|
31
|
+
/** 默认资源(移动端 <768px) */
|
|
32
|
+
default: string;
|
|
33
|
+
/** 平板资源 ≥768px */
|
|
34
|
+
tablet?: string;
|
|
35
|
+
/** 小桌面资源 ≥1025px */
|
|
36
|
+
laptop?: string;
|
|
37
|
+
/** 大桌面资源 ≥1440px */
|
|
38
|
+
desktop?: string;
|
|
39
|
+
/** 超大屏资源 ≥1920px */
|
|
40
|
+
lgDesktop?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 媒体配置(MediaConfig)
|
|
44
|
+
*
|
|
45
|
+
* 配置抽奖区域的媒体展示,支持图片和视频两种类型。
|
|
46
|
+
* 图片支持响应式断点加载不同尺寸。
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```tsx
|
|
50
|
+
* // 图片模式(简单)
|
|
51
|
+
* const imageMedia: MediaConfig = {
|
|
52
|
+
* type: 'image',
|
|
53
|
+
* src: 'https://cdn.example.com/banner.jpg',
|
|
54
|
+
* alt: 'Product Lottery Banner',
|
|
55
|
+
* }
|
|
56
|
+
*
|
|
57
|
+
* // 图片模式(响应式)
|
|
58
|
+
* const responsiveMedia: MediaConfig = {
|
|
59
|
+
* type: 'image',
|
|
60
|
+
* src: {
|
|
61
|
+
* default: '/images/banner-sm.jpg',
|
|
62
|
+
* tablet: '/images/banner-md.jpg',
|
|
63
|
+
* desktop: '/images/banner-lg.jpg',
|
|
64
|
+
* },
|
|
65
|
+
* alt: 'Product Lottery Banner',
|
|
66
|
+
* }
|
|
67
|
+
*
|
|
68
|
+
* // 视频模式
|
|
69
|
+
* const videoMedia: MediaConfig = {
|
|
70
|
+
* type: 'video',
|
|
71
|
+
* src: 'https://cdn.example.com/promo.mp4',
|
|
72
|
+
* poster: 'https://cdn.example.com/poster.jpg',
|
|
73
|
+
* autoPlay: true,
|
|
74
|
+
* muted: true,
|
|
75
|
+
* loop: true,
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export interface MediaConfig {
|
|
80
|
+
/** 媒体类型 */
|
|
81
|
+
type: 'image' | 'video';
|
|
82
|
+
/**
|
|
83
|
+
* 媒体资源 URL
|
|
84
|
+
* - 字符串:单一资源
|
|
85
|
+
* - ResponsiveMedia:响应式多资源
|
|
86
|
+
*/
|
|
87
|
+
src: string | ResponsiveMedia;
|
|
88
|
+
/**
|
|
89
|
+
* 视频封面图 URL(仅 type='video' 时有效)
|
|
90
|
+
* @optional
|
|
91
|
+
*/
|
|
92
|
+
poster?: string;
|
|
93
|
+
/**
|
|
94
|
+
* 是否自动播放(仅 type='video' 时有效)
|
|
95
|
+
* @default true
|
|
96
|
+
* @optional
|
|
97
|
+
*/
|
|
98
|
+
autoPlay?: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* 是否静音(仅 type='video' 时有效)
|
|
101
|
+
* @default true
|
|
102
|
+
* @optional
|
|
103
|
+
*/
|
|
104
|
+
muted?: boolean;
|
|
105
|
+
/**
|
|
106
|
+
* 是否循环播放(仅 type='video' 时有效)
|
|
107
|
+
* @default true
|
|
108
|
+
* @optional
|
|
109
|
+
*/
|
|
110
|
+
loop?: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* 图片替代文本(无障碍)
|
|
113
|
+
* @optional
|
|
114
|
+
*/
|
|
115
|
+
alt?: string;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* CTA 按钮配置(CtaButtonConfig)
|
|
119
|
+
*
|
|
120
|
+
* 配置覆盖在媒体区域上的行动号召按钮。
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```tsx
|
|
124
|
+
* const ctaButton: CtaButtonConfig = {
|
|
125
|
+
* text: 'Join the Draw',
|
|
126
|
+
* style: 'primary',
|
|
127
|
+
* }
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
export interface CtaButtonConfig {
|
|
131
|
+
/**
|
|
132
|
+
* 按钮文案
|
|
133
|
+
* @default "Join the Draw"
|
|
134
|
+
* @optional
|
|
135
|
+
*/
|
|
136
|
+
text?: string;
|
|
137
|
+
/**
|
|
138
|
+
* 按钮样式
|
|
139
|
+
* @default "primary"
|
|
140
|
+
* @optional
|
|
141
|
+
*/
|
|
142
|
+
style?: 'primary' | 'secondary' | 'outline';
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* ProductLottery 组件命令式控制接口
|
|
146
|
+
*
|
|
147
|
+
* 通过 ref 暴露给父组件,用于外部控制弹窗等状态。
|
|
148
|
+
* 与 WheelLotteryHandle 保持一致的弹窗控制方法。
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```tsx
|
|
152
|
+
* const lotteryRef = useRef<ProductLotteryHandle>(null)
|
|
153
|
+
*
|
|
154
|
+
* <ProductLottery ref={lotteryRef} prizes={prizes} media={media} />
|
|
155
|
+
*
|
|
156
|
+
* // 外部触发错误弹窗
|
|
157
|
+
* lotteryRef.current?.showError({
|
|
158
|
+
* title: 'Network Error',
|
|
159
|
+
* message: 'Failed to connect to server',
|
|
160
|
+
* confirmText: 'Retry'
|
|
161
|
+
* })
|
|
162
|
+
*
|
|
163
|
+
* // 显示规则弹窗
|
|
164
|
+
* lotteryRef.current?.showRules()
|
|
165
|
+
*
|
|
166
|
+
* // 关闭所有弹窗
|
|
167
|
+
* lotteryRef.current?.hideAllModals()
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
export interface ProductLotteryHandle {
|
|
171
|
+
/** 显示错误弹窗 */
|
|
172
|
+
showError: (config: {
|
|
173
|
+
message: string;
|
|
174
|
+
title?: string;
|
|
175
|
+
confirmText?: string;
|
|
176
|
+
}) => void;
|
|
177
|
+
/** 隐藏错误弹窗 */
|
|
178
|
+
hideError: () => void;
|
|
179
|
+
/** 显示未中奖弹窗 */
|
|
180
|
+
showNoWin: (config?: {
|
|
181
|
+
title?: string;
|
|
182
|
+
message?: string;
|
|
183
|
+
confirmText?: string;
|
|
184
|
+
}) => void;
|
|
185
|
+
/** 隐藏未中奖弹窗 */
|
|
186
|
+
hideNoWin: () => void;
|
|
187
|
+
/** 显示中奖弹窗 */
|
|
188
|
+
showWinner: (prize: Prize, config?: Partial<WinnerModalConfig>) => void;
|
|
189
|
+
/** 隐藏中奖弹窗 */
|
|
190
|
+
hideWinner: () => void;
|
|
191
|
+
/** 显示规则弹窗 */
|
|
192
|
+
showRules: () => void;
|
|
193
|
+
/** 隐藏规则弹窗 */
|
|
194
|
+
hideRules: () => void;
|
|
195
|
+
/** 显示我的奖励弹窗 */
|
|
196
|
+
showRewards: () => void;
|
|
197
|
+
/** 隐藏我的奖励弹窗 */
|
|
198
|
+
hideRewards: () => void;
|
|
199
|
+
/** 显示分享弹窗 */
|
|
200
|
+
showShare: (config?: Partial<ShareModalConfig>) => void;
|
|
201
|
+
/** 隐藏分享弹窗 */
|
|
202
|
+
hideShare: () => void;
|
|
203
|
+
/** 关闭所有弹窗 */
|
|
204
|
+
hideAllModals: () => void;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* MediaDrawArea 子组件 Props
|
|
208
|
+
*
|
|
209
|
+
* 媒体抽奖区域,展示图片/视频并叠加 CTA 按钮。
|
|
210
|
+
*/
|
|
211
|
+
export interface MediaDrawAreaProps {
|
|
212
|
+
/** 主题模式 */
|
|
213
|
+
theme?: Theme;
|
|
214
|
+
/** 媒体配置(必需) */
|
|
215
|
+
media: MediaConfig;
|
|
216
|
+
/** CTA 按钮配置 */
|
|
217
|
+
ctaButton?: CtaButtonConfig;
|
|
218
|
+
/** 是否正在抽奖中 */
|
|
219
|
+
isDrawing?: boolean;
|
|
220
|
+
/** 是否禁用(未登录或无次数) */
|
|
221
|
+
isDisabled?: boolean;
|
|
222
|
+
/** 点击抽奖回调 */
|
|
223
|
+
onClick: () => void;
|
|
224
|
+
/** 自定义类名 */
|
|
225
|
+
className?: string;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* ProductLottery 组件 Props
|
|
229
|
+
*
|
|
230
|
+
* 基于媒体展示的产品抽奖组件。左侧为可点击的媒体区域(图片/视频),
|
|
231
|
+
* 右侧为获取机会区域,底部为奖品池。
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```tsx
|
|
235
|
+
* <ProductLottery
|
|
236
|
+
* prizes={prizes}
|
|
237
|
+
* media={{ type: 'image', src: '/banner.jpg', alt: 'Lottery' }}
|
|
238
|
+
* ctaButton={{ text: 'Draw Now' }}
|
|
239
|
+
* onDrawStart={async () => {
|
|
240
|
+
* const result = await fetch('/api/lottery')
|
|
241
|
+
* const data = await result.json()
|
|
242
|
+
* return data.prizeId
|
|
243
|
+
* }}
|
|
244
|
+
* onDrawEnd={(prize) => console.log('Won:', prize.name)}
|
|
245
|
+
* />
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
export interface ProductLotteryProps {
|
|
249
|
+
/**
|
|
250
|
+
* 8 个奖品数组(必需)
|
|
251
|
+
* @minLength 8
|
|
252
|
+
* @maxLength 8
|
|
253
|
+
*/
|
|
254
|
+
prizes: Prize[];
|
|
255
|
+
/**
|
|
256
|
+
* 媒体配置(必需)
|
|
257
|
+
* 配置左侧抽奖区域展示的图片或视频
|
|
258
|
+
*/
|
|
259
|
+
media: MediaConfig;
|
|
260
|
+
/** 主题模式 */
|
|
261
|
+
theme?: Theme;
|
|
262
|
+
/** CTA 按钮配置 */
|
|
263
|
+
ctaButton?: CtaButtonConfig;
|
|
264
|
+
/**
|
|
265
|
+
* 获取机会方式数组
|
|
266
|
+
* @optional
|
|
267
|
+
*/
|
|
268
|
+
chanceMethods?: ChanceMethod[];
|
|
269
|
+
/**
|
|
270
|
+
* 获取机会区域机制类型
|
|
271
|
+
* @default "methods"
|
|
272
|
+
* @optional
|
|
273
|
+
*/
|
|
274
|
+
mechanismType?: ChanceMechanismType;
|
|
275
|
+
/**
|
|
276
|
+
* 输入框配置(当 mechanismType 为 'input' 时使用)
|
|
277
|
+
* @optional
|
|
278
|
+
*/
|
|
279
|
+
inputConfig?: ChanceInputConfig;
|
|
280
|
+
/**
|
|
281
|
+
* 获取机会区域标题
|
|
282
|
+
* @default "Want more chances to win?"
|
|
283
|
+
* @optional
|
|
284
|
+
*/
|
|
285
|
+
chanceTitle?: string;
|
|
286
|
+
/** 获取机会区域副标题 */
|
|
287
|
+
chanceSubtitle?: string;
|
|
288
|
+
/** 获取机会区域底部提示 */
|
|
289
|
+
chanceFooterNote?: string;
|
|
290
|
+
/** 获取机会方式文案配置 */
|
|
291
|
+
chanceMethodsText?: {
|
|
292
|
+
chanceBadgeText?: string;
|
|
293
|
+
completedText?: string;
|
|
294
|
+
usedText?: string;
|
|
295
|
+
loadingText?: string;
|
|
296
|
+
};
|
|
297
|
+
/**
|
|
298
|
+
* 中奖信息数组,用于底部滚动条展示
|
|
299
|
+
* @default []
|
|
300
|
+
*/
|
|
301
|
+
winningInfos?: WinningInfo[];
|
|
302
|
+
/** 奖品池展示区域标题 */
|
|
303
|
+
prizesTitle?: string;
|
|
304
|
+
/**
|
|
305
|
+
* 抽奖开始时的回调,返回 Promise 以支持异步接口调用
|
|
306
|
+
* @returns Promise<string> - 中奖奖品的 prizeKey
|
|
307
|
+
*/
|
|
308
|
+
onDrawStart?: () => Promise<string>;
|
|
309
|
+
/**
|
|
310
|
+
* 抽奖结束时的回调,传递中奖奖品
|
|
311
|
+
* @param prize 中奖奖品对象
|
|
312
|
+
*/
|
|
313
|
+
onDrawEnd?: (prize: Prize) => void;
|
|
314
|
+
/**
|
|
315
|
+
* 抽奖错误时的回调
|
|
316
|
+
* @param error 错误信息
|
|
317
|
+
*/
|
|
318
|
+
onDrawError?: (error: Error) => void;
|
|
319
|
+
/** 中奖弹窗配置 */
|
|
320
|
+
winnerModalConfig?: WinnerModalConfig;
|
|
321
|
+
/** 规则弹窗配置 */
|
|
322
|
+
rulesModalConfig?: RulesModalConfig;
|
|
323
|
+
/** 我的奖励弹窗配置 */
|
|
324
|
+
myRewardsModalConfig?: MyRewardsModalConfig;
|
|
325
|
+
/** 错误弹窗配置 */
|
|
326
|
+
errorModalConfig?: ErrorModalConfig;
|
|
327
|
+
/** 分享弹窗配置 */
|
|
328
|
+
shareModalConfig?: ShareModalConfig;
|
|
329
|
+
/** 用户数据 */
|
|
330
|
+
userData?: UserData;
|
|
331
|
+
/**
|
|
332
|
+
* 未登录时的提示文案
|
|
333
|
+
* @default "Please log in to participate"
|
|
334
|
+
*/
|
|
335
|
+
loginPromptText?: string;
|
|
336
|
+
/**
|
|
337
|
+
* 登录按钮文案
|
|
338
|
+
* @default "Log In"
|
|
339
|
+
*/
|
|
340
|
+
loginButtonText?: string;
|
|
341
|
+
/**
|
|
342
|
+
* 次数不足时的提示文案
|
|
343
|
+
* @default "You have no chances left"
|
|
344
|
+
*/
|
|
345
|
+
noChancesText?: string;
|
|
346
|
+
/**
|
|
347
|
+
* 未登录时点击抽奖的回调
|
|
348
|
+
*/
|
|
349
|
+
onLoginRequired?: () => void;
|
|
350
|
+
/** 复制优惠码回调 */
|
|
351
|
+
onCopyCode?: (code: string) => void;
|
|
352
|
+
/**
|
|
353
|
+
* 机会进度文案
|
|
354
|
+
* @default ["Number of draws remaining today:"]
|
|
355
|
+
*/
|
|
356
|
+
opportunitiesText?: string[];
|
|
357
|
+
/** 自定义 CSS 类名 */
|
|
358
|
+
className?: string;
|
|
359
|
+
}
|
|
360
|
+
/** 默认 CTA 按钮配置 */
|
|
361
|
+
export declare const DEFAULT_CTA_BUTTON: CtaButtonConfig;
|
|
362
|
+
/** 默认获取机会区域标题 */
|
|
363
|
+
export declare const DEFAULT_CHANCE_TITLE = "Want more chances to win?";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/biz-components/ProductLottery/types.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * ProductLottery - \u4EA7\u54C1\u62BD\u5956\u7EC4\u4EF6\u7C7B\u578B\u5B9A\u4E49\n *\n * \u57FA\u4E8E\u5A92\u4F53\u5C55\u793A\uFF08\u56FE\u7247/\u89C6\u9891\uFF09\u7684\u62BD\u5956\u7EC4\u4EF6\uFF0C\u70B9\u51FB CTA \u6309\u94AE\u89E6\u53D1\u62BD\u5956\u3002\n * \u5171\u4EAB\u7C7B\u578B\u6765\u81EA LotteryShared/types.ts\u3002\n *\n * @module ProductLotteryTypes\n * @date 2026-04-07\n */\n\nimport type {\n Prize,\n WinnerModalConfig,\n ShareModalConfig,\n ChanceMethod,\n WinningInfo,\n RulesModalConfig,\n MyRewardsModalConfig,\n ErrorModalConfig,\n UserData,\n ChanceMechanismType,\n ChanceInputConfig,\n} from '../LotteryShared/types.js'\n\nimport type { Theme } from '../../types/props.js'\n\n// Re-export shared types for convenience\nexport type { Theme }\n\n// ============================================================================\n// \u5A92\u4F53\u914D\u7F6E\u7C7B\u578B\n// ============================================================================\n\n/**\n * \u54CD\u5E94\u5F0F\u5A92\u4F53\u8D44\u6E90\n *\n * \u652F\u6301\u6309\u65AD\u70B9\u914D\u7F6E\u4E0D\u540C\u7684\u5A92\u4F53\u8D44\u6E90 URL\uFF0C\u5B9E\u73B0\u54CD\u5E94\u5F0F\u52A0\u8F7D\u3002\n * \u65AD\u70B9: tablet(768), laptop(1025), desktop(1440), lg-desktop(1920) \u2014 min-width\n *\n * @example\n * ```tsx\n * const media: ResponsiveMedia = {\n * default: '/images/banner-mobile.jpg',\n * tablet: '/images/banner-tablet.jpg',\n * laptop: '/images/banner-laptop.jpg',\n * desktop: '/images/banner-desktop.jpg',\n * lgDesktop: '/images/banner-lg.jpg',\n * }\n * ```\n */\nexport interface ResponsiveMedia {\n /** \u9ED8\u8BA4\u8D44\u6E90\uFF08\u79FB\u52A8\u7AEF <768px\uFF09 */\n default: string\n /** \u5E73\u677F\u8D44\u6E90 \u2265768px */\n tablet?: string\n /** \u5C0F\u684C\u9762\u8D44\u6E90 \u22651025px */\n laptop?: string\n /** \u5927\u684C\u9762\u8D44\u6E90 \u22651440px */\n desktop?: string\n /** \u8D85\u5927\u5C4F\u8D44\u6E90 \u22651920px */\n lgDesktop?: string\n}\n\n/**\n * \u5A92\u4F53\u914D\u7F6E\uFF08MediaConfig\uFF09\n *\n * \u914D\u7F6E\u62BD\u5956\u533A\u57DF\u7684\u5A92\u4F53\u5C55\u793A\uFF0C\u652F\u6301\u56FE\u7247\u548C\u89C6\u9891\u4E24\u79CD\u7C7B\u578B\u3002\n * \u56FE\u7247\u652F\u6301\u54CD\u5E94\u5F0F\u65AD\u70B9\u52A0\u8F7D\u4E0D\u540C\u5C3A\u5BF8\u3002\n *\n * @example\n * ```tsx\n * // \u56FE\u7247\u6A21\u5F0F\uFF08\u7B80\u5355\uFF09\n * const imageMedia: MediaConfig = {\n * type: 'image',\n * src: 'https://cdn.example.com/banner.jpg',\n * alt: 'Product Lottery Banner',\n * }\n *\n * // \u56FE\u7247\u6A21\u5F0F\uFF08\u54CD\u5E94\u5F0F\uFF09\n * const responsiveMedia: MediaConfig = {\n * type: 'image',\n * src: {\n * default: '/images/banner-sm.jpg',\n * tablet: '/images/banner-md.jpg',\n * desktop: '/images/banner-lg.jpg',\n * },\n * alt: 'Product Lottery Banner',\n * }\n *\n * // \u89C6\u9891\u6A21\u5F0F\n * const videoMedia: MediaConfig = {\n * type: 'video',\n * src: 'https://cdn.example.com/promo.mp4',\n * poster: 'https://cdn.example.com/poster.jpg',\n * autoPlay: true,\n * muted: true,\n * loop: true,\n * }\n * ```\n */\nexport interface MediaConfig {\n /** \u5A92\u4F53\u7C7B\u578B */\n type: 'image' | 'video'\n\n /**\n * \u5A92\u4F53\u8D44\u6E90 URL\n * - \u5B57\u7B26\u4E32\uFF1A\u5355\u4E00\u8D44\u6E90\n * - ResponsiveMedia\uFF1A\u54CD\u5E94\u5F0F\u591A\u8D44\u6E90\n */\n src: string | ResponsiveMedia\n\n /**\n * \u89C6\u9891\u5C01\u9762\u56FE URL\uFF08\u4EC5 type='video' \u65F6\u6709\u6548\uFF09\n * @optional\n */\n poster?: string\n\n /**\n * \u662F\u5426\u81EA\u52A8\u64AD\u653E\uFF08\u4EC5 type='video' \u65F6\u6709\u6548\uFF09\n * @default true\n * @optional\n */\n autoPlay?: boolean\n\n /**\n * \u662F\u5426\u9759\u97F3\uFF08\u4EC5 type='video' \u65F6\u6709\u6548\uFF09\n * @default true\n * @optional\n */\n muted?: boolean\n\n /**\n * \u662F\u5426\u5FAA\u73AF\u64AD\u653E\uFF08\u4EC5 type='video' \u65F6\u6709\u6548\uFF09\n * @default true\n * @optional\n */\n loop?: boolean\n\n /**\n * \u56FE\u7247\u66FF\u4EE3\u6587\u672C\uFF08\u65E0\u969C\u788D\uFF09\n * @optional\n */\n alt?: string\n}\n\n// ============================================================================\n// CTA \u6309\u94AE\u914D\u7F6E\n// ============================================================================\n\n/**\n * CTA \u6309\u94AE\u914D\u7F6E\uFF08CtaButtonConfig\uFF09\n *\n * \u914D\u7F6E\u8986\u76D6\u5728\u5A92\u4F53\u533A\u57DF\u4E0A\u7684\u884C\u52A8\u53F7\u53EC\u6309\u94AE\u3002\n *\n * @example\n * ```tsx\n * const ctaButton: CtaButtonConfig = {\n * text: 'Join the Draw',\n * style: 'primary',\n * }\n * ```\n */\nexport interface CtaButtonConfig {\n /**\n * \u6309\u94AE\u6587\u6848\n * @default \"Join the Draw\"\n * @optional\n */\n text?: string\n\n /**\n * \u6309\u94AE\u6837\u5F0F\n * @default \"primary\"\n * @optional\n */\n style?: 'primary' | 'secondary' | 'outline'\n}\n\n// ============================================================================\n// Imperative Handle \u63A5\u53E3\n// ============================================================================\n\n/**\n * ProductLottery \u7EC4\u4EF6\u547D\u4EE4\u5F0F\u63A7\u5236\u63A5\u53E3\n *\n * \u901A\u8FC7 ref \u66B4\u9732\u7ED9\u7236\u7EC4\u4EF6\uFF0C\u7528\u4E8E\u5916\u90E8\u63A7\u5236\u5F39\u7A97\u7B49\u72B6\u6001\u3002\n * \u4E0E WheelLotteryHandle \u4FDD\u6301\u4E00\u81F4\u7684\u5F39\u7A97\u63A7\u5236\u65B9\u6CD5\u3002\n *\n * @example\n * ```tsx\n * const lotteryRef = useRef<ProductLotteryHandle>(null)\n *\n * <ProductLottery ref={lotteryRef} prizes={prizes} media={media} />\n *\n * // \u5916\u90E8\u89E6\u53D1\u9519\u8BEF\u5F39\u7A97\n * lotteryRef.current?.showError({\n * title: 'Network Error',\n * message: 'Failed to connect to server',\n * confirmText: 'Retry'\n * })\n *\n * // \u663E\u793A\u89C4\u5219\u5F39\u7A97\n * lotteryRef.current?.showRules()\n *\n * // \u5173\u95ED\u6240\u6709\u5F39\u7A97\n * lotteryRef.current?.hideAllModals()\n * ```\n */\nexport interface ProductLotteryHandle {\n /** \u663E\u793A\u9519\u8BEF\u5F39\u7A97 */\n showError: (config: { message: string; title?: string; confirmText?: string }) => void\n\n /** \u9690\u85CF\u9519\u8BEF\u5F39\u7A97 */\n hideError: () => void\n\n /** \u663E\u793A\u672A\u4E2D\u5956\u5F39\u7A97 */\n showNoWin: (config?: { title?: string; message?: string; confirmText?: string }) => void\n\n /** \u9690\u85CF\u672A\u4E2D\u5956\u5F39\u7A97 */\n hideNoWin: () => void\n\n /** \u663E\u793A\u4E2D\u5956\u5F39\u7A97 */\n showWinner: (prize: Prize, config?: Partial<WinnerModalConfig>) => void\n\n /** \u9690\u85CF\u4E2D\u5956\u5F39\u7A97 */\n hideWinner: () => void\n\n /** \u663E\u793A\u89C4\u5219\u5F39\u7A97 */\n showRules: () => void\n\n /** \u9690\u85CF\u89C4\u5219\u5F39\u7A97 */\n hideRules: () => void\n\n /** \u663E\u793A\u6211\u7684\u5956\u52B1\u5F39\u7A97 */\n showRewards: () => void\n\n /** \u9690\u85CF\u6211\u7684\u5956\u52B1\u5F39\u7A97 */\n hideRewards: () => void\n\n /** \u663E\u793A\u5206\u4EAB\u5F39\u7A97 */\n showShare: (config?: Partial<ShareModalConfig>) => void\n\n /** \u9690\u85CF\u5206\u4EAB\u5F39\u7A97 */\n hideShare: () => void\n\n /** \u5173\u95ED\u6240\u6709\u5F39\u7A97 */\n hideAllModals: () => void\n}\n\n// ============================================================================\n// MediaDrawArea \u5B50\u7EC4\u4EF6 Props\n// ============================================================================\n\n/**\n * MediaDrawArea \u5B50\u7EC4\u4EF6 Props\n *\n * \u5A92\u4F53\u62BD\u5956\u533A\u57DF\uFF0C\u5C55\u793A\u56FE\u7247/\u89C6\u9891\u5E76\u53E0\u52A0 CTA \u6309\u94AE\u3002\n */\nexport interface MediaDrawAreaProps {\n /** \u4E3B\u9898\u6A21\u5F0F */\n theme?: Theme\n\n /** \u5A92\u4F53\u914D\u7F6E\uFF08\u5FC5\u9700\uFF09 */\n media: MediaConfig\n\n /** CTA \u6309\u94AE\u914D\u7F6E */\n ctaButton?: CtaButtonConfig\n\n /** \u662F\u5426\u6B63\u5728\u62BD\u5956\u4E2D */\n isDrawing?: boolean\n\n /** \u662F\u5426\u7981\u7528\uFF08\u672A\u767B\u5F55\u6216\u65E0\u6B21\u6570\uFF09 */\n isDisabled?: boolean\n\n /** \u70B9\u51FB\u62BD\u5956\u56DE\u8C03 */\n onClick: () => void\n\n /** \u81EA\u5B9A\u4E49\u7C7B\u540D */\n className?: string\n}\n\n// ============================================================================\n// \u4E3B\u7EC4\u4EF6 Props\n// ============================================================================\n\n/**\n * ProductLottery \u7EC4\u4EF6 Props\n *\n * \u57FA\u4E8E\u5A92\u4F53\u5C55\u793A\u7684\u4EA7\u54C1\u62BD\u5956\u7EC4\u4EF6\u3002\u5DE6\u4FA7\u4E3A\u53EF\u70B9\u51FB\u7684\u5A92\u4F53\u533A\u57DF\uFF08\u56FE\u7247/\u89C6\u9891\uFF09\uFF0C\n * \u53F3\u4FA7\u4E3A\u83B7\u53D6\u673A\u4F1A\u533A\u57DF\uFF0C\u5E95\u90E8\u4E3A\u5956\u54C1\u6C60\u3002\n *\n * @example\n * ```tsx\n * <ProductLottery\n * prizes={prizes}\n * media={{ type: 'image', src: '/banner.jpg', alt: 'Lottery' }}\n * ctaButton={{ text: 'Draw Now' }}\n * onDrawStart={async () => {\n * const result = await fetch('/api/lottery')\n * const data = await result.json()\n * return data.prizeId\n * }}\n * onDrawEnd={(prize) => console.log('Won:', prize.name)}\n * />\n * ```\n */\nexport interface ProductLotteryProps {\n // ========== \u5FC5\u9700 Props ==========\n\n /**\n * 8 \u4E2A\u5956\u54C1\u6570\u7EC4\uFF08\u5FC5\u9700\uFF09\n * @minLength 8\n * @maxLength 8\n */\n prizes: Prize[]\n\n /**\n * \u5A92\u4F53\u914D\u7F6E\uFF08\u5FC5\u9700\uFF09\n * \u914D\u7F6E\u5DE6\u4FA7\u62BD\u5956\u533A\u57DF\u5C55\u793A\u7684\u56FE\u7247\u6216\u89C6\u9891\n */\n media: MediaConfig\n\n // ========== \u4E3B\u9898\u548C\u6837\u5F0F ==========\n\n /** \u4E3B\u9898\u6A21\u5F0F */\n theme?: Theme\n\n /** CTA \u6309\u94AE\u914D\u7F6E */\n ctaButton?: CtaButtonConfig\n\n // ========== \u83B7\u53D6\u673A\u4F1A\u533A\u57DF Props ==========\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u6570\u7EC4\n * @optional\n */\n chanceMethods?: ChanceMethod[]\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u673A\u5236\u7C7B\u578B\n * @default \"methods\"\n * @optional\n */\n mechanismType?: ChanceMechanismType\n\n /**\n * \u8F93\u5165\u6846\u914D\u7F6E\uFF08\u5F53 mechanismType \u4E3A 'input' \u65F6\u4F7F\u7528\uFF09\n * @optional\n */\n inputConfig?: ChanceInputConfig\n\n /**\n * \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u6807\u9898\n * @default \"Want more chances to win?\"\n * @optional\n */\n chanceTitle?: string\n\n /** \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u526F\u6807\u9898 */\n chanceSubtitle?: string\n\n /** \u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u5E95\u90E8\u63D0\u793A */\n chanceFooterNote?: string\n\n /** \u83B7\u53D6\u673A\u4F1A\u65B9\u5F0F\u6587\u6848\u914D\u7F6E */\n chanceMethodsText?: {\n chanceBadgeText?: string\n completedText?: string\n usedText?: string\n loadingText?: string\n }\n\n // ========== \u4E2D\u5956\u4FE1\u606F Props ==========\n\n /**\n * \u4E2D\u5956\u4FE1\u606F\u6570\u7EC4\uFF0C\u7528\u4E8E\u5E95\u90E8\u6EDA\u52A8\u6761\u5C55\u793A\n * @default []\n */\n winningInfos?: WinningInfo[]\n\n /** \u5956\u54C1\u6C60\u5C55\u793A\u533A\u57DF\u6807\u9898 */\n prizesTitle?: string\n\n // ========== \u56DE\u8C03\u51FD\u6570 Props ==========\n\n /**\n * \u62BD\u5956\u5F00\u59CB\u65F6\u7684\u56DE\u8C03\uFF0C\u8FD4\u56DE Promise \u4EE5\u652F\u6301\u5F02\u6B65\u63A5\u53E3\u8C03\u7528\n * @returns Promise<string> - \u4E2D\u5956\u5956\u54C1\u7684 prizeKey\n */\n onDrawStart?: () => Promise<string>\n\n /**\n * \u62BD\u5956\u7ED3\u675F\u65F6\u7684\u56DE\u8C03\uFF0C\u4F20\u9012\u4E2D\u5956\u5956\u54C1\n * @param prize \u4E2D\u5956\u5956\u54C1\u5BF9\u8C61\n */\n onDrawEnd?: (prize: Prize) => void\n\n /**\n * \u62BD\u5956\u9519\u8BEF\u65F6\u7684\u56DE\u8C03\n * @param error \u9519\u8BEF\u4FE1\u606F\n */\n onDrawError?: (error: Error) => void\n\n // ========== \u5F39\u7A97\u914D\u7F6E Props ==========\n\n /** \u4E2D\u5956\u5F39\u7A97\u914D\u7F6E */\n winnerModalConfig?: WinnerModalConfig\n\n /** \u89C4\u5219\u5F39\u7A97\u914D\u7F6E */\n rulesModalConfig?: RulesModalConfig\n\n /** \u6211\u7684\u5956\u52B1\u5F39\u7A97\u914D\u7F6E */\n myRewardsModalConfig?: MyRewardsModalConfig\n\n /** \u9519\u8BEF\u5F39\u7A97\u914D\u7F6E */\n errorModalConfig?: ErrorModalConfig\n\n /** \u5206\u4EAB\u5F39\u7A97\u914D\u7F6E */\n shareModalConfig?: ShareModalConfig\n\n // ========== \u7528\u6237\u76F8\u5173 Props ==========\n\n /** \u7528\u6237\u6570\u636E */\n userData?: UserData\n\n /**\n * \u672A\u767B\u5F55\u65F6\u7684\u63D0\u793A\u6587\u6848\n * @default \"Please log in to participate\"\n */\n loginPromptText?: string\n\n /**\n * \u767B\u5F55\u6309\u94AE\u6587\u6848\n * @default \"Log In\"\n */\n loginButtonText?: string\n\n /**\n * \u6B21\u6570\u4E0D\u8DB3\u65F6\u7684\u63D0\u793A\u6587\u6848\n * @default \"You have no chances left\"\n */\n noChancesText?: string\n\n /**\n * \u672A\u767B\u5F55\u65F6\u70B9\u51FB\u62BD\u5956\u7684\u56DE\u8C03\n */\n onLoginRequired?: () => void\n\n // ========== \u5176\u4ED6\u914D\u7F6E ==========\n\n /** \u590D\u5236\u4F18\u60E0\u7801\u56DE\u8C03 */\n onCopyCode?: (code: string) => void\n\n /**\n * \u673A\u4F1A\u8FDB\u5EA6\u6587\u6848\n * @default [\"Number of draws remaining today:\"]\n */\n opportunitiesText?: string[]\n\n /** \u81EA\u5B9A\u4E49 CSS \u7C7B\u540D */\n className?: string\n}\n\n// ============================================================================\n// \u9ED8\u8BA4\u914D\u7F6E\n// ============================================================================\n\n/** \u9ED8\u8BA4 CTA \u6309\u94AE\u914D\u7F6E */\nexport const DEFAULT_CTA_BUTTON: CtaButtonConfig = {\n text: '',\n style: 'primary',\n}\n\n/** \u9ED8\u8BA4\u83B7\u53D6\u673A\u4F1A\u533A\u57DF\u6807\u9898 */\nexport const DEFAULT_CHANCE_TITLE = 'Want more chances to win?'\n"],
|
|
5
|
+
"mappings": "AAodO,MAAMA,EAAsC,CACjD,KAAM,GACN,MAAO,SACT,EAGaC,EAAuB",
|
|
6
|
+
"names": ["DEFAULT_CTA_BUTTON", "DEFAULT_CHANCE_TITLE"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{Fragment as
|
|
1
|
+
"use client";import{Fragment as T,jsx as t,jsxs as c}from"react/jsx-runtime";import B from"./dropdown.js";import{useAiuiContext as z}from"../AiuiProvider/index.js";import{useMediaQuery as q}from"react-responsive";import{useMemo as Q,useState as x,useEffect as E}from"react";import{withLayout as W}from"../../shared/Styles.js";import{formatVariantPrice as G}from"../ShelfDisplay/shelfDisplay.js";import{Picture as v,Text as J,Button as K,Heading as h}from"../../components/index.js";import{cn as X}from"../../helpers/index.js";import Y,{useImperativeHandle as Z,useRef as ee}from"react";const C=Y.forwardRef(({data:k,buildData:d,onChange:A,onSecondaryChange:te,className:F,...j},H)=>{const u=q({query:"(max-width: 768px)"}),[r,f]=x({}),[b,P]=x([]),[w,y]=x(!1),[g,N]=x({}),S=ee(null),{locale:R="us",currencyDisplay:I}=z(),{LeftMenu:L,RightMenu:M,DefaultSelectMenu:m}=Q(()=>k?.data||{},[k?.data]),_=e=>{try{const n=new URL(e).pathname.toLowerCase();return/\.(jpeg|jpg|gif|png|webp|bmp|svg|tiff)$/.test(n)}catch{return/\.(jpeg|jpg|gif|png|webp|bmp|svg|tiff)$/i.test(e)}},$=(e,s)=>{const n=e?.variants?.find?.(p=>p?.sku===e?.sku),o=n?.coupons?.[0],{price:i,basePrice:l}=G({locale:R||"us",amount:o?o?.variant_price4wscode:n?.price,baseAmount:o?n?.price:0,currencyDisplay:I,currencyCode:e?.price?.currencyCode||"USD"}),a=typeof m?.buttonText=="string"?m?.buttonText:m?.buttonText?.[String(s)]||"";return c("div",{className:"specs-sku-node-wrap box-border",children:[c(J,{className:"md-tablet:p-2 l-tablet:mb-4 l-tablet:text-sm desktop:px-6 lg-desktop:mb-8 lg-desktop:text-lg openDropDown specs-sku-node-text relative mb-6 box-border block rounded-[50px] border border-[#E4E5E6] bg-[#F5F5F7] px-6 py-4 text-base font-bold",onClick:()=>{if(b?.length<=1)return null;N({...g,[s]:!g?.[s]})},children:[c("div",{className:"flex items-center justify-between overflow-hidden",children:[t("div",{className:"openDropDown md-tablet:text-sm lg-desktop:text-lg specs-sku-node-title flex-1 truncate text-base",title:r?.[s]?.name||"",children:r?.[s]?.name||""}),b?.length>1?t("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"25",viewBox:"0 0 24 25",fill:"none",className:"openDropDown",children:t("path",{d:"M6 9.5L12 15.5L18 9.5",stroke:"#1D1D1F",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}):null]}),t(B,{index:s,list:b,active:r,setActive:f,visible:g,setVisible:N})]}),t("div",{className:"lg-desktop:max-h-[196px] lg-desktop:max-w-[196px] max-h-[138px] max-w-[138px]",children:t(v,{source:n?.image?.url||"",className:"aspect-h-[280] aspect-w-[280]",imgClassName:"w-full h-full object-cover hover:scale-105 transition-all duration-300"})}),t("div",{className:"lg-desktop:text-2xl mb-2 mt-6 text-xl font-bold",children:t("div",{className:"lg-desktop:min-h-[32px] flex min-h-[28px] items-center",children:n?.availableForSale?c(T,{children:[t("div",{className:"specs-sku-node-price text-[#080A0F]",children:i||""}),l&&t("div",{className:"lg-desktop:text-2xl specs-sku-node-base-price ml-1 text-xl text-[#86868C] line-through",children:l})]}):null})}),a?t(K,{onClick:()=>{A?.(e,s)},className:"specs-sku-node-button",children:a}):null]})},O=e=>e&&typeof e!="string"?c("div",{className:"size-full",children:[t("p",{className:"min-xxl:text-lg specs-normal-node-text text-base font-bold text-[#080A0F] md:text-sm",dangerouslySetInnerHTML:{__html:e?.text||""}}),t(v,{source:e?.imgUrl,className:"l:max-h-[174px] l:max-w-[174px] m-auto max-h-[360px] max-w-[360px]",imgClassName:"w-full h-full object-cover"})]}):t("div",{className:"break-all",children:_(e)?t(v,{source:e,className:"l:max-h-[174px] l:max-w-[174px] m-auto max-h-[360px] max-w-[360px]",imgClassName:"w-full h-full object-cover"}):t("p",{className:"min-xxl:text-lg specs-normal-node-text text-base font-bold text-[#080A0F] md:text-sm",dangerouslySetInnerHTML:{__html:e||""}})}),D=e=>e.map((s,n)=>{const o=n===0;return c("div",{className:"l-tablet:flex l-tablet:flex-col box-border grid w-full cursor-pointer grid-cols-3 overflow-hidden border-t border-t-[#E4E5E6] specs-product-node-wrap",children:[t(h,{as:"h3",html:s||"",className:"tablet:py-6 l-tablet:text-[#86868C] desktop:p-6 lg-desktop:text-lg specs-product-node-title mr-4 flex-1 pt-4 text-base font-bold md:text-sm"}),t("div",{className:`l-tablet:w-full l-tablet:gap-4 laptop:gap-8 desktop:gap-12 desktop:p-6 lg-desktop:gap-16 grid-cols-${w?3:2} specs-product-node-body col-span-2 grid flex-1 py-6`,children:Object.keys(r)?.map?.(i=>{const l=r?.[i],a=M?.menus?.find?.(p=>p?.handle===l?.handle)?.subTitle;return O(a?.[s])})})]},s)}),U=e=>{if(!r)return;const{subTitle:s,isProduct:n}=e;return n?c(T,{children:[c("div",{className:"l-tablet:flex l-tablet:flex-col specs-content-item-product box-border grid w-full cursor-pointer grid-cols-3 border-t-0 border-t-[#E4E5E6]",children:[e?.title&&t(h,{as:"h3",html:e?.title||"",className:"l:hidden specs-item-product-title"}),t("div",{className:`l-tablet:w-full l-tablet:gap-4 laptop:gap-8 desktop:gap-12 desktop:px-6 desktop:pb-6 lg-desktop:gap-16 grid-cols-${w?3:2} specs-item-product-body col-span-2 grid flex-1 pb-4 pr-0`,children:Object.keys(r)?.map((o,i)=>{const l=r?.[o],a=d?.products?.find?.(p=>p?.handle===l?.handle);return t("div",{children:$({...a,item:o,sku:l?.sku},i)},o)})})]}),e?.categoryLabel&&t(h,{size:2,as:"h4",html:e?.categoryLabel||"",className:"desktop:p-6 specs-item-product-category py-6"}),s?.length?D(s):null]}):D(s)};return Z(H,()=>S.current),E(()=>{if(!d?.products?.length)return;const e=m?.sku?.split?.(",")||[],s=u&&e?.length>2?e?.slice(0,2):e;let n={};s?.forEach?.((i,l)=>{const a=d?.products?.find?.(p=>{if(p?.variants?.find?.(V=>V?.sku===i))return!0});a&&(n={...n,[l]:{sku:i,name:a?.name||a?.title,handle:a?.handle}})});const o=d?.products?.filter(i=>M?.menus?.find(l=>l?.handle===i?.handle));f(n),P(o),y(e?.length>2&&!u)},[d,u]),E(()=>{if(u){const e=Object.keys(r||{});if(e?.length>2){const s=e?.slice?.(0,2);let n={};s?.forEach?.(o=>{n={...n,[o]:r?.[o]}}),y(!1),f(n)}}},[u]),t("div",{...j,className:X("specs-wrapper w-full overflow-hidden bg-[#F5F5F7]",F),ref:S,children:L?.data?t("div",{className:"specs-wrapper-content box-border w-full overflow-hidden",children:L?.data?.map?.((e,s)=>t("div",{className:"specs-wrapper-content-item w-full overflow-hidden pt-10 [&:first-child]:pt-0",children:U(e)},s))}):null})});C.displayName="Specs";var ue=W(C);export{ue as default};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/biz-components/Specs/index.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport DropDown from './dropdown.js'\nimport { useAiuiContext } from '../AiuiProvider/index.js'\nimport { useMediaQuery } from 'react-responsive'\nimport { useMemo, useState, useEffect } from 'react'\nimport { withLayout } from '../../shared/Styles.js'\nimport { formatVariantPrice } from '../ShelfDisplay/shelfDisplay.js'\nimport { Picture, Text, Button, Heading } from '../../components/index.js'\nimport { cn } from '../../helpers/index.js'\nimport React, { useImperativeHandle, useRef } from 'react'\n\nexport interface SpecsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n data?: any\n buildData?: any\n onChange?: (product: any, index: number) => void\n onSecondaryChange?: (data: any) => void\n}\n\nconst Specs = React.forwardRef<HTMLDivElement, SpecsProps>(\n ({ data, buildData, onChange, onSecondaryChange, className, ...rest }, ref) => {\n const isMobile = useMediaQuery({ query: '(max-width: 768px)' })\n\n const [active, setActive] = useState<any>({})\n const [menuList, setMenuList] = useState<any[]>([])\n const [isShowMax, setIsShowMax] = useState<boolean>(false)\n const [visibleActive, setVisibleActive] = useState<{ [key: number]: boolean }>({})\n\n const innerRef = useRef<HTMLDivElement>(null)\n\n const { locale = 'us', currencyDisplay } = useAiuiContext()\n\n const { LeftMenu, RightMenu, DefaultSelectMenu } = useMemo(() => data?.data || {}, [data?.data])\n\n const isImageUrl = (urlPath: string) => {\n try {\n const url = new URL(urlPath)\n const path = url.pathname.toLowerCase()\n return /\\.(jpeg|jpg|gif|png|webp|bmp|svg|tiff)$/.test(path)\n } catch (e) {\n // \u5982\u679C\u4F20\u5165\u7684\u4E0D\u662F\u6709\u6548URL\uFF08\u5982\u76F8\u5BF9\u8DEF\u5F84\uFF09\uFF0C\u76F4\u63A5\u68C0\u67E5\u8DEF\u5F84\n return /\\.(jpeg|jpg|gif|png|webp|bmp|svg|tiff)$/i.test(urlPath)\n }\n }\n\n const skuNode = (product: any, index: number) => {\n const findSku = product?.variants?.find?.((item: any) => item?.sku === product?.sku)\n const coupon = findSku?.coupons?.[0]\n const { price, basePrice } = formatVariantPrice({\n locale: locale || 'us',\n amount: coupon ? coupon?.variant_price4wscode : findSku?.price,\n baseAmount: coupon ? findSku?.price : 0,\n currencyDisplay,\n currencyCode: product?.price?.currencyCode || 'USD',\n })\n const buttonTextValue =\n typeof DefaultSelectMenu?.buttonText === 'string'\n ? DefaultSelectMenu?.buttonText\n : DefaultSelectMenu?.buttonText?.[String(index)] || ''\n return (\n <div className=\"specs-sku-node-wrap box-border\">\n <Text\n className={`md-tablet:p-2 l-tablet:mb-4 l-tablet:text-sm desktop:px-6 lg-desktop:mb-8 lg-desktop:text-lg openDropDown specs-sku-node-text relative mb-6 box-border block rounded-[50px] border border-[#E4E5E6] bg-[#F5F5F7] px-6 py-4 text-base font-bold`}\n onClick={() => {\n if (Object.keys(active || {})?.length <= 2) return null\n\n setVisibleActive({\n ...visibleActive,\n [index]: !visibleActive?.[index],\n })\n }}\n >\n <div className=\"flex items-center justify-between overflow-hidden\">\n <div\n className=\"openDropDown md-tablet:text-sm lg-desktop:text-lg specs-sku-node-title flex-1 truncate text-base\"\n title={active?.[index]?.name || ''}\n >\n {active?.[index]?.name || ''}\n </div>\n {Object.keys(active || {})?.length > 2 ? (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"25\"\n viewBox=\"0 0 24 25\"\n fill=\"none\"\n className=\"openDropDown\"\n >\n <path\n d=\"M6 9.5L12 15.5L18 9.5\"\n stroke=\"#1D1D1F\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : null}\n </div>\n <DropDown\n index={index}\n list={menuList}\n active={active}\n setActive={setActive}\n visible={visibleActive}\n setVisible={setVisibleActive}\n />\n </Text>\n <div className=\"lg-desktop:max-h-[196px] lg-desktop:max-w-[196px] max-h-[138px] max-w-[138px]\">\n <Picture\n source={findSku?.image?.url || ''}\n className=\"aspect-h-[280] aspect-w-[280]\"\n imgClassName=\"w-full h-full object-cover hover:scale-105 transition-all duration-300\"\n />\n </div>\n <div className=\"lg-desktop:text-2xl mb-2 mt-6 text-xl font-bold\">\n <div className=\"lg-desktop:min-h-[32px] flex min-h-[28px] items-center\">\n {findSku?.availableForSale ? (\n <>\n <div className=\"specs-sku-node-price text-[#080A0F]\">{price || ''}</div>\n {basePrice && (\n <div className=\"lg-desktop:text-2xl specs-sku-node-base-price ml-1 text-xl text-[#86868C] line-through\">\n {basePrice}\n </div>\n )}\n </>\n ) : null}\n </div>\n </div>\n {buttonTextValue ? (\n <Button\n onClick={() => {\n onChange?.(product, index)\n }}\n className=\"specs-sku-node-button\"\n >\n {buttonTextValue}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const normalNode = (v: any) => {\n if (v && typeof v !== 'string') {\n return (\n <div className=\"size-full\">\n <p\n className=\"min-xxl:text-lg specs-normal-node-text text-base font-bold text-[#080A0F] md:text-sm\"\n dangerouslySetInnerHTML={{\n __html: v?.text || '',\n }}\n />\n <Picture\n source={v?.imgUrl}\n className=\"l:max-h-[174px] l:max-w-[174px] m-auto max-h-[360px] max-w-[360px]\"\n imgClassName=\"w-full h-full object-cover\"\n />\n </div>\n )\n }\n return (\n <div className=\"break-all\">\n {isImageUrl(v) ? (\n <Picture\n source={v}\n className=\"l:max-h-[174px] l:max-w-[174px] m-auto max-h-[360px] max-w-[360px]\"\n imgClassName=\"w-full h-full object-cover\"\n />\n ) : (\n <p\n className=\"min-xxl:text-lg specs-normal-node-text text-base font-bold text-[#080A0F] md:text-sm\"\n dangerouslySetInnerHTML={{\n __html: v || '',\n }}\n />\n )}\n </div>\n )\n }\n\n const productNode = (data: any) => {\n return data.map((st: any, idx: number) => {\n const isFirstParameter = idx === 0\n return (\n <div\n key={st}\n className={`l-tablet:flex l-tablet:flex-col box-border grid w-full cursor-pointer grid-cols-3 overflow-hidden border-t border-t-[#E4E5E6] ${isFirstParameter ? '' : ''} specs-product-node-wrap`}\n >\n <Heading\n as=\"h3\"\n html={st || ''}\n className=\"tablet:py-6 l-tablet:text-[#86868C] desktop:p-6 lg-desktop:text-lg specs-product-node-title mr-4 flex-1 pt-4 text-base font-bold md:text-sm\"\n />\n <div\n className={`l-tablet:w-full l-tablet:gap-4 laptop:gap-8 desktop:gap-12 desktop:p-6 lg-desktop:gap-16 grid-cols-${isShowMax ? 3 : 2} specs-product-node-body col-span-2 grid flex-1 py-6`}\n >\n {Object.keys(active)?.map?.((item: string) => {\n const currentData = active?.[item]\n const currentMenus = RightMenu?.menus?.find?.(\n (item: any) => item?.handle === currentData?.handle\n )?.subTitle\n return normalNode(currentMenus?.[st])\n })}\n </div>\n </div>\n )\n })\n }\n\n // \u5DE6\u4FA7\u6807\u9898\u83DC\u5355\n const childrenNode = (node: any) => {\n if (!active) return\n const { subTitle, isProduct } = node\n // \u5982\u679C\u662F\u4EA7\u54C1\n if (isProduct) {\n return (\n <>\n <div\n className={`l-tablet:flex l-tablet:flex-col specs-content-item-product box-border grid w-full cursor-pointer grid-cols-3 border-t-0 border-t-[#E4E5E6]`}\n >\n {node?.title && (\n <Heading as=\"h3\" html={node?.title || ''} className=\"l:hidden specs-item-product-title\" />\n )}\n <div\n className={`l-tablet:w-full l-tablet:gap-4 laptop:gap-8 desktop:gap-12 desktop:px-6 desktop:pb-6 lg-desktop:gap-16 grid-cols-${isShowMax ? 3 : 2} specs-item-product-body col-span-2 grid flex-1 pb-4 pr-0`}\n >\n {Object.keys(active)?.map((item: string, index: number) => {\n const currentData = active?.[item]\n const currentProduct = buildData?.products?.find?.(\n (item: any) => item?.handle === currentData?.handle\n )\n return (\n <div key={item}>{skuNode({ ...currentProduct, item: item, sku: currentData?.sku }, index)}</div>\n )\n })}\n </div>\n </div>\n {node?.categoryLabel && (\n <Heading\n size={2}\n as=\"h4\"\n html={node?.categoryLabel || ''}\n className=\"desktop:p-6 specs-item-product-category py-6\"\n />\n )}\n {subTitle?.length ? productNode(subTitle) : null}\n </>\n )\n }\n return productNode(subTitle)\n }\n\n useImperativeHandle(ref, () => innerRef.current as HTMLDivElement)\n\n useEffect(() => {\n if (!buildData?.products?.length) return\n const skus = DefaultSelectMenu?.sku?.split?.(',') || []\n let currentActive = {}\n skus?.forEach?.((sku: string, index: number) => {\n const findData = buildData?.products?.find?.((item: any) => {\n const findSku = item?.variants?.find?.((v: any) => v?.sku === sku)\n if (findSku) return true\n })\n if (findData) {\n currentActive = {\n ...currentActive,\n [index]: {\n sku: sku,\n name: findData?.name || findData?.title,\n handle: findData?.handle,\n },\n }\n }\n })\n const currentMenu = buildData?.products?.filter((item: any) => {\n return RightMenu?.menus?.find((params: any) => params?.handle === item?.handle)\n })\n setActive(currentActive)\n setMenuList(currentMenu)\n setIsShowMax(skus?.length > 2)\n }, [buildData])\n\n useEffect(() => {\n if (isMobile) {\n const currentActive = Object.keys(active || {})\n if (currentActive?.length > 2) {\n const newActive = currentActive?.slice?.(0, 2)\n let newShowActive = {}\n newActive?.forEach?.((item: string) => {\n newShowActive = { ...newShowActive, [item]: active?.[item] }\n })\n setIsShowMax(false)\n setActive(newShowActive)\n }\n }\n }, [isMobile])\n\n return (\n <div {...rest} className={cn('specs-wrapper w-full overflow-hidden bg-[#F5F5F7]', className)} ref={innerRef}>\n {LeftMenu?.data ? (\n <div className=\"specs-wrapper-content box-border w-full overflow-hidden\">\n {LeftMenu?.data?.map?.((item: any, index: number) => {\n return (\n <div\n key={index}\n className=\"specs-wrapper-content-item w-full overflow-hidden pt-10 [&:first-child]:pt-0\"\n >\n {childrenNode(item)}\n </div>\n )\n })}\n </div>\n ) : null}\n </div>\n )\n }\n)\n\nSpecs.displayName = 'Specs'\n\nexport default withLayout(Specs)\n"],
|
|
5
|
-
"mappings": "aAwEY,OA6CI,YAAAA,EA5CF,OAAAC,EADF,QAAAC,MAAA,oBAtEZ,OAAOC,MAAc,gBACrB,OAAS,kBAAAC,MAAsB,2BAC/B,OAAS,iBAAAC,MAAqB,mBAC9B,OAAS,WAAAC,EAAS,YAAAC,EAAU,aAAAC,MAAiB,QAC7C,OAAS,cAAAC,MAAkB,yBAC3B,OAAS,sBAAAC,MAA0B,kCACnC,OAAS,WAAAC,EAAS,QAAAC,EAAM,UAAAC,EAAQ,WAAAC,MAAe,4BAC/C,OAAS,MAAAC,MAAU,yBACnB,OAAOC,GAAS,uBAAAC,EAAqB,UAAAC,OAAc,QASnD,MAAMC,EAAQH,EAAM,WAClB,CAAC,CAAE,KAAAI,EAAM,UAAAC,EAAW,SAAAC,EAAU,kBAAAC,GAAmB,UAAAC,EAAW,GAAGC,CAAK,EAAGC,IAAQ,CAC7E,MAAMC,EAAWtB,EAAc,CAAE,MAAO,oBAAqB,CAAC,EAExD,CAACuB,EAAQC,CAAS,EAAItB,EAAc,CAAC,CAAC,EACtC,CAACuB,EAAUC,CAAW,EAAIxB,EAAgB,CAAC,CAAC,EAC5C,CAACyB,EAAWC,CAAY,EAAI1B,EAAkB,EAAK,EACnD,CAAC2B,EAAeC,CAAgB,EAAI5B,EAAqC,CAAC,CAAC,EAE3E6B,EAAWlB,GAAuB,IAAI,EAEtC,CAAE,OAAAmB,EAAS,KAAM,gBAAAC,CAAgB,EAAIlC,EAAe,EAEpD,CAAE,SAAAmC,EAAU,UAAAC,EAAW,kBAAAC,CAAkB,EAAInC,EAAQ,IAAMc,GAAM,MAAQ,CAAC,EAAG,CAACA,GAAM,IAAI,CAAC,EAEzFsB,EAAcC,GAAoB,CACtC,GAAI,CAEF,MAAMC,EADM,IAAI,IAAID,CAAO,EACV,SAAS,YAAY,EACtC,MAAO,0CAA0C,KAAKC,CAAI,CAC5D,MAAY,CAEV,MAAO,2CAA2C,KAAKD,CAAO,CAChE,CACF,EAEME,EAAU,CAACC,EAAcC,IAAkB,CAC/C,MAAMC,EAAUF,GAAS,UAAU,OAAQG,GAAcA,GAAM,MAAQH,GAAS,GAAG,EAC7EI,EAASF,GAAS,UAAU,CAAC,EAC7B,CAAE,MAAAG,EAAO,UAAAC,CAAU,EAAI1C,EAAmB,CAC9C,OAAQ2B,GAAU,KAClB,OAAQa,EAASA,GAAQ,qBAAuBF,GAAS,MACzD,WAAYE,EAASF,GAAS,MAAQ,EACtC,gBAAAV,EACA,aAAcQ,GAAS,OAAO,cAAgB,KAChD,CAAC,EACKO,EACJ,OAAOZ,GAAmB,YAAe,SACrCA,GAAmB,WACnBA,GAAmB,aAAa,OAAOM,CAAK,CAAC,GAAK,GACxD,OACE7C,EAAC,OAAI,UAAU,iCACb,UAAAA,EAACU,EAAA,CACC,UAAW,iPACX,QAAS,IAAM,CACb,
|
|
6
|
-
"names": ["Fragment", "jsx", "jsxs", "DropDown", "useAiuiContext", "useMediaQuery", "useMemo", "useState", "useEffect", "withLayout", "formatVariantPrice", "Picture", "Text", "Button", "Heading", "cn", "React", "useImperativeHandle", "useRef", "Specs", "data", "buildData", "onChange", "onSecondaryChange", "className", "rest", "ref", "isMobile", "active", "setActive", "menuList", "setMenuList", "isShowMax", "setIsShowMax", "visibleActive", "setVisibleActive", "innerRef", "locale", "currencyDisplay", "LeftMenu", "RightMenu", "DefaultSelectMenu", "isImageUrl", "urlPath", "path", "skuNode", "product", "index", "findSku", "item", "coupon", "price", "basePrice", "buttonTextValue", "normalNode", "v", "productNode", "st", "idx", "isFirstParameter", "currentData", "currentMenus", "childrenNode", "node", "subTitle", "isProduct", "currentProduct", "skus", "currentActive", "sku", "findData", "currentMenu", "params", "newActive", "newShowActive", "Specs_default"]
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport DropDown from './dropdown.js'\nimport { useAiuiContext } from '../AiuiProvider/index.js'\nimport { useMediaQuery } from 'react-responsive'\nimport { useMemo, useState, useEffect } from 'react'\nimport { withLayout } from '../../shared/Styles.js'\nimport { formatVariantPrice } from '../ShelfDisplay/shelfDisplay.js'\nimport { Picture, Text, Button, Heading } from '../../components/index.js'\nimport { cn } from '../../helpers/index.js'\nimport React, { useImperativeHandle, useRef } from 'react'\n\nexport interface SpecsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n data?: any\n buildData?: any\n onChange?: (product: any, index: number) => void\n onSecondaryChange?: (data: any) => void\n}\n\nconst Specs = React.forwardRef<HTMLDivElement, SpecsProps>(\n ({ data, buildData, onChange, onSecondaryChange, className, ...rest }, ref) => {\n const isMobile = useMediaQuery({ query: '(max-width: 768px)' })\n\n const [active, setActive] = useState<any>({})\n const [menuList, setMenuList] = useState<any[]>([])\n const [isShowMax, setIsShowMax] = useState<boolean>(false)\n const [visibleActive, setVisibleActive] = useState<{ [key: number]: boolean }>({})\n\n const innerRef = useRef<HTMLDivElement>(null)\n\n const { locale = 'us', currencyDisplay } = useAiuiContext()\n\n const { LeftMenu, RightMenu, DefaultSelectMenu } = useMemo(() => data?.data || {}, [data?.data])\n\n const isImageUrl = (urlPath: string) => {\n try {\n const url = new URL(urlPath)\n const path = url.pathname.toLowerCase()\n return /\\.(jpeg|jpg|gif|png|webp|bmp|svg|tiff)$/.test(path)\n } catch (e) {\n // \u5982\u679C\u4F20\u5165\u7684\u4E0D\u662F\u6709\u6548URL\uFF08\u5982\u76F8\u5BF9\u8DEF\u5F84\uFF09\uFF0C\u76F4\u63A5\u68C0\u67E5\u8DEF\u5F84\n return /\\.(jpeg|jpg|gif|png|webp|bmp|svg|tiff)$/i.test(urlPath)\n }\n }\n\n const skuNode = (product: any, index: number) => {\n const findSku = product?.variants?.find?.((item: any) => item?.sku === product?.sku)\n const coupon = findSku?.coupons?.[0]\n const { price, basePrice } = formatVariantPrice({\n locale: locale || 'us',\n amount: coupon ? coupon?.variant_price4wscode : findSku?.price,\n baseAmount: coupon ? findSku?.price : 0,\n currencyDisplay,\n currencyCode: product?.price?.currencyCode || 'USD',\n })\n const buttonTextValue =\n typeof DefaultSelectMenu?.buttonText === 'string'\n ? DefaultSelectMenu?.buttonText\n : DefaultSelectMenu?.buttonText?.[String(index)] || ''\n return (\n <div className=\"specs-sku-node-wrap box-border\">\n <Text\n className={`md-tablet:p-2 l-tablet:mb-4 l-tablet:text-sm desktop:px-6 lg-desktop:mb-8 lg-desktop:text-lg openDropDown specs-sku-node-text relative mb-6 box-border block rounded-[50px] border border-[#E4E5E6] bg-[#F5F5F7] px-6 py-4 text-base font-bold`}\n onClick={() => {\n if (menuList?.length <= 1) return null\n\n setVisibleActive({\n ...visibleActive,\n [index]: !visibleActive?.[index],\n })\n }}\n >\n <div className=\"flex items-center justify-between overflow-hidden\">\n <div\n className=\"openDropDown md-tablet:text-sm lg-desktop:text-lg specs-sku-node-title flex-1 truncate text-base\"\n title={active?.[index]?.name || ''}\n >\n {active?.[index]?.name || ''}\n </div>\n {menuList?.length > 1 ? (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"25\"\n viewBox=\"0 0 24 25\"\n fill=\"none\"\n className=\"openDropDown\"\n >\n <path\n d=\"M6 9.5L12 15.5L18 9.5\"\n stroke=\"#1D1D1F\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : null}\n </div>\n <DropDown\n index={index}\n list={menuList}\n active={active}\n setActive={setActive}\n visible={visibleActive}\n setVisible={setVisibleActive}\n />\n </Text>\n <div className=\"lg-desktop:max-h-[196px] lg-desktop:max-w-[196px] max-h-[138px] max-w-[138px]\">\n <Picture\n source={findSku?.image?.url || ''}\n className=\"aspect-h-[280] aspect-w-[280]\"\n imgClassName=\"w-full h-full object-cover hover:scale-105 transition-all duration-300\"\n />\n </div>\n <div className=\"lg-desktop:text-2xl mb-2 mt-6 text-xl font-bold\">\n <div className=\"lg-desktop:min-h-[32px] flex min-h-[28px] items-center\">\n {findSku?.availableForSale ? (\n <>\n <div className=\"specs-sku-node-price text-[#080A0F]\">{price || ''}</div>\n {basePrice && (\n <div className=\"lg-desktop:text-2xl specs-sku-node-base-price ml-1 text-xl text-[#86868C] line-through\">\n {basePrice}\n </div>\n )}\n </>\n ) : null}\n </div>\n </div>\n {buttonTextValue ? (\n <Button\n onClick={() => {\n onChange?.(product, index)\n }}\n className=\"specs-sku-node-button\"\n >\n {buttonTextValue}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const normalNode = (v: any) => {\n if (v && typeof v !== 'string') {\n return (\n <div className=\"size-full\">\n <p\n className=\"min-xxl:text-lg specs-normal-node-text text-base font-bold text-[#080A0F] md:text-sm\"\n dangerouslySetInnerHTML={{\n __html: v?.text || '',\n }}\n />\n <Picture\n source={v?.imgUrl}\n className=\"l:max-h-[174px] l:max-w-[174px] m-auto max-h-[360px] max-w-[360px]\"\n imgClassName=\"w-full h-full object-cover\"\n />\n </div>\n )\n }\n return (\n <div className=\"break-all\">\n {isImageUrl(v) ? (\n <Picture\n source={v}\n className=\"l:max-h-[174px] l:max-w-[174px] m-auto max-h-[360px] max-w-[360px]\"\n imgClassName=\"w-full h-full object-cover\"\n />\n ) : (\n <p\n className=\"min-xxl:text-lg specs-normal-node-text text-base font-bold text-[#080A0F] md:text-sm\"\n dangerouslySetInnerHTML={{\n __html: v || '',\n }}\n />\n )}\n </div>\n )\n }\n\n const productNode = (data: any) => {\n return data.map((st: any, idx: number) => {\n const isFirstParameter = idx === 0\n return (\n <div\n key={st}\n className={`l-tablet:flex l-tablet:flex-col box-border grid w-full cursor-pointer grid-cols-3 overflow-hidden border-t border-t-[#E4E5E6] ${isFirstParameter ? '' : ''} specs-product-node-wrap`}\n >\n <Heading\n as=\"h3\"\n html={st || ''}\n className=\"tablet:py-6 l-tablet:text-[#86868C] desktop:p-6 lg-desktop:text-lg specs-product-node-title mr-4 flex-1 pt-4 text-base font-bold md:text-sm\"\n />\n <div\n className={`l-tablet:w-full l-tablet:gap-4 laptop:gap-8 desktop:gap-12 desktop:p-6 lg-desktop:gap-16 grid-cols-${isShowMax ? 3 : 2} specs-product-node-body col-span-2 grid flex-1 py-6`}\n >\n {Object.keys(active)?.map?.((item: string) => {\n const currentData = active?.[item]\n const currentMenus = RightMenu?.menus?.find?.(\n (item: any) => item?.handle === currentData?.handle\n )?.subTitle\n return normalNode(currentMenus?.[st])\n })}\n </div>\n </div>\n )\n })\n }\n\n // \u5DE6\u4FA7\u6807\u9898\u83DC\u5355\n const childrenNode = (node: any) => {\n if (!active) return\n const { subTitle, isProduct } = node\n // \u5982\u679C\u662F\u4EA7\u54C1\n if (isProduct) {\n return (\n <>\n <div\n className={`l-tablet:flex l-tablet:flex-col specs-content-item-product box-border grid w-full cursor-pointer grid-cols-3 border-t-0 border-t-[#E4E5E6]`}\n >\n {node?.title && (\n <Heading as=\"h3\" html={node?.title || ''} className=\"l:hidden specs-item-product-title\" />\n )}\n <div\n className={`l-tablet:w-full l-tablet:gap-4 laptop:gap-8 desktop:gap-12 desktop:px-6 desktop:pb-6 lg-desktop:gap-16 grid-cols-${isShowMax ? 3 : 2} specs-item-product-body col-span-2 grid flex-1 pb-4 pr-0`}\n >\n {Object.keys(active)?.map((item: string, index: number) => {\n const currentData = active?.[item]\n const currentProduct = buildData?.products?.find?.(\n (item: any) => item?.handle === currentData?.handle\n )\n return (\n <div key={item}>{skuNode({ ...currentProduct, item: item, sku: currentData?.sku }, index)}</div>\n )\n })}\n </div>\n </div>\n {node?.categoryLabel && (\n <Heading\n size={2}\n as=\"h4\"\n html={node?.categoryLabel || ''}\n className=\"desktop:p-6 specs-item-product-category py-6\"\n />\n )}\n {subTitle?.length ? productNode(subTitle) : null}\n </>\n )\n }\n return productNode(subTitle)\n }\n\n useImperativeHandle(ref, () => innerRef.current as HTMLDivElement)\n\n useEffect(() => {\n if (!buildData?.products?.length) return\n const skus = DefaultSelectMenu?.sku?.split?.(',') || []\n const limitedSkus = isMobile && skus?.length > 2 ? skus?.slice(0, 2) : skus\n let currentActive = {}\n limitedSkus?.forEach?.((sku: string, index: number) => {\n const findData = buildData?.products?.find?.((item: any) => {\n const findSku = item?.variants?.find?.((v: any) => v?.sku === sku)\n if (findSku) return true\n })\n if (findData) {\n currentActive = {\n ...currentActive,\n [index]: {\n sku: sku,\n name: findData?.name || findData?.title,\n handle: findData?.handle,\n },\n }\n }\n })\n const currentMenu = buildData?.products?.filter((item: any) => {\n return RightMenu?.menus?.find((params: any) => params?.handle === item?.handle)\n })\n setActive(currentActive)\n setMenuList(currentMenu)\n setIsShowMax(skus?.length > 2 && !isMobile)\n }, [buildData, isMobile])\n\n useEffect(() => {\n if (isMobile) {\n const currentActive = Object.keys(active || {})\n if (currentActive?.length > 2) {\n const newActive = currentActive?.slice?.(0, 2)\n let newShowActive = {}\n newActive?.forEach?.((item: string) => {\n newShowActive = { ...newShowActive, [item]: active?.[item] }\n })\n setIsShowMax(false)\n setActive(newShowActive)\n }\n }\n }, [isMobile])\n\n return (\n <div {...rest} className={cn('specs-wrapper w-full overflow-hidden bg-[#F5F5F7]', className)} ref={innerRef}>\n {LeftMenu?.data ? (\n <div className=\"specs-wrapper-content box-border w-full overflow-hidden\">\n {LeftMenu?.data?.map?.((item: any, index: number) => {\n return (\n <div\n key={index}\n className=\"specs-wrapper-content-item w-full overflow-hidden pt-10 [&:first-child]:pt-0\"\n >\n {childrenNode(item)}\n </div>\n )\n })}\n </div>\n ) : null}\n </div>\n )\n }\n)\n\nSpecs.displayName = 'Specs'\n\nexport default withLayout(Specs)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Fragment", "jsx", "jsxs", "DropDown", "useAiuiContext", "useMediaQuery", "useMemo", "useState", "useEffect", "withLayout", "formatVariantPrice", "Picture", "Text", "Button", "Heading", "cn", "React", "useImperativeHandle", "useRef", "Specs", "data", "buildData", "onChange", "onSecondaryChange", "className", "rest", "ref", "isMobile", "active", "setActive", "menuList", "setMenuList", "isShowMax", "setIsShowMax", "visibleActive", "setVisibleActive", "innerRef", "locale", "currencyDisplay", "LeftMenu", "RightMenu", "DefaultSelectMenu", "isImageUrl", "urlPath", "path", "skuNode", "product", "index", "findSku", "item", "coupon", "price", "basePrice", "buttonTextValue", "normalNode", "v", "productNode", "st", "idx", "isFirstParameter", "currentData", "currentMenus", "childrenNode", "node", "subTitle", "isProduct", "currentProduct", "skus", "limitedSkus", "currentActive", "sku", "findData", "currentMenu", "params", "newActive", "newShowActive", "Specs_default"]
|
|
7
7
|
}
|
|
@@ -34,15 +34,15 @@ import type { WheelLotteryProps, WheelLotteryHandle } from './types.js';
|
|
|
34
34
|
export declare const WheelLottery: import("react").ForwardRefExoticComponent<WheelLotteryProps & import("react").RefAttributes<WheelLotteryHandle>>;
|
|
35
35
|
declare const _default: any;
|
|
36
36
|
export default _default;
|
|
37
|
-
export { WinnerModal } from '
|
|
38
|
-
export { RulesModal } from '
|
|
39
|
-
export { MyRewardsModal } from '
|
|
40
|
-
export { ErrorModal } from '
|
|
41
|
-
export { ShareModal } from '
|
|
42
|
-
export { BaseModal } from '
|
|
37
|
+
export { WinnerModal } from '../LotteryShared/WinnerModal.js';
|
|
38
|
+
export { RulesModal } from '../LotteryShared/RulesModal.js';
|
|
39
|
+
export { MyRewardsModal } from '../LotteryShared/MyRewardsModal.js';
|
|
40
|
+
export { ErrorModal } from '../LotteryShared/ErrorModal.js';
|
|
41
|
+
export { ShareModal } from '../LotteryShared/ShareModal.js';
|
|
42
|
+
export { BaseModal } from '../LotteryShared/BaseModal.js';
|
|
43
43
|
export type { WheelLotteryProps, WheelLotteryHandle, Prize, ChanceMethod, ChanceMethodStatus, WinningInfo, WheelProps, PrizePoolProps, ChanceMethodsProps, WinnerModalProps, WinnerModalConfig, UserData, ShareModalConfig, SocialPlatform, SharePlatformConfig, } from './types.js';
|
|
44
|
-
export type { RulesModalProps, RuleItem } from '
|
|
45
|
-
export type { MyRewardsModalProps, Reward, RewardStatus } from '
|
|
46
|
-
export type { ErrorModalProps } from '
|
|
47
|
-
export type { ShareModalProps } from '
|
|
48
|
-
export type { BaseModalProps } from '
|
|
44
|
+
export type { RulesModalProps, RuleItem } from '../LotteryShared/RulesModal.js';
|
|
45
|
+
export type { MyRewardsModalProps, Reward, RewardStatus } from '../LotteryShared/MyRewardsModal.js';
|
|
46
|
+
export type { ErrorModalProps } from '../LotteryShared/ErrorModal.js';
|
|
47
|
+
export type { ShareModalProps } from '../LotteryShared/ShareModal.js';
|
|
48
|
+
export type { BaseModalProps } from '../LotteryShared/BaseModal.js';
|