@quantabit/membership-sdk 1.0.0

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.
@@ -0,0 +1,549 @@
1
+ var QbitMembership = (function (exports, sdkConfig, React) {
2
+ 'use strict';
3
+
4
+ /**
5
+ * Membership SDK - API 客户端
6
+ * 会员卡系统后端接口封装
7
+ *
8
+ * 使用 BaseApiClient 基类,继承统一的配置、认证、错误处理
9
+ */
10
+
11
+
12
+ /**
13
+ * 会员卡 API 客户端
14
+ */
15
+ class MembershipApiClient extends sdkConfig.BaseApiClient {
16
+ constructor(config = {}) {
17
+ super('/membership', config);
18
+ }
19
+
20
+ // ============ 会员卡查询 ============
21
+
22
+ /**
23
+ * 获取当前用户的会员卡
24
+ */
25
+ async getMyCard() {
26
+ return this.get('/card');
27
+ }
28
+
29
+ /**
30
+ * 获取所有会员卡类型
31
+ */
32
+ async getCards() {
33
+ return this.get('/cards');
34
+ }
35
+
36
+ /**
37
+ * 获取会员卡详情
38
+ * @param {string} cardId - 会员卡 ID
39
+ */
40
+ async getCardDetail(cardId) {
41
+ return this.get(`/cards/${cardId}`);
42
+ }
43
+
44
+ // ============ 会员卡操作 ============
45
+
46
+ /**
47
+ * 使用积分兑换会员卡
48
+ * @param {string} cardType - 卡片类型 (basic/silver/gold/platinum)
49
+ * @param {number} points - 积分数量
50
+ */
51
+ async redeemWithPoints(cardType, points) {
52
+ return this.post('/redeem', {
53
+ cardType,
54
+ points
55
+ });
56
+ }
57
+
58
+ /**
59
+ * 延长会员卡有效期
60
+ * @param {string} cardId - 会员卡 ID
61
+ * @param {number} months - 延长月数
62
+ */
63
+ async extendCard(cardId, months) {
64
+ return this.post(`/cards/${cardId}/extend`, {
65
+ months
66
+ });
67
+ }
68
+
69
+ /**
70
+ * 升级会员卡
71
+ * @param {string} cardId - 会员卡 ID
72
+ * @param {string} targetType - 目标卡片类型
73
+ */
74
+ async upgradeCard(cardId, targetType) {
75
+ return this.post(`/cards/${cardId}/upgrade`, {
76
+ target_type: targetType
77
+ });
78
+ }
79
+
80
+ // ============ 权益管理 ============
81
+
82
+ /**
83
+ * 获取卡片权益列表
84
+ * @param {string} cardType - 卡片类型
85
+ */
86
+ async getBenefits(cardType) {
87
+ return this.get(`/cards/${cardType}/benefits`);
88
+ }
89
+
90
+ /**
91
+ * 使用权益
92
+ * @param {string} benefitId - 权益 ID
93
+ */
94
+ async useBenefit(benefitId) {
95
+ return this.post(`/benefits/${benefitId}/use`);
96
+ }
97
+
98
+ /**
99
+ * 获取权益使用记录
100
+ * @param {Object} params - 查询参数
101
+ */
102
+ async getBenefitHistory(params = {}) {
103
+ return this.get('/benefits/history', params);
104
+ }
105
+ }
106
+
107
+ // 创建默认实例
108
+ const membershipApi = new MembershipApiClient();
109
+
110
+ /**
111
+ * Membership SDK - React Hooks
112
+ * 会员卡 React 钩子
113
+ */
114
+
115
+
116
+ /**
117
+ * 获取当前用户的会员卡信息
118
+ */
119
+ function useMembershipCard() {
120
+ const [card, setCard] = React.useState(null);
121
+ const [loading, setLoading] = React.useState(true);
122
+ const [error, setError] = React.useState(null);
123
+ const fetchCard = React.useCallback(async () => {
124
+ setLoading(true);
125
+ setError(null);
126
+ try {
127
+ const result = await membershipApi.getMyCard();
128
+ setCard(result.data || result);
129
+ } catch (err) {
130
+ setError(err.message);
131
+ } finally {
132
+ setLoading(false);
133
+ }
134
+ }, []);
135
+ React.useEffect(() => {
136
+ fetchCard();
137
+ }, [fetchCard]);
138
+ return {
139
+ card,
140
+ loading,
141
+ error,
142
+ refresh: fetchCard
143
+ };
144
+ }
145
+
146
+ /**
147
+ * 获取所有可用的会员卡类型
148
+ */
149
+ function useMembershipCards() {
150
+ const [cards, setCards] = React.useState([]);
151
+ const [loading, setLoading] = React.useState(true);
152
+ const [error, setError] = React.useState(null);
153
+ const fetchCards = React.useCallback(async () => {
154
+ setLoading(true);
155
+ try {
156
+ const result = await membershipApi.getCards();
157
+ setCards(result.data || []);
158
+ } catch (err) {
159
+ setError(err.message);
160
+ } finally {
161
+ setLoading(false);
162
+ }
163
+ }, []);
164
+ React.useEffect(() => {
165
+ fetchCards();
166
+ }, [fetchCards]);
167
+ return {
168
+ cards,
169
+ loading,
170
+ error,
171
+ refresh: fetchCards
172
+ };
173
+ }
174
+
175
+ /**
176
+ * 会员卡权益管理
177
+ * @param {string} cardType - 卡片类型
178
+ */
179
+ function useBenefits(cardType) {
180
+ const [benefits, setBenefits] = React.useState([]);
181
+ const [loading, setLoading] = React.useState(false);
182
+ const [error, setError] = React.useState(null);
183
+ const fetchBenefits = React.useCallback(async () => {
184
+ if (!cardType) return;
185
+ setLoading(true);
186
+ try {
187
+ const result = await membershipApi.getBenefits(cardType);
188
+ setBenefits(result.data || []);
189
+ } catch (err) {
190
+ setError(err.message);
191
+ } finally {
192
+ setLoading(false);
193
+ }
194
+ }, [cardType]);
195
+ const useBenefit = React.useCallback(async benefitId => {
196
+ const result = await membershipApi.useBenefit(benefitId);
197
+ await fetchBenefits();
198
+ return result;
199
+ }, [fetchBenefits]);
200
+ React.useEffect(() => {
201
+ fetchBenefits();
202
+ }, [fetchBenefits]);
203
+ return {
204
+ benefits,
205
+ loading,
206
+ error,
207
+ useBenefit,
208
+ refresh: fetchBenefits
209
+ };
210
+ }
211
+
212
+ /**
213
+ * Membership SDK - 国际化
214
+ * 会员卡系统多语言支持
215
+ */
216
+
217
+ const SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];
218
+ const messages = {
219
+ zh: {
220
+ membershipCard: '会员卡',
221
+ cardType: {
222
+ basic: '基础会员',
223
+ silver: '银卡会员',
224
+ gold: '金卡会员',
225
+ platinum: '铂金会员'
226
+ },
227
+ validUntil: '有效期至',
228
+ points: '积分',
229
+ use: '使用',
230
+ noBenefits: '暂无可用权益',
231
+ redeem: '兑换',
232
+ upgrade: '升级',
233
+ extend: '续期',
234
+ benefits: '会员权益',
235
+ history: '使用记录',
236
+ loading: '加载中...',
237
+ expired: '已过期',
238
+ active: '有效',
239
+ frozen: '已冻结'
240
+ },
241
+ en: {
242
+ membershipCard: 'Membership Card',
243
+ cardType: {
244
+ basic: 'Basic',
245
+ silver: 'Silver',
246
+ gold: 'Gold',
247
+ platinum: 'Platinum'
248
+ },
249
+ validUntil: 'Valid until',
250
+ points: 'Points',
251
+ use: 'Use',
252
+ noBenefits: 'No benefits available',
253
+ redeem: 'Redeem',
254
+ upgrade: 'Upgrade',
255
+ extend: 'Extend',
256
+ benefits: 'Benefits',
257
+ history: 'History',
258
+ loading: 'Loading...',
259
+ expired: 'Expired',
260
+ active: 'Active',
261
+ frozen: 'Frozen'
262
+ },
263
+ ja: {
264
+ membershipCard: 'メンバーシップカード',
265
+ cardType: {
266
+ basic: 'ベーシック',
267
+ silver: 'シルバー',
268
+ gold: 'ゴールド',
269
+ platinum: 'プラチナ'
270
+ },
271
+ validUntil: '有効期限',
272
+ points: 'ポイント',
273
+ use: '使用',
274
+ noBenefits: '利用可能な特典はありません',
275
+ redeem: '交換',
276
+ upgrade: 'アップグレード',
277
+ extend: '延長',
278
+ benefits: '特典',
279
+ history: '履歴',
280
+ loading: '読み込み中...',
281
+ expired: '期限切れ',
282
+ active: '有効',
283
+ frozen: '凍結'
284
+ },
285
+ ko: {
286
+ membershipCard: '멤버십 카드',
287
+ cardType: {
288
+ basic: '기본',
289
+ silver: '실버',
290
+ gold: '골드',
291
+ platinum: '플래티넘'
292
+ },
293
+ validUntil: '유효 기한',
294
+ points: '포인트',
295
+ use: '사용',
296
+ noBenefits: '사용 가능한 혜택이 없습니다',
297
+ redeem: '교환',
298
+ upgrade: '업그레이드',
299
+ extend: '연장',
300
+ benefits: '혜택',
301
+ history: '기록',
302
+ loading: '로딩 중...',
303
+ expired: '만료',
304
+ active: '활성',
305
+ frozen: '동결'
306
+ }
307
+ };
308
+
309
+ // 当前语言
310
+ let currentLanguage = 'zh';
311
+
312
+ /**
313
+ * 设置语言
314
+ * @param {string} lang - 语言代码
315
+ */
316
+ function setLanguage(lang) {
317
+ if (SUPPORTED_LANGUAGES.includes(lang)) {
318
+ currentLanguage = lang;
319
+ }
320
+ }
321
+
322
+ /**
323
+ * 获取当前语言
324
+ * @returns {string}
325
+ */
326
+ function getLanguage() {
327
+ return currentLanguage;
328
+ }
329
+
330
+ /**
331
+ * 翻译函数
332
+ * @param {string} key - 翻译键,支持点号路径(如 'cardType.gold')
333
+ * @param {Object} params - 插值参数
334
+ * @returns {string}
335
+ */
336
+ function t(key, params = {}) {
337
+ const lang = messages[currentLanguage] || messages.zh;
338
+
339
+ // 支持点号路径访问
340
+ const keys = key.split('.');
341
+ let value = lang;
342
+ for (const k of keys) {
343
+ value = value?.[k];
344
+ if (value === undefined) break;
345
+ }
346
+ if (typeof value !== 'string') {
347
+ // 回退到中文
348
+ value = lang;
349
+ for (const k of keys) {
350
+ value = value?.[k];
351
+ if (value === undefined) break;
352
+ }
353
+ }
354
+ if (typeof value !== 'string') return key;
355
+
356
+ // 简单插值替换
357
+ return value.replace(/\{(\w+)\}/g, (_, k) => params[k] ?? '');
358
+ }
359
+
360
+ // 监听全局语言变更事件
361
+ if (typeof window !== 'undefined') {
362
+ window.addEventListener('qbit-did:language-change', e => {
363
+ if (e.detail?.language) {
364
+ setLanguage(e.detail.language);
365
+ }
366
+ });
367
+ }
368
+
369
+ /**
370
+ * Membership SDK - 会员卡组件
371
+ * 支持 i18n 国际化
372
+ */
373
+
374
+
375
+ /**
376
+ * 会员卡类型对应的渐变色配置
377
+ */
378
+ const CARD_GRADIENTS = {
379
+ basic: {
380
+ from: '#6b7280',
381
+ to: '#4b5563',
382
+ label: '🪪'
383
+ },
384
+ silver: {
385
+ from: '#94a3b8',
386
+ to: '#64748b',
387
+ label: '🥈'
388
+ },
389
+ gold: {
390
+ from: '#f59e0b',
391
+ to: '#d97706',
392
+ label: '🥇'
393
+ },
394
+ platinum: {
395
+ from: '#a855f7',
396
+ to: '#7c3aed',
397
+ label: '💎'
398
+ }
399
+ };
400
+
401
+ /**
402
+ * 会员卡展示组件
403
+ * @param {Object} props
404
+ * @param {Object} props.card - 会员卡数据
405
+ * @param {Function} props.onClick - 点击回调
406
+ */
407
+ function MembershipCard({
408
+ card,
409
+ onClick
410
+ }) {
411
+ if (!card) return null;
412
+ const gradient = CARD_GRADIENTS[card.type] || CARD_GRADIENTS.basic;
413
+ return /*#__PURE__*/React.createElement("div", {
414
+ className: "eco-membership-card",
415
+ style: {
416
+ background: `linear-gradient(135deg, ${gradient.from}, ${gradient.to})`,
417
+ borderRadius: '16px',
418
+ padding: '24px',
419
+ color: '#fff',
420
+ cursor: onClick ? 'pointer' : 'default',
421
+ position: 'relative',
422
+ overflow: 'hidden',
423
+ minHeight: '180px'
424
+ },
425
+ onClick: () => onClick?.(card)
426
+ }, /*#__PURE__*/React.createElement("div", {
427
+ style: {
428
+ position: 'absolute',
429
+ top: '16px',
430
+ right: '20px',
431
+ fontSize: '32px',
432
+ opacity: 0.3
433
+ }
434
+ }, gradient.label), /*#__PURE__*/React.createElement("div", {
435
+ style: {
436
+ fontSize: '12px',
437
+ letterSpacing: '2px',
438
+ textTransform: 'uppercase',
439
+ opacity: 0.8
440
+ }
441
+ }, t('membershipCard')), /*#__PURE__*/React.createElement("div", {
442
+ style: {
443
+ fontSize: '20px',
444
+ fontWeight: 'bold',
445
+ marginTop: '8px',
446
+ textTransform: 'uppercase'
447
+ }
448
+ }, t(`cardType.${card.type}`) || card.type), /*#__PURE__*/React.createElement("div", {
449
+ style: {
450
+ marginTop: '24px',
451
+ fontSize: '16px'
452
+ }
453
+ }, card.userName), /*#__PURE__*/React.createElement("div", {
454
+ style: {
455
+ display: 'flex',
456
+ justifyContent: 'space-between',
457
+ marginTop: '16px',
458
+ fontSize: '12px',
459
+ opacity: 0.8
460
+ }
461
+ }, /*#__PURE__*/React.createElement("span", null, t('validUntil'), ": ", card.expiryDate), /*#__PURE__*/React.createElement("span", null, card.points, " ", t('points'))));
462
+ }
463
+
464
+ /**
465
+ * 会员权益列表组件
466
+ * @param {Object} props
467
+ * @param {Array} props.benefits - 权益列表
468
+ * @param {Function} props.onUseBenefit - 使用权益回调
469
+ */
470
+ function BenefitList({
471
+ benefits = [],
472
+ onUseBenefit
473
+ }) {
474
+ if (!benefits.length) {
475
+ return /*#__PURE__*/React.createElement("div", {
476
+ className: "eco-empty"
477
+ }, t('noBenefits'));
478
+ }
479
+ return /*#__PURE__*/React.createElement("div", {
480
+ className: "eco-benefit-list"
481
+ }, benefits.map(benefit => /*#__PURE__*/React.createElement("div", {
482
+ key: benefit.id,
483
+ className: "eco-benefit-item",
484
+ style: {
485
+ display: 'flex',
486
+ justifyContent: 'space-between',
487
+ alignItems: 'center',
488
+ padding: '12px 16px',
489
+ borderBottom: '1px solid #f0f0f0'
490
+ }
491
+ }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
492
+ style: {
493
+ fontWeight: 500
494
+ }
495
+ }, benefit.name), /*#__PURE__*/React.createElement("div", {
496
+ style: {
497
+ fontSize: '12px',
498
+ color: '#999'
499
+ }
500
+ }, benefit.description)), benefit.available && /*#__PURE__*/React.createElement("button", {
501
+ className: "eco-btn eco-btn-sm",
502
+ onClick: () => onUseBenefit?.(benefit.id)
503
+ }, t('use')))));
504
+ }
505
+
506
+ /**
507
+ * @quantabit/membership-sdk
508
+ *
509
+ * QuantaBit Membership SDK
510
+ *
511
+ * Provides reusable membership card features:
512
+ * - Membership card display & management
513
+ * - Points-based card redemption
514
+ * - Card upgrade & extension
515
+ * - Benefit management & usage
516
+ */
517
+
518
+ // ============ Types ============
519
+ const CardType = {
520
+ BASIC: 'basic',
521
+ SILVER: 'silver',
522
+ GOLD: 'gold',
523
+ PLATINUM: 'platinum'
524
+ };
525
+ const CardStatus = {
526
+ ACTIVE: 'active',
527
+ EXPIRED: 'expired',
528
+ FROZEN: 'frozen'
529
+ };
530
+
531
+ exports.BenefitList = BenefitList;
532
+ exports.CardStatus = CardStatus;
533
+ exports.CardType = CardType;
534
+ exports.MembershipApiClient = MembershipApiClient;
535
+ exports.MembershipCard = MembershipCard;
536
+ exports.SUPPORTED_LANGUAGES = SUPPORTED_LANGUAGES;
537
+ exports.getLanguage = getLanguage;
538
+ exports.membershipApi = membershipApi;
539
+ exports.messages = messages;
540
+ exports.setLanguage = setLanguage;
541
+ exports.t = t;
542
+ exports.useBenefits = useBenefits;
543
+ exports.useMembershipCard = useMembershipCard;
544
+ exports.useMembershipCards = useMembershipCards;
545
+
546
+ return exports;
547
+
548
+ })({}, sdkConfig, React);
549
+ //# sourceMappingURL=index.iife.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.iife.js","sources":["../src/services/membershipApi.js","../src/hooks/useMembership.js","../src/i18n/index.js","../src/components/Membership.jsx","../src/index.js"],"sourcesContent":["/**\n * Membership SDK - API 客户端\n * 会员卡系统后端接口封装\n * \n * 使用 BaseApiClient 基类,继承统一的配置、认证、错误处理\n */\n\nimport { BaseApiClient } from '@quantabit/sdk-config';\n\n/**\n * 会员卡 API 客户端\n */\nexport class MembershipApiClient extends BaseApiClient {\n constructor(config = {}) {\n super('/membership', config);\n }\n\n // ============ 会员卡查询 ============\n\n /**\n * 获取当前用户的会员卡\n */\n async getMyCard() {\n return this.get('/card');\n }\n\n /**\n * 获取所有会员卡类型\n */\n async getCards() {\n return this.get('/cards');\n }\n\n /**\n * 获取会员卡详情\n * @param {string} cardId - 会员卡 ID\n */\n async getCardDetail(cardId) {\n return this.get(`/cards/${cardId}`);\n }\n\n // ============ 会员卡操作 ============\n\n /**\n * 使用积分兑换会员卡\n * @param {string} cardType - 卡片类型 (basic/silver/gold/platinum)\n * @param {number} points - 积分数量\n */\n async redeemWithPoints(cardType, points) {\n return this.post('/redeem', { cardType, points });\n }\n\n /**\n * 延长会员卡有效期\n * @param {string} cardId - 会员卡 ID\n * @param {number} months - 延长月数\n */\n async extendCard(cardId, months) {\n return this.post(`/cards/${cardId}/extend`, { months });\n }\n\n /**\n * 升级会员卡\n * @param {string} cardId - 会员卡 ID\n * @param {string} targetType - 目标卡片类型\n */\n async upgradeCard(cardId, targetType) {\n return this.post(`/cards/${cardId}/upgrade`, { target_type: targetType });\n }\n\n // ============ 权益管理 ============\n\n /**\n * 获取卡片权益列表\n * @param {string} cardType - 卡片类型\n */\n async getBenefits(cardType) {\n return this.get(`/cards/${cardType}/benefits`);\n }\n\n /**\n * 使用权益\n * @param {string} benefitId - 权益 ID\n */\n async useBenefit(benefitId) {\n return this.post(`/benefits/${benefitId}/use`);\n }\n\n /**\n * 获取权益使用记录\n * @param {Object} params - 查询参数\n */\n async getBenefitHistory(params = {}) {\n return this.get('/benefits/history', params);\n }\n}\n\n// 创建默认实例\nexport const membershipApi = new MembershipApiClient();\n\nexport default membershipApi;\n","/**\n * Membership SDK - React Hooks\n * 会员卡 React 钩子\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { membershipApi } from '../services/membershipApi';\n\n/**\n * 获取当前用户的会员卡信息\n */\nexport function useMembershipCard() {\n const [card, setCard] = useState(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n\n const fetchCard = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await membershipApi.getMyCard();\n setCard(result.data || result);\n } catch (err) {\n setError(err.message);\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchCard();\n }, [fetchCard]);\n\n return { card, loading, error, refresh: fetchCard };\n}\n\n/**\n * 获取所有可用的会员卡类型\n */\nexport function useMembershipCards() {\n const [cards, setCards] = useState([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n\n const fetchCards = useCallback(async () => {\n setLoading(true);\n try {\n const result = await membershipApi.getCards();\n setCards(result.data || []);\n } catch (err) {\n setError(err.message);\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchCards();\n }, [fetchCards]);\n\n return { cards, loading, error, refresh: fetchCards };\n}\n\n/**\n * 会员卡权益管理\n * @param {string} cardType - 卡片类型\n */\nexport function useBenefits(cardType) {\n const [benefits, setBenefits] = useState([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n\n const fetchBenefits = useCallback(async () => {\n if (!cardType) return;\n setLoading(true);\n try {\n const result = await membershipApi.getBenefits(cardType);\n setBenefits(result.data || []);\n } catch (err) {\n setError(err.message);\n } finally {\n setLoading(false);\n }\n }, [cardType]);\n\n const useBenefit = useCallback(async (benefitId) => {\n const result = await membershipApi.useBenefit(benefitId);\n await fetchBenefits();\n return result;\n }, [fetchBenefits]);\n\n useEffect(() => {\n fetchBenefits();\n }, [fetchBenefits]);\n\n return { benefits, loading, error, useBenefit, refresh: fetchBenefits };\n}\n","/**\n * Membership SDK - 国际化\n * 会员卡系统多语言支持\n */\n\nexport const SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];\n\nexport const messages = {\n zh: {\n membershipCard: '会员卡',\n cardType: {\n basic: '基础会员',\n silver: '银卡会员',\n gold: '金卡会员',\n platinum: '铂金会员',\n },\n validUntil: '有效期至',\n points: '积分',\n use: '使用',\n noBenefits: '暂无可用权益',\n redeem: '兑换',\n upgrade: '升级',\n extend: '续期',\n benefits: '会员权益',\n history: '使用记录',\n loading: '加载中...',\n expired: '已过期',\n active: '有效',\n frozen: '已冻结',\n },\n en: {\n membershipCard: 'Membership Card',\n cardType: {\n basic: 'Basic',\n silver: 'Silver',\n gold: 'Gold',\n platinum: 'Platinum',\n },\n validUntil: 'Valid until',\n points: 'Points',\n use: 'Use',\n noBenefits: 'No benefits available',\n redeem: 'Redeem',\n upgrade: 'Upgrade',\n extend: 'Extend',\n benefits: 'Benefits',\n history: 'History',\n loading: 'Loading...',\n expired: 'Expired',\n active: 'Active',\n frozen: 'Frozen',\n },\n ja: {\n membershipCard: 'メンバーシップカード',\n cardType: {\n basic: 'ベーシック',\n silver: 'シルバー',\n gold: 'ゴールド',\n platinum: 'プラチナ',\n },\n validUntil: '有効期限',\n points: 'ポイント',\n use: '使用',\n noBenefits: '利用可能な特典はありません',\n redeem: '交換',\n upgrade: 'アップグレード',\n extend: '延長',\n benefits: '特典',\n history: '履歴',\n loading: '読み込み中...',\n expired: '期限切れ',\n active: '有効',\n frozen: '凍結',\n },\n ko: {\n membershipCard: '멤버십 카드',\n cardType: {\n basic: '기본',\n silver: '실버',\n gold: '골드',\n platinum: '플래티넘',\n },\n validUntil: '유효 기한',\n points: '포인트',\n use: '사용',\n noBenefits: '사용 가능한 혜택이 없습니다',\n redeem: '교환',\n upgrade: '업그레이드',\n extend: '연장',\n benefits: '혜택',\n history: '기록',\n loading: '로딩 중...',\n expired: '만료',\n active: '활성',\n frozen: '동결',\n },\n};\n\n// 当前语言\nlet currentLanguage = 'zh';\n\n/**\n * 设置语言\n * @param {string} lang - 语言代码\n */\nexport function setLanguage(lang) {\n if (SUPPORTED_LANGUAGES.includes(lang)) {\n currentLanguage = lang;\n }\n}\n\n/**\n * 获取当前语言\n * @returns {string}\n */\nexport function getLanguage() {\n return currentLanguage;\n}\n\n/**\n * 翻译函数\n * @param {string} key - 翻译键,支持点号路径(如 'cardType.gold')\n * @param {Object} params - 插值参数\n * @returns {string}\n */\nexport function t(key, params = {}) {\n const lang = messages[currentLanguage] || messages.zh;\n \n // 支持点号路径访问\n const keys = key.split('.');\n let value = lang;\n for (const k of keys) {\n value = value?.[k];\n if (value === undefined) break;\n }\n \n if (typeof value !== 'string') {\n // 回退到中文\n value = lang;\n for (const k of keys) {\n value = value?.[k];\n if (value === undefined) break;\n }\n }\n \n if (typeof value !== 'string') return key;\n \n // 简单插值替换\n return value.replace(/\\{(\\w+)\\}/g, (_, k) => params[k] ?? '');\n}\n\n// 监听全局语言变更事件\nif (typeof window !== 'undefined') {\n window.addEventListener('qbit-did:language-change', (e) => {\n if (e.detail?.language) {\n setLanguage(e.detail.language);\n }\n });\n}\n","/**\n * Membership SDK - 会员卡组件\n * 支持 i18n 国际化\n */\n\nimport React from 'react';\nimport { t } from '../i18n';\n\n/**\n * 会员卡类型对应的渐变色配置\n */\nconst CARD_GRADIENTS = {\n basic: { from: '#6b7280', to: '#4b5563', label: '🪪' },\n silver: { from: '#94a3b8', to: '#64748b', label: '🥈' },\n gold: { from: '#f59e0b', to: '#d97706', label: '🥇' },\n platinum: { from: '#a855f7', to: '#7c3aed', label: '💎' },\n};\n\n/**\n * 会员卡展示组件\n * @param {Object} props\n * @param {Object} props.card - 会员卡数据\n * @param {Function} props.onClick - 点击回调\n */\nexport function MembershipCard({ card, onClick }) {\n if (!card) return null;\n\n const gradient = CARD_GRADIENTS[card.type] || CARD_GRADIENTS.basic;\n\n return (\n <div\n className=\"eco-membership-card\"\n style={{\n background: `linear-gradient(135deg, ${gradient.from}, ${gradient.to})`,\n borderRadius: '16px',\n padding: '24px',\n color: '#fff',\n cursor: onClick ? 'pointer' : 'default',\n position: 'relative',\n overflow: 'hidden',\n minHeight: '180px',\n }}\n onClick={() => onClick?.(card)}\n >\n <div style={{ position: 'absolute', top: '16px', right: '20px', fontSize: '32px', opacity: 0.3 }}>\n {gradient.label}\n </div>\n <div style={{ fontSize: '12px', letterSpacing: '2px', textTransform: 'uppercase', opacity: 0.8 }}>\n {t('membershipCard')}\n </div>\n <div style={{ fontSize: '20px', fontWeight: 'bold', marginTop: '8px', textTransform: 'uppercase' }}>\n {t(`cardType.${card.type}`) || card.type}\n </div>\n <div style={{ marginTop: '24px', fontSize: '16px' }}>\n {card.userName}\n </div>\n <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: '16px', fontSize: '12px', opacity: 0.8 }}>\n <span>{t('validUntil')}: {card.expiryDate}</span>\n <span>{card.points} {t('points')}</span>\n </div>\n </div>\n );\n}\n\n/**\n * 会员权益列表组件\n * @param {Object} props\n * @param {Array} props.benefits - 权益列表\n * @param {Function} props.onUseBenefit - 使用权益回调\n */\nexport function BenefitList({ benefits = [], onUseBenefit }) {\n if (!benefits.length) {\n return <div className=\"eco-empty\">{t('noBenefits')}</div>;\n }\n\n return (\n <div className=\"eco-benefit-list\">\n {benefits.map((benefit) => (\n <div key={benefit.id} className=\"eco-benefit-item\" style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '12px 16px',\n borderBottom: '1px solid #f0f0f0',\n }}>\n <div>\n <div style={{ fontWeight: 500 }}>{benefit.name}</div>\n <div style={{ fontSize: '12px', color: '#999' }}>{benefit.description}</div>\n </div>\n {benefit.available && (\n <button\n className=\"eco-btn eco-btn-sm\"\n onClick={() => onUseBenefit?.(benefit.id)}\n >\n {t('use')}\n </button>\n )}\n </div>\n ))}\n </div>\n );\n}\n","/**\n * @quantabit/membership-sdk\n * \n * QuantaBit Membership SDK\n * \n * Provides reusable membership card features:\n * - Membership card display & management\n * - Points-based card redemption\n * - Card upgrade & extension\n * - Benefit management & usage\n */\n\n// ============ Types ============\nexport const CardType = {\n BASIC: 'basic',\n SILVER: 'silver',\n GOLD: 'gold',\n PLATINUM: 'platinum',\n};\n\nexport const CardStatus = {\n ACTIVE: 'active',\n EXPIRED: 'expired',\n FROZEN: 'frozen',\n};\n\n// ============ Services ============\nexport { MembershipApiClient, membershipApi } from './services/membershipApi';\n\n// ============ Hooks ============\nexport { useMembershipCard, useMembershipCards, useBenefits } from './hooks/useMembership';\n\n// ============ Components ============\nexport { MembershipCard, BenefitList } from './components/Membership';\n\n// ============ i18n ============\nexport {\n messages,\n SUPPORTED_LANGUAGES,\n setLanguage,\n getLanguage,\n t,\n} from './i18n';\n\n// ============ Styles ============\nimport './styles/membership.css';\n"],"names":["MembershipApiClient","BaseApiClient","constructor","config","getMyCard","get","getCards","getCardDetail","cardId","redeemWithPoints","cardType","points","post","extendCard","months","upgradeCard","targetType","target_type","getBenefits","useBenefit","benefitId","getBenefitHistory","params","membershipApi","useMembershipCard","card","setCard","useState","loading","setLoading","error","setError","fetchCard","useCallback","result","data","err","message","useEffect","refresh","useMembershipCards","cards","setCards","fetchCards","useBenefits","benefits","setBenefits","fetchBenefits","SUPPORTED_LANGUAGES","messages","zh","membershipCard","basic","silver","gold","platinum","validUntil","use","noBenefits","redeem","upgrade","extend","history","expired","active","frozen","en","ja","ko","currentLanguage","setLanguage","lang","includes","getLanguage","t","key","keys","split","value","k","undefined","replace","_","window","addEventListener","e","detail","language","CARD_GRADIENTS","from","to","label","MembershipCard","onClick","gradient","type","React","createElement","className","style","background","borderRadius","padding","color","cursor","position","overflow","minHeight","top","right","fontSize","opacity","letterSpacing","textTransform","fontWeight","marginTop","userName","display","justifyContent","expiryDate","BenefitList","onUseBenefit","length","map","benefit","id","alignItems","borderBottom","name","description","available","CardType","BASIC","SILVER","GOLD","PLATINUM","CardStatus","ACTIVE","EXPIRED","FROZEN"],"mappings":"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"}