@quantabit/newbie-protect-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.
- package/LICENSE +21 -0
- package/README.md +80 -0
- package/dist/index.cjs +406 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.esm.js +394 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.iife.js +407 -0
- package/dist/index.iife.js.map +1 -0
- package/dist/index.umd.js +408 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/styles.css +0 -0
- package/package.json +79 -0
- package/types/index.d.ts +54 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { BaseApiClient } from '@quantabit/sdk-config';
|
|
3
|
+
import React, { useState, useCallback, useEffect } from 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Newbie Protect SDK - API 客户端
|
|
7
|
+
* 新手保护系统后端接口封装
|
|
8
|
+
*
|
|
9
|
+
* 使用 BaseApiClient 基类简化代码
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 新手保护 API 客户端
|
|
15
|
+
*/
|
|
16
|
+
class NewbieProtectApiClient extends BaseApiClient {
|
|
17
|
+
constructor(config = {}) {
|
|
18
|
+
super('/newbie/protect', config);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// ============ 保护状态 ============
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 获取新手保护状态
|
|
25
|
+
*/
|
|
26
|
+
async getProtectionStatus() {
|
|
27
|
+
return this.get('/status');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 检查用户是否在保护期
|
|
32
|
+
* @param {string} userId - 用户 ID
|
|
33
|
+
*/
|
|
34
|
+
async checkProtection(userId) {
|
|
35
|
+
return this.get(`/check/${userId}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 获取保护期剩余时间
|
|
40
|
+
*/
|
|
41
|
+
async getRemainingTime() {
|
|
42
|
+
return this.get('/remaining');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ============ 保护规则 ============
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 获取保护规则列表
|
|
49
|
+
*/
|
|
50
|
+
async getProtectionRules() {
|
|
51
|
+
return this.get('/rules');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 获取特定规则详情
|
|
56
|
+
* @param {string} ruleId - 规则 ID
|
|
57
|
+
*/
|
|
58
|
+
async getRule(ruleId) {
|
|
59
|
+
return this.get(`/rules/${ruleId}`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 检查操作是否被保护
|
|
64
|
+
* @param {string} action - 操作类型
|
|
65
|
+
*/
|
|
66
|
+
async checkActionProtection(action) {
|
|
67
|
+
return this.post('/check-action', {
|
|
68
|
+
action
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// ============ 限制管理 ============
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 获取当前限制
|
|
76
|
+
*/
|
|
77
|
+
async getCurrentLimits() {
|
|
78
|
+
return this.get('/limits');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 获取交易限额
|
|
83
|
+
*/
|
|
84
|
+
async getTransactionLimits() {
|
|
85
|
+
return this.get('/limits/transaction');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 获取提现限额
|
|
90
|
+
*/
|
|
91
|
+
async getWithdrawLimits() {
|
|
92
|
+
return this.get('/limits/withdraw');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ============ 升级/解除 ============
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* 申请解除保护
|
|
99
|
+
* @param {Object} application - 申请数据
|
|
100
|
+
*/
|
|
101
|
+
async requestRemoveProtection(application) {
|
|
102
|
+
return this.post('/remove/request', application);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 获取解除条件
|
|
107
|
+
*/
|
|
108
|
+
async getRemoveConditions() {
|
|
109
|
+
return this.get('/remove/conditions');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 检查解除条件完成状态
|
|
114
|
+
*/
|
|
115
|
+
async checkRemoveProgress() {
|
|
116
|
+
return this.get('/remove/progress');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 完成验证以解除保护
|
|
121
|
+
* @param {Object} verification - 验证数据
|
|
122
|
+
*/
|
|
123
|
+
async verifyToRemove(verification) {
|
|
124
|
+
return this.post('/remove/verify', verification);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ============ 新手引导 ============
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* 获取新手任务
|
|
131
|
+
*/
|
|
132
|
+
async getNewbieTasks() {
|
|
133
|
+
return this.get('/tasks');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* 完成新手任务
|
|
138
|
+
* @param {string} taskId - 任务 ID
|
|
139
|
+
*/
|
|
140
|
+
async completeTask(taskId) {
|
|
141
|
+
return this.post(`/tasks/${taskId}/complete`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* 获取新手奖励
|
|
146
|
+
*/
|
|
147
|
+
async getNewbieRewards() {
|
|
148
|
+
return this.get('/rewards');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* 领取新手奖励
|
|
153
|
+
* @param {string} rewardId - 奖励 ID
|
|
154
|
+
*/
|
|
155
|
+
async claimReward(rewardId) {
|
|
156
|
+
return this.post(`/rewards/${rewardId}/claim`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// 创建默认实例
|
|
161
|
+
const newbieProtectApi = new NewbieProtectApiClient();
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Newbie Protect SDK - React Hooks
|
|
165
|
+
*/
|
|
166
|
+
|
|
167
|
+
function useNewbieProtect() {
|
|
168
|
+
const [protectionStatus, setProtectionStatus] = useState(null);
|
|
169
|
+
const [remainingTime, setRemainingTime] = useState(null);
|
|
170
|
+
const [tasks, setTasks] = useState([]);
|
|
171
|
+
const [loading, setLoading] = useState(false);
|
|
172
|
+
const [error, setError] = useState(null);
|
|
173
|
+
const fetchStatus = useCallback(async () => {
|
|
174
|
+
setLoading(true);
|
|
175
|
+
try {
|
|
176
|
+
const result = await newbieProtectApi.getProtectionStatus();
|
|
177
|
+
setProtectionStatus(result.data);
|
|
178
|
+
} catch (err) {
|
|
179
|
+
setError(err.message);
|
|
180
|
+
} finally {
|
|
181
|
+
setLoading(false);
|
|
182
|
+
}
|
|
183
|
+
}, []);
|
|
184
|
+
const fetchRemainingTime = useCallback(async () => {
|
|
185
|
+
try {
|
|
186
|
+
const result = await newbieProtectApi.getRemainingTime();
|
|
187
|
+
setRemainingTime(result.data?.remaining);
|
|
188
|
+
} catch (err) {
|
|
189
|
+
setError(err.message);
|
|
190
|
+
}
|
|
191
|
+
}, []);
|
|
192
|
+
const fetchTasks = useCallback(async () => {
|
|
193
|
+
try {
|
|
194
|
+
const result = await newbieProtectApi.getNewbieTasks();
|
|
195
|
+
setTasks(result.data || []);
|
|
196
|
+
} catch (err) {
|
|
197
|
+
setError(err.message);
|
|
198
|
+
}
|
|
199
|
+
}, []);
|
|
200
|
+
const completeTask = useCallback(async taskId => {
|
|
201
|
+
try {
|
|
202
|
+
await newbieProtectApi.completeTask(taskId);
|
|
203
|
+
await fetchTasks();
|
|
204
|
+
} catch (err) {
|
|
205
|
+
setError(err.message);
|
|
206
|
+
throw err;
|
|
207
|
+
}
|
|
208
|
+
}, [fetchTasks]);
|
|
209
|
+
const claimReward = useCallback(async rewardId => {
|
|
210
|
+
try {
|
|
211
|
+
return await newbieProtectApi.claimReward(rewardId);
|
|
212
|
+
} catch (err) {
|
|
213
|
+
setError(err.message);
|
|
214
|
+
throw err;
|
|
215
|
+
}
|
|
216
|
+
}, []);
|
|
217
|
+
useEffect(() => {
|
|
218
|
+
fetchStatus();
|
|
219
|
+
fetchRemainingTime();
|
|
220
|
+
fetchTasks();
|
|
221
|
+
}, [fetchStatus, fetchRemainingTime, fetchTasks]);
|
|
222
|
+
return {
|
|
223
|
+
protectionStatus,
|
|
224
|
+
remainingTime,
|
|
225
|
+
tasks,
|
|
226
|
+
loading,
|
|
227
|
+
error,
|
|
228
|
+
isProtected: protectionStatus?.is_protected || false,
|
|
229
|
+
fetchStatus,
|
|
230
|
+
fetchTasks,
|
|
231
|
+
completeTask,
|
|
232
|
+
claimReward
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Newbie Protect SDK - 新手保护组件
|
|
238
|
+
*/
|
|
239
|
+
|
|
240
|
+
function NewbieProtectBanner() {
|
|
241
|
+
const {
|
|
242
|
+
isProtected,
|
|
243
|
+
remainingTime,
|
|
244
|
+
loading
|
|
245
|
+
} = useNewbieProtect();
|
|
246
|
+
if (loading || !isProtected) return null;
|
|
247
|
+
const days = Math.floor(remainingTime / (24 * 60 * 60 * 1000));
|
|
248
|
+
const hours = Math.floor(remainingTime % (24 * 60 * 60 * 1000) / (60 * 60 * 1000));
|
|
249
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
250
|
+
className: "eco-newbie-banner"
|
|
251
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
252
|
+
className: "eco-shield-icon"
|
|
253
|
+
}, "\uD83D\uDEE1\uFE0F"), /*#__PURE__*/React.createElement("div", {
|
|
254
|
+
className: "eco-banner-content"
|
|
255
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
256
|
+
className: "eco-banner-title"
|
|
257
|
+
}, "\u65B0\u624B\u4FDD\u62A4\u671F"), /*#__PURE__*/React.createElement("span", {
|
|
258
|
+
className: "eco-banner-time"
|
|
259
|
+
}, "\u5269\u4F59 ", days > 0 ? `${days}天` : '', " ", hours, "\u5C0F\u65F6")));
|
|
260
|
+
}
|
|
261
|
+
function NewbieTaskList() {
|
|
262
|
+
const {
|
|
263
|
+
tasks,
|
|
264
|
+
loading,
|
|
265
|
+
completeTask,
|
|
266
|
+
claimReward
|
|
267
|
+
} = useNewbieProtect();
|
|
268
|
+
if (loading) {
|
|
269
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
270
|
+
className: "eco-loading"
|
|
271
|
+
}, "\u52A0\u8F7D\u4E2D...");
|
|
272
|
+
}
|
|
273
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
274
|
+
className: "eco-newbie-tasks"
|
|
275
|
+
}, /*#__PURE__*/React.createElement("h3", null, "\u65B0\u624B\u4EFB\u52A1"), /*#__PURE__*/React.createElement("div", {
|
|
276
|
+
className: "eco-task-list"
|
|
277
|
+
}, tasks.map(task => /*#__PURE__*/React.createElement("div", {
|
|
278
|
+
key: task.id,
|
|
279
|
+
className: `eco-task-item ${task.completed ? 'completed' : ''}`
|
|
280
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
281
|
+
className: "eco-task-icon"
|
|
282
|
+
}, task.icon || '📋'), /*#__PURE__*/React.createElement("div", {
|
|
283
|
+
className: "eco-task-info"
|
|
284
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
285
|
+
className: "eco-task-name"
|
|
286
|
+
}, task.name), /*#__PURE__*/React.createElement("span", {
|
|
287
|
+
className: "eco-task-desc"
|
|
288
|
+
}, task.description)), /*#__PURE__*/React.createElement("div", {
|
|
289
|
+
className: "eco-task-reward"
|
|
290
|
+
}, "+", task.reward), task.completed ? task.claimed ? /*#__PURE__*/React.createElement("span", {
|
|
291
|
+
className: "eco-claimed"
|
|
292
|
+
}, "\u5DF2\u9886\u53D6") : /*#__PURE__*/React.createElement("button", {
|
|
293
|
+
className: "eco-btn eco-btn-sm eco-btn-primary",
|
|
294
|
+
onClick: () => claimReward(task.id)
|
|
295
|
+
}, "\u9886\u53D6") : /*#__PURE__*/React.createElement("button", {
|
|
296
|
+
className: "eco-btn eco-btn-sm",
|
|
297
|
+
onClick: () => completeTask(task.id)
|
|
298
|
+
}, "\u5B8C\u6210")))));
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Newbie Protect SDK - 国际化
|
|
303
|
+
*/
|
|
304
|
+
|
|
305
|
+
const zh = {
|
|
306
|
+
newbieProtect: {
|
|
307
|
+
title: '新手保护',
|
|
308
|
+
subtitle: '安全的新手引导期',
|
|
309
|
+
status: {
|
|
310
|
+
protected: '保护中',
|
|
311
|
+
expired: '已结束',
|
|
312
|
+
removed: '已解除'
|
|
313
|
+
},
|
|
314
|
+
remaining: '剩余保护时间',
|
|
315
|
+
days: '天',
|
|
316
|
+
hours: '小时',
|
|
317
|
+
tasks: {
|
|
318
|
+
title: '新手任务',
|
|
319
|
+
complete: '完成',
|
|
320
|
+
completed: '已完成',
|
|
321
|
+
reward: '奖励'
|
|
322
|
+
},
|
|
323
|
+
limits: {
|
|
324
|
+
title: '当前限制',
|
|
325
|
+
transaction: '交易限额',
|
|
326
|
+
withdraw: '提现限额'
|
|
327
|
+
},
|
|
328
|
+
remove: {
|
|
329
|
+
title: '申请解除',
|
|
330
|
+
conditions: '解除条件',
|
|
331
|
+
verify: '验证解除',
|
|
332
|
+
success: '已成功解除保护'
|
|
333
|
+
},
|
|
334
|
+
messages: {
|
|
335
|
+
taskCompleted: '任务完成',
|
|
336
|
+
rewardClaimed: '奖励已领取'
|
|
337
|
+
},
|
|
338
|
+
errors: {
|
|
339
|
+
fetchFailed: '获取状态失败'
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
const en = {
|
|
344
|
+
newbieProtect: {
|
|
345
|
+
title: 'Newbie Protection',
|
|
346
|
+
subtitle: 'Safe onboarding period',
|
|
347
|
+
status: {
|
|
348
|
+
protected: 'Protected',
|
|
349
|
+
expired: 'Expired',
|
|
350
|
+
removed: 'Removed'
|
|
351
|
+
},
|
|
352
|
+
remaining: 'Remaining Time',
|
|
353
|
+
days: 'days',
|
|
354
|
+
hours: 'hours',
|
|
355
|
+
tasks: {
|
|
356
|
+
title: 'Newbie Tasks',
|
|
357
|
+
complete: 'Complete',
|
|
358
|
+
completed: 'Completed',
|
|
359
|
+
reward: 'Reward'
|
|
360
|
+
},
|
|
361
|
+
limits: {
|
|
362
|
+
title: 'Current Limits',
|
|
363
|
+
transaction: 'Transaction Limit',
|
|
364
|
+
withdraw: 'Withdraw Limit'
|
|
365
|
+
},
|
|
366
|
+
remove: {
|
|
367
|
+
title: 'Request Removal',
|
|
368
|
+
conditions: 'Removal Conditions',
|
|
369
|
+
verify: 'Verify Removal',
|
|
370
|
+
success: 'Protection removed successfully'
|
|
371
|
+
},
|
|
372
|
+
messages: {
|
|
373
|
+
taskCompleted: 'Task completed',
|
|
374
|
+
rewardClaimed: 'Reward claimed'
|
|
375
|
+
},
|
|
376
|
+
errors: {
|
|
377
|
+
fetchFailed: 'Failed to fetch status'
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* @quantabit/newbie-protect-sdk - Newbie Protection SDK
|
|
384
|
+
*/
|
|
385
|
+
|
|
386
|
+
// Type Definitions
|
|
387
|
+
const ProtectionStatus = {
|
|
388
|
+
ACTIVE: 'active',
|
|
389
|
+
EXPIRED: 'expired',
|
|
390
|
+
REMOVED: 'removed'
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
export { NewbieProtectApiClient, NewbieProtectBanner, NewbieTaskList, ProtectionStatus, newbieProtectApi as default, en, newbieProtectApi, useNewbieProtect, zh };
|
|
394
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/services/newbieProtectApi.js","../src/hooks/useNewbieProtect.js","../src/components/NewbieProtect.jsx","../src/i18n/index.js","../src/index.js"],"sourcesContent":["/**\n * Newbie Protect SDK - API 客户端\n * 新手保护系统后端接口封装\n * \n * 使用 BaseApiClient 基类简化代码\n */\n\nimport { BaseApiClient } from '@quantabit/sdk-config';\n\n/**\n * 新手保护 API 客户端\n */\nexport class NewbieProtectApiClient extends BaseApiClient {\n constructor(config = {}) {\n super('/newbie/protect', config);\n }\n\n // ============ 保护状态 ============\n\n /**\n * 获取新手保护状态\n */\n async getProtectionStatus() {\n return this.get('/status');\n }\n\n /**\n * 检查用户是否在保护期\n * @param {string} userId - 用户 ID\n */\n async checkProtection(userId) {\n return this.get(`/check/${userId}`);\n }\n\n /**\n * 获取保护期剩余时间\n */\n async getRemainingTime() {\n return this.get('/remaining');\n }\n\n // ============ 保护规则 ============\n\n /**\n * 获取保护规则列表\n */\n async getProtectionRules() {\n return this.get('/rules');\n }\n\n /**\n * 获取特定规则详情\n * @param {string} ruleId - 规则 ID\n */\n async getRule(ruleId) {\n return this.get(`/rules/${ruleId}`);\n }\n\n /**\n * 检查操作是否被保护\n * @param {string} action - 操作类型\n */\n async checkActionProtection(action) {\n return this.post('/check-action', { action });\n }\n\n // ============ 限制管理 ============\n\n /**\n * 获取当前限制\n */\n async getCurrentLimits() {\n return this.get('/limits');\n }\n\n /**\n * 获取交易限额\n */\n async getTransactionLimits() {\n return this.get('/limits/transaction');\n }\n\n /**\n * 获取提现限额\n */\n async getWithdrawLimits() {\n return this.get('/limits/withdraw');\n }\n\n // ============ 升级/解除 ============\n\n /**\n * 申请解除保护\n * @param {Object} application - 申请数据\n */\n async requestRemoveProtection(application) {\n return this.post('/remove/request', application);\n }\n\n /**\n * 获取解除条件\n */\n async getRemoveConditions() {\n return this.get('/remove/conditions');\n }\n\n /**\n * 检查解除条件完成状态\n */\n async checkRemoveProgress() {\n return this.get('/remove/progress');\n }\n\n /**\n * 完成验证以解除保护\n * @param {Object} verification - 验证数据\n */\n async verifyToRemove(verification) {\n return this.post('/remove/verify', verification);\n }\n\n // ============ 新手引导 ============\n\n /**\n * 获取新手任务\n */\n async getNewbieTasks() {\n return this.get('/tasks');\n }\n\n /**\n * 完成新手任务\n * @param {string} taskId - 任务 ID\n */\n async completeTask(taskId) {\n return this.post(`/tasks/${taskId}/complete`);\n }\n\n /**\n * 获取新手奖励\n */\n async getNewbieRewards() {\n return this.get('/rewards');\n }\n\n /**\n * 领取新手奖励\n * @param {string} rewardId - 奖励 ID\n */\n async claimReward(rewardId) {\n return this.post(`/rewards/${rewardId}/claim`);\n }\n}\n\n// 创建默认实例\nexport const newbieProtectApi = new NewbieProtectApiClient();\n\n\n\nexport default newbieProtectApi;\n","/**\n * Newbie Protect SDK - React Hooks\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { newbieProtectApi } from '../services/newbieProtectApi';\n\nexport function useNewbieProtect() {\n const [protectionStatus, setProtectionStatus] = useState(null);\n const [remainingTime, setRemainingTime] = useState(null);\n const [tasks, setTasks] = useState([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n\n const fetchStatus = useCallback(async () => {\n setLoading(true);\n try {\n const result = await newbieProtectApi.getProtectionStatus();\n setProtectionStatus(result.data);\n } catch (err) {\n setError(err.message);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const fetchRemainingTime = useCallback(async () => {\n try {\n const result = await newbieProtectApi.getRemainingTime();\n setRemainingTime(result.data?.remaining);\n } catch (err) {\n setError(err.message);\n }\n }, []);\n\n const fetchTasks = useCallback(async () => {\n try {\n const result = await newbieProtectApi.getNewbieTasks();\n setTasks(result.data || []);\n } catch (err) {\n setError(err.message);\n }\n }, []);\n\n const completeTask = useCallback(async (taskId) => {\n try {\n await newbieProtectApi.completeTask(taskId);\n await fetchTasks();\n } catch (err) {\n setError(err.message);\n throw err;\n }\n }, [fetchTasks]);\n\n const claimReward = useCallback(async (rewardId) => {\n try {\n return await newbieProtectApi.claimReward(rewardId);\n } catch (err) {\n setError(err.message);\n throw err;\n }\n }, []);\n\n useEffect(() => {\n fetchStatus();\n fetchRemainingTime();\n fetchTasks();\n }, [fetchStatus, fetchRemainingTime, fetchTasks]);\n\n return {\n protectionStatus,\n remainingTime,\n tasks,\n loading,\n error,\n isProtected: protectionStatus?.is_protected || false,\n fetchStatus,\n fetchTasks,\n completeTask,\n claimReward,\n };\n}\n\n","/**\n * Newbie Protect SDK - 新手保护组件\n */\n\nimport React from 'react';\nimport { useNewbieProtect } from '../hooks/useNewbieProtect';\n\nexport function NewbieProtectBanner() {\n const { isProtected, remainingTime, loading } = useNewbieProtect();\n\n if (loading || !isProtected) return null;\n\n const days = Math.floor(remainingTime / (24 * 60 * 60 * 1000));\n const hours = Math.floor((remainingTime % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));\n\n return (\n <div className=\"eco-newbie-banner\">\n <span className=\"eco-shield-icon\">🛡️</span>\n <div className=\"eco-banner-content\">\n <span className=\"eco-banner-title\">新手保护期</span>\n <span className=\"eco-banner-time\">\n 剩余 {days > 0 ? `${days}天` : ''} {hours}小时\n </span>\n </div>\n </div>\n );\n}\n\nexport function NewbieTaskList() {\n const { tasks, loading, completeTask, claimReward } = useNewbieProtect();\n\n if (loading) {\n return <div className=\"eco-loading\">加载中...</div>;\n }\n\n return (\n <div className=\"eco-newbie-tasks\">\n <h3>新手任务</h3>\n <div className=\"eco-task-list\">\n {tasks.map((task) => (\n <div key={task.id} className={`eco-task-item ${task.completed ? 'completed' : ''}`}>\n <div className=\"eco-task-icon\">{task.icon || '📋'}</div>\n <div className=\"eco-task-info\">\n <span className=\"eco-task-name\">{task.name}</span>\n <span className=\"eco-task-desc\">{task.description}</span>\n </div>\n <div className=\"eco-task-reward\">+{task.reward}</div>\n {task.completed ? (\n task.claimed ? (\n <span className=\"eco-claimed\">已领取</span>\n ) : (\n <button \n className=\"eco-btn eco-btn-sm eco-btn-primary\"\n onClick={() => claimReward(task.id)}\n >\n 领取\n </button>\n )\n ) : (\n <button \n className=\"eco-btn eco-btn-sm\"\n onClick={() => completeTask(task.id)}\n >\n 完成\n </button>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n","/**\n * Newbie Protect SDK - 国际化\n */\n\nexport const zh = {\n newbieProtect: {\n title: '新手保护',\n subtitle: '安全的新手引导期',\n status: {\n protected: '保护中',\n expired: '已结束',\n removed: '已解除',\n },\n remaining: '剩余保护时间',\n days: '天',\n hours: '小时',\n tasks: {\n title: '新手任务',\n complete: '完成',\n completed: '已完成',\n reward: '奖励',\n },\n limits: {\n title: '当前限制',\n transaction: '交易限额',\n withdraw: '提现限额',\n },\n remove: {\n title: '申请解除',\n conditions: '解除条件',\n verify: '验证解除',\n success: '已成功解除保护',\n },\n messages: {\n taskCompleted: '任务完成',\n rewardClaimed: '奖励已领取',\n },\n errors: {\n fetchFailed: '获取状态失败',\n },\n },\n};\n\nexport const en = {\n newbieProtect: {\n title: 'Newbie Protection',\n subtitle: 'Safe onboarding period',\n status: {\n protected: 'Protected',\n expired: 'Expired',\n removed: 'Removed',\n },\n remaining: 'Remaining Time',\n days: 'days',\n hours: 'hours',\n tasks: {\n title: 'Newbie Tasks',\n complete: 'Complete',\n completed: 'Completed',\n reward: 'Reward',\n },\n limits: {\n title: 'Current Limits',\n transaction: 'Transaction Limit',\n withdraw: 'Withdraw Limit',\n },\n remove: {\n title: 'Request Removal',\n conditions: 'Removal Conditions',\n verify: 'Verify Removal',\n success: 'Protection removed successfully',\n },\n messages: {\n taskCompleted: 'Task completed',\n rewardClaimed: 'Reward claimed',\n },\n errors: {\n fetchFailed: 'Failed to fetch status',\n },\n },\n};\n\nexport const ja = {\n newbieProtect: {\n title: '初心者保護',\n subtitle: '安全なチュートリアル期間',\n status: {\n protected: '保護中',\n expired: '終了',\n removed: '解除済み',\n },\n remaining: '残り保護時間',\n days: '日',\n hours: '時間',\n tasks: {\n title: '初心者タスク',\n complete: '完了する',\n completed: '完了',\n reward: '報酬',\n },\n limits: {\n title: '現在の制限',\n transaction: '取引限度額',\n withdraw: '出金限度額',\n },\n remove: {\n title: '解除を申請',\n conditions: '解除条件',\n verify: '解除を確認',\n success: '保護の解除に成功しました',\n },\n messages: {\n taskCompleted: 'タスク完了',\n rewardClaimed: '報酬を受け取りました',\n },\n errors: {\n fetchFailed: 'ステータスの取得に失敗しました',\n },\n },\n};\n\nexport const ko = {\n newbieProtect: {\n title: '초보자 보호',\n subtitle: '안전한 튜토리얼 기간',\n status: {\n protected: '보호 중',\n expired: '종료됨',\n removed: '해제됨',\n },\n remaining: '남은 보호 시간',\n days: '일',\n hours: '시간',\n tasks: {\n title: '초보자 미션',\n complete: '완료하기',\n completed: '완료됨',\n reward: '보상',\n },\n limits: {\n title: '현재 제한',\n transaction: '거래 한도',\n withdraw: '출금 한도',\n },\n remove: {\n title: '해제 신청',\n conditions: '해제 조건',\n verify: '해제 확인',\n success: '보호가 성공적으로 해제되었습니다',\n },\n messages: {\n taskCompleted: '미션 완료',\n rewardClaimed: '보상을 수령했습니다',\n },\n errors: {\n fetchFailed: '상태 가져오기 실패',\n },\n },\n};\n\nexport default { zh, en, ja, ko };\n","/**\n * @quantabit/newbie-protect-sdk - Newbie Protection SDK\n */\n\n// Type Definitions\nexport const ProtectionStatus = {\n ACTIVE: 'active',\n EXPIRED: 'expired',\n REMOVED: 'removed',\n};\n\n// API Client\nexport { NewbieProtectApiClient, newbieProtectApi } from './services/newbieProtectApi';\n\n// React Hooks\nexport { useNewbieProtect } from './hooks/useNewbieProtect';\n\n// Components\nexport { NewbieProtectBanner, NewbieTaskList } from './components/NewbieProtect';\n\n// i18n\nexport { zh, en } from './i18n';\n\n// Default Export\nimport { newbieProtectApi } from './services/newbieProtectApi';\nexport default newbieProtectApi;\n\nimport \"./styles/newbie-protect.css\";\n"],"names":["NewbieProtectApiClient","BaseApiClient","constructor","config","getProtectionStatus","get","checkProtection","userId","getRemainingTime","getProtectionRules","getRule","ruleId","checkActionProtection","action","post","getCurrentLimits","getTransactionLimits","getWithdrawLimits","requestRemoveProtection","application","getRemoveConditions","checkRemoveProgress","verifyToRemove","verification","getNewbieTasks","completeTask","taskId","getNewbieRewards","claimReward","rewardId","newbieProtectApi","useNewbieProtect","protectionStatus","setProtectionStatus","useState","remainingTime","setRemainingTime","tasks","setTasks","loading","setLoading","error","setError","fetchStatus","useCallback","result","data","err","message","fetchRemainingTime","remaining","fetchTasks","useEffect","isProtected","is_protected","NewbieProtectBanner","days","Math","floor","hours","React","createElement","className","NewbieTaskList","map","task","key","id","completed","icon","name","description","reward","claimed","onClick","zh","newbieProtect","title","subtitle","status","protected","expired","removed","complete","limits","transaction","withdraw","remove","conditions","verify","success","messages","taskCompleted","rewardClaimed","errors","fetchFailed","en","ProtectionStatus","ACTIVE","EXPIRED","REMOVED"],"mappings":"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"}
|