@quantabit/reputation-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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 QuantaBit Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # @quantabit/reputation-sdk
2
+
3
+ > QuantaBit Reputation SDK - User reputation scoring, trust levels, and behavior-based rating
4
+
5
+ ## 📦 Installation
6
+
7
+ ```bash
8
+ npm install @quantabit/reputation-sdk
9
+ # or
10
+ yarn add @quantabit/reputation-sdk
11
+ ```
12
+
13
+ ## 🚀 Quick Start
14
+
15
+ ```javascript
16
+ import { reputationApi } from "@quantabit/reputation-sdk";
17
+
18
+ // Configure API base URL
19
+ // Uses /api/v1/reputation by default
20
+ ```
21
+
22
+ ## Dependencies
23
+
24
+ This SDK depends on `@quantabit/sdk-config` for unified configuration management.
25
+ Make sure to initialize the configuration at application startup:
26
+
27
+ ```javascript
28
+ import { initConfig } from '@quantabit/sdk-config';
29
+
30
+ initConfig({
31
+ apiBaseUrl: 'https://your-api-domain.com/api/v1',
32
+ });
33
+ ```
34
+
35
+ ## 📄 License
36
+
37
+ MIT © QuantaBit
38
+
39
+
40
+
41
+ ---
42
+
43
+ ## 🌐 Brand & Links
44
+ - Official Mainnet: [QuantaBit Chain](https://qbitchain.io/)
45
+ - Developer Platform: [Developer Platform](https://developer.quantabit.io/)
46
+ - Open Platform: [Open Platform](https://open.quantabit.io/)
47
+ - Payment Platform: [Pay Platform](https://pay.qbitwallet.io/)
48
+ - Feedback: [Feedback](https://xwin.live/qbit)
package/dist/index.cjs ADDED
@@ -0,0 +1,514 @@
1
+ 'use strict';
2
+
3
+ var sdkConfig = require('@quantabit/sdk-config');
4
+ var React = require('react');
5
+
6
+ /**
7
+ * QuantaBit 信誉 SDK - API 客户端
8
+ * 提供用户信誉积分评估、信任等级、行为事件记录以及排行榜接口
9
+ */
10
+
11
+
12
+ /**
13
+ * 信誉 API 客户端
14
+ */
15
+ class ReputationApiClient extends sdkConfig.BaseApiClient {
16
+ constructor(config = {}) {
17
+ super('/reputation', config);
18
+ }
19
+
20
+ /**
21
+ * 获取当前登录用户的信誉积分与画像
22
+ */
23
+ async getMyReputation() {
24
+ return this.get('/my');
25
+ }
26
+
27
+ /**
28
+ * 获取指定用户的信誉积分
29
+ * @param {string} userId - 用户 ID
30
+ */
31
+ async getUserReputation(userId) {
32
+ return this.get(`/users/${userId}`);
33
+ }
34
+
35
+ /**
36
+ * 获取信誉积分排行榜
37
+ * @param {Object} params - 分页及过滤参数
38
+ */
39
+ async getLeaderboard(params = {}) {
40
+ return this.get('/leaderboard', params);
41
+ }
42
+
43
+ /**
44
+ * 获取指定用户的信任等级(安全控制维度)
45
+ * @param {string} userId - 用户 ID
46
+ */
47
+ async getTrustLevel(userId) {
48
+ return this.get(`/users/${userId}/trust-level`);
49
+ }
50
+
51
+ /**
52
+ * 获取指定用户的信誉积分历史变动记录
53
+ * @param {string} userId - 用户 ID
54
+ * @param {Object} params - 时间范围与分页参数
55
+ */
56
+ async getScoreHistory(userId, params = {}) {
57
+ return this.get(`/users/${userId}/history`, params);
58
+ }
59
+
60
+ /**
61
+ * 上报用户行为事件(自动触发系统增减信誉分)
62
+ * @param {string} eventType - 事件类型 (如:完成任务、恶意举报等)
63
+ * @param {Object} data - 附带的业务数据
64
+ */
65
+ async recordEvent(eventType, data = {}) {
66
+ return this.post('/events', {
67
+ event_type: eventType,
68
+ data
69
+ });
70
+ }
71
+
72
+ /**
73
+ * 手动调整用户信誉积分(管理员权限)
74
+ * @param {string} userId - 用户 ID
75
+ * @param {number} delta - 积分变化值 (可正可负)
76
+ * @param {string} reason - 调整原因
77
+ */
78
+ async adjustScore(userId, delta, reason = '') {
79
+ return this.post(`/users/${userId}/adjust`, {
80
+ delta,
81
+ reason
82
+ });
83
+ }
84
+
85
+ /**
86
+ * 获取用户获得的所有信誉徽章 (SBT)
87
+ * @param {string} userId - 用户 ID
88
+ */
89
+ async getBadges(userId) {
90
+ return this.get(`/users/${userId}/badges`);
91
+ }
92
+ }
93
+ const reputationApi = new ReputationApiClient();
94
+
95
+ /**
96
+ * QuantaBit Reputation SDK - i18n support
97
+ */
98
+
99
+ const messages = {
100
+ en: {
101
+ reputation: 'Reputation',
102
+ score: 'Reputation Score',
103
+ badges: 'Badges',
104
+ trustLevel: 'Trust Level',
105
+ history: 'Score History',
106
+ adjust: 'Adjust Score',
107
+ leaderboard: 'Leaderboard',
108
+ noData: 'No Data'
109
+ },
110
+ zh: {
111
+ reputation: '信誉',
112
+ score: '信誉积分',
113
+ badges: '信誉徽章',
114
+ trustLevel: '信任等级',
115
+ history: '评分历史记录',
116
+ adjust: '调整评分',
117
+ leaderboard: '信誉排行榜',
118
+ noData: '无数据'
119
+ },
120
+ ja: {
121
+ reputation: 'レピュテーション',
122
+ score: '信頼スコア',
123
+ badges: 'バッジ',
124
+ trustLevel: '信頼レベル',
125
+ history: 'スコア履歴',
126
+ adjust: 'スコア調整',
127
+ leaderboard: 'リーダーボード',
128
+ noData: 'データなし'
129
+ },
130
+ ko: {
131
+ reputation: '평판',
132
+ score: '평판 점수',
133
+ badges: '배지',
134
+ trustLevel: '신뢰 등급',
135
+ history: '점수 이력',
136
+ adjust: '점수 조정',
137
+ leaderboard: '리더보드',
138
+ noData: '데이터 없음'
139
+ }
140
+ };
141
+ const SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];
142
+ let currentLanguage = 'en';
143
+ function setLanguage(lang) {
144
+ if (SUPPORTED_LANGUAGES.includes(lang)) currentLanguage = lang;
145
+ }
146
+ function getLanguage() {
147
+ return currentLanguage;
148
+ }
149
+ function t(key) {
150
+ return (messages[currentLanguage] || messages.en)[key] || key;
151
+ }
152
+
153
+ /**
154
+ * QuantaBit Reputation SDK - useReputation Hook
155
+ *
156
+ * 用户信誉积分与荣誉徽章 React 状态管理器
157
+ */
158
+
159
+ function useReputation() {
160
+ const [loading, setLoading] = React.useState(false);
161
+ const [error, setError] = React.useState(null);
162
+ const [reputationInfo, setReputationInfo] = React.useState(null);
163
+ const [badges, setBadges] = React.useState([]);
164
+ const [history, setHistory] = React.useState([]);
165
+
166
+ // 获取信誉总览
167
+ const fetchReputation = React.useCallback(async userId => {
168
+ setLoading(true);
169
+ setError(null);
170
+ try {
171
+ const data = userId ? await reputationApi.getUserReputation(userId) : await reputationApi.getMyReputation();
172
+ setReputationInfo(data);
173
+ return data;
174
+ } catch (err) {
175
+ setError(err);
176
+ throw err;
177
+ } finally {
178
+ setLoading(false);
179
+ }
180
+ }, []);
181
+
182
+ // 获取拥有的徽章列表
183
+ const fetchBadges = React.useCallback(async userId => {
184
+ setLoading(true);
185
+ setError(null);
186
+ try {
187
+ const data = await reputationApi.getBadges(userId);
188
+ setBadges(data?.badges || []);
189
+ return data;
190
+ } catch (err) {
191
+ setError(err);
192
+ throw err;
193
+ } finally {
194
+ setLoading(false);
195
+ }
196
+ }, []);
197
+
198
+ // 获取信誉分变动历史
199
+ const fetchHistory = React.useCallback(async (params = {}) => {
200
+ setLoading(true);
201
+ setError(null);
202
+ try {
203
+ const data = await reputationApi.getScoreHistory(params);
204
+ setHistory(data?.history || []);
205
+ return data;
206
+ } catch (err) {
207
+ setError(err);
208
+ throw err;
209
+ } finally {
210
+ setLoading(false);
211
+ }
212
+ }, []);
213
+ return {
214
+ loading,
215
+ error,
216
+ reputationInfo,
217
+ badges,
218
+ history,
219
+ fetchReputation,
220
+ fetchBadges,
221
+ fetchHistory
222
+ };
223
+ }
224
+
225
+ /**
226
+ * QuantaBit Reputation SDK - ReputationBadgeCard Component
227
+ *
228
+ * 个人信誉徽章卡片组件,支持信誉分展示、信任等级、勋章墙等,响应式设计并支持多语言
229
+ */
230
+
231
+ function ReputationBadgeCard({
232
+ userId,
233
+ className = ''
234
+ }) {
235
+ const {
236
+ loading,
237
+ error,
238
+ reputationInfo,
239
+ badges,
240
+ fetchReputation,
241
+ fetchBadges
242
+ } = useReputation();
243
+ React.useEffect(() => {
244
+ fetchReputation(userId).catch(err => console.error(err));
245
+ fetchBadges(userId).catch(err => console.error(err));
246
+ }, [userId, fetchReputation, fetchBadges]);
247
+ if (loading) {
248
+ return /*#__PURE__*/React.createElement("div", {
249
+ className: `qbit-reputation-card loading ${className}`
250
+ }, /*#__PURE__*/React.createElement("div", {
251
+ className: "qbit-skeleton-circle"
252
+ }), /*#__PURE__*/React.createElement("div", {
253
+ className: "qbit-skeleton-line"
254
+ }));
255
+ }
256
+ if (error) {
257
+ return /*#__PURE__*/React.createElement("div", {
258
+ className: `qbit-reputation-card error ${className}`
259
+ }, /*#__PURE__*/React.createElement("p", null, "Failed to load reputation data."));
260
+ }
261
+ const score = reputationInfo?.score ?? 100;
262
+ const trustLevel = reputationInfo?.trustLevel ?? 'Standard';
263
+
264
+ // 动态决定等级颜色
265
+ const getLevelColor = level => {
266
+ switch (String(level).toLowerCase()) {
267
+ case 'trusted':
268
+ case 'vip':
269
+ case 'high':
270
+ return '#10b981';
271
+ // 绿色
272
+ case 'standard':
273
+ case 'medium':
274
+ return '#3b82f6';
275
+ // 蓝色
276
+ case 'restricted':
277
+ case 'low':
278
+ return '#f59e0b';
279
+ // 橙色
280
+ default:
281
+ return '#64748b';
282
+ // 灰色
283
+ }
284
+ };
285
+ return /*#__PURE__*/React.createElement("div", {
286
+ className: `qbit-reputation-card ${className}`
287
+ }, /*#__PURE__*/React.createElement("div", {
288
+ className: "qbit-reputation-main"
289
+ }, /*#__PURE__*/React.createElement("div", {
290
+ className: "qbit-reputation-circle-wrap"
291
+ }, /*#__PURE__*/React.createElement("svg", {
292
+ className: "qbit-reputation-svg",
293
+ viewBox: "0 0 36 36"
294
+ }, /*#__PURE__*/React.createElement("path", {
295
+ className: "qbit-reputation-bg",
296
+ d: "M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831"
297
+ }), /*#__PURE__*/React.createElement("path", {
298
+ className: "qbit-reputation-progress",
299
+ strokeDasharray: `${Math.min(100, Math.max(0, score))}, 100`,
300
+ d: "M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831",
301
+ stroke: getLevelColor(trustLevel)
302
+ }), /*#__PURE__*/React.createElement("text", {
303
+ x: "18",
304
+ y: "20.35",
305
+ className: "qbit-reputation-text",
306
+ fill: getLevelColor(trustLevel)
307
+ }, score))), /*#__PURE__*/React.createElement("div", {
308
+ className: "qbit-reputation-meta"
309
+ }, /*#__PURE__*/React.createElement("h4", {
310
+ className: "qbit-reputation-title"
311
+ }, t('reputation')), /*#__PURE__*/React.createElement("div", {
312
+ className: "qbit-reputation-badge-row"
313
+ }, /*#__PURE__*/React.createElement("span", {
314
+ className: "qbit-reputation-level-badge",
315
+ style: {
316
+ backgroundColor: getLevelColor(trustLevel) + '15',
317
+ color: getLevelColor(trustLevel),
318
+ border: `1px solid ${getLevelColor(trustLevel)}30`
319
+ }
320
+ }, t('trustLevel'), ": ", trustLevel)))), /*#__PURE__*/React.createElement("div", {
321
+ className: "qbit-reputation-badges-section"
322
+ }, /*#__PURE__*/React.createElement("h5", {
323
+ className: "qbit-badges-header"
324
+ }, t('badges')), badges.length === 0 ? /*#__PURE__*/React.createElement("p", {
325
+ className: "qbit-reputation-empty"
326
+ }, t('noData')) : /*#__PURE__*/React.createElement("div", {
327
+ className: "qbit-badges-grid"
328
+ }, badges.map((badge, idx) => /*#__PURE__*/React.createElement("div", {
329
+ key: badge.id || idx,
330
+ className: "qbit-badge-item",
331
+ title: badge.description || ''
332
+ }, /*#__PURE__*/React.createElement("div", {
333
+ className: "qbit-badge-icon",
334
+ style: {
335
+ background: badge.color || '#e2e8f0'
336
+ }
337
+ }, badge.icon || '🏅'), /*#__PURE__*/React.createElement("span", {
338
+ className: "qbit-badge-name"
339
+ }, badge.name))))), /*#__PURE__*/React.createElement("style", null, `
340
+ .qbit-reputation-card {
341
+ background: #ffffff;
342
+ border-radius: 16px;
343
+ border: 1px solid #f1f5f9;
344
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);
345
+ padding: 20px;
346
+ max-width: 320px;
347
+ font-family: system-ui, -apple-system, sans-serif;
348
+ }
349
+ .qbit-reputation-main {
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 16px;
353
+ border-bottom: 1px solid #f1f5f9;
354
+ padding-bottom: 16px;
355
+ margin-bottom: 16px;
356
+ }
357
+ .qbit-reputation-circle-wrap {
358
+ width: 72px;
359
+ height: 72px;
360
+ }
361
+ .qbit-reputation-svg {
362
+ width: 100%;
363
+ height: 100%;
364
+ }
365
+ .qbit-reputation-bg {
366
+ fill: none;
367
+ stroke: #f1f5f9;
368
+ stroke-width: 2.8;
369
+ }
370
+ .qbit-reputation-progress {
371
+ fill: none;
372
+ stroke-width: 2.8;
373
+ stroke-linecap: round;
374
+ transition: stroke-dasharray 0.3s ease;
375
+ }
376
+ .qbit-reputation-text {
377
+ font-size: 8px;
378
+ font-weight: 700;
379
+ text-anchor: middle;
380
+ dominant-baseline: middle;
381
+ }
382
+ .qbit-reputation-meta {
383
+ display: flex;
384
+ flex-direction: column;
385
+ gap: 6px;
386
+ }
387
+ .qbit-reputation-title {
388
+ margin: 0;
389
+ font-size: 16px;
390
+ color: #0f172a;
391
+ font-weight: 600;
392
+ }
393
+ .qbit-reputation-level-badge {
394
+ padding: 4px 8px;
395
+ border-radius: 6px;
396
+ font-size: 11px;
397
+ font-weight: 500;
398
+ display: inline-block;
399
+ }
400
+ .qbit-reputation-badges-section {
401
+ display: flex;
402
+ flex-direction: column;
403
+ gap: 12px;
404
+ }
405
+ .qbit-badges-header {
406
+ margin: 0;
407
+ font-size: 13px;
408
+ color: #64748b;
409
+ text-transform: uppercase;
410
+ letter-spacing: 0.05em;
411
+ }
412
+ .qbit-reputation-empty {
413
+ margin: 0;
414
+ font-size: 13px;
415
+ color: #94a3b8;
416
+ text-align: center;
417
+ padding: 12px 0;
418
+ }
419
+ .qbit-badges-grid {
420
+ display: grid;
421
+ grid-template-columns: repeat(3, 1fr);
422
+ gap: 10px;
423
+ }
424
+ .qbit-badge-item {
425
+ display: flex;
426
+ flex-direction: column;
427
+ align-items: center;
428
+ gap: 6px;
429
+ text-align: center;
430
+ cursor: pointer;
431
+ }
432
+ .qbit-badge-icon {
433
+ width: 36px;
434
+ height: 36px;
435
+ border-radius: 50%;
436
+ display: flex;
437
+ align-items: center;
438
+ justify-content: center;
439
+ font-size: 18px;
440
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
441
+ transition: transform 0.2s;
442
+ }
443
+ .qbit-badge-item:hover .qbit-badge-icon {
444
+ transform: scale(1.1);
445
+ }
446
+ .qbit-badge-name {
447
+ font-size: 11px;
448
+ color: #475569;
449
+ font-weight: 500;
450
+ white-space: nowrap;
451
+ overflow: hidden;
452
+ text-overflow: ellipsis;
453
+ max-width: 100%;
454
+ }
455
+ .qbit-skeleton-circle {
456
+ width: 72px;
457
+ height: 72px;
458
+ border-radius: 50%;
459
+ background: #f1f5f9;
460
+ }
461
+ .qbit-skeleton-line {
462
+ height: 16px;
463
+ width: 120px;
464
+ background: #f1f5f9;
465
+ border-radius: 4px;
466
+ }
467
+ @keyframes pulse {
468
+ 0% { opacity: 0.6; }
469
+ 50% { opacity: 1; }
470
+ 100% { opacity: 0.6; }
471
+ }
472
+ .qbit-reputation-card.loading {
473
+ display: flex;
474
+ align-items: center;
475
+ gap: 16px;
476
+ animation: pulse 1.5s infinite ease-in-out;
477
+ }
478
+ `));
479
+ }
480
+
481
+ /**
482
+ * @quantabit/reputation-sdk
483
+ * QuantaBit Reputation SDK - User reputation scoring, trust levels, and behavior-based rating
484
+ */
485
+
486
+
487
+ // Convenience API exports
488
+ const getMyReputation = (...args) => reputationApi.getMyReputation(...args);
489
+ const getUserReputation = (...args) => reputationApi.getUserReputation(...args);
490
+ const getLeaderboard = (...args) => reputationApi.getLeaderboard(...args);
491
+ const getTrustLevel = (...args) => reputationApi.getTrustLevel(...args);
492
+ const getScoreHistory = (...args) => reputationApi.getScoreHistory(...args);
493
+ const recordEvent = (...args) => reputationApi.recordEvent(...args);
494
+ const adjustScore = (...args) => reputationApi.adjustScore(...args);
495
+ const getBadges = (...args) => reputationApi.getBadges(...args);
496
+
497
+ exports.ReputationApiClient = ReputationApiClient;
498
+ exports.ReputationBadgeCard = ReputationBadgeCard;
499
+ exports.SUPPORTED_LANGUAGES = SUPPORTED_LANGUAGES;
500
+ exports.adjustScore = adjustScore;
501
+ exports.getBadges = getBadges;
502
+ exports.getLanguage = getLanguage;
503
+ exports.getLeaderboard = getLeaderboard;
504
+ exports.getMyReputation = getMyReputation;
505
+ exports.getScoreHistory = getScoreHistory;
506
+ exports.getTrustLevel = getTrustLevel;
507
+ exports.getUserReputation = getUserReputation;
508
+ exports.messages = messages;
509
+ exports.recordEvent = recordEvent;
510
+ exports.reputationApi = reputationApi;
511
+ exports.setLanguage = setLanguage;
512
+ exports.t = t;
513
+ exports.useReputation = useReputation;
514
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/services/reputationApi.js","../src/i18n/index.js","../src/hooks/useReputation.js","../src/components/ReputationBadgeCard.jsx","../src/index.js"],"sourcesContent":["/**\n * QuantaBit 信誉 SDK - API 客户端\n * 提供用户信誉积分评估、信任等级、行为事件记录以及排行榜接口\n */\n\nimport { BaseApiClient } from '@quantabit/sdk-config';\n\n/**\n * 信誉 API 客户端\n */\nexport class ReputationApiClient extends BaseApiClient {\n constructor(config = {}) {\n super('/reputation', config);\n }\n\n /**\n * 获取当前登录用户的信誉积分与画像\n */\n async getMyReputation() {\n return this.get('/my');\n }\n\n /**\n * 获取指定用户的信誉积分\n * @param {string} userId - 用户 ID\n */\n async getUserReputation(userId) {\n return this.get(`/users/${userId}`);\n }\n\n /**\n * 获取信誉积分排行榜\n * @param {Object} params - 分页及过滤参数\n */\n async getLeaderboard(params = {}) {\n return this.get('/leaderboard', params);\n }\n\n /**\n * 获取指定用户的信任等级(安全控制维度)\n * @param {string} userId - 用户 ID\n */\n async getTrustLevel(userId) {\n return this.get(`/users/${userId}/trust-level`);\n }\n\n /**\n * 获取指定用户的信誉积分历史变动记录\n * @param {string} userId - 用户 ID\n * @param {Object} params - 时间范围与分页参数\n */\n async getScoreHistory(userId, params = {}) {\n return this.get(`/users/${userId}/history`, params);\n }\n\n /**\n * 上报用户行为事件(自动触发系统增减信誉分)\n * @param {string} eventType - 事件类型 (如:完成任务、恶意举报等)\n * @param {Object} data - 附带的业务数据\n */\n async recordEvent(eventType, data = {}) {\n return this.post('/events', { event_type: eventType, data });\n }\n\n /**\n * 手动调整用户信誉积分(管理员权限)\n * @param {string} userId - 用户 ID\n * @param {number} delta - 积分变化值 (可正可负)\n * @param {string} reason - 调整原因\n */\n async adjustScore(userId, delta, reason = '') {\n return this.post(`/users/${userId}/adjust`, { delta, reason });\n }\n\n /**\n * 获取用户获得的所有信誉徽章 (SBT)\n * @param {string} userId - 用户 ID\n */\n async getBadges(userId) {\n return this.get(`/users/${userId}/badges`);\n }\n}\n\nexport const reputationApi = new ReputationApiClient();\nexport default reputationApi;\n","/**\n * QuantaBit Reputation SDK - i18n support\n */\n\nconst messages = {\n en: {\n reputation: 'Reputation',\n score: 'Reputation Score',\n badges: 'Badges',\n trustLevel: 'Trust Level',\n history: 'Score History',\n adjust: 'Adjust Score',\n leaderboard: 'Leaderboard',\n noData: 'No Data'\n },\n zh: {\n reputation: '信誉',\n score: '信誉积分',\n badges: '信誉徽章',\n trustLevel: '信任等级',\n history: '评分历史记录',\n adjust: '调整评分',\n leaderboard: '信誉排行榜',\n noData: '无数据'\n },\n ja: {\n reputation: 'レピュテーション',\n score: '信頼スコア',\n badges: 'バッジ',\n trustLevel: '信頼レベル',\n history: 'スコア履歴',\n adjust: 'スコア調整',\n leaderboard: 'リーダーボード',\n noData: 'データなし'\n },\n ko: {\n reputation: '평판',\n score: '평판 점수',\n badges: '배지',\n trustLevel: '신뢰 등급',\n history: '점수 이력',\n adjust: '점수 조정',\n leaderboard: '리더보드',\n noData: '데이터 없음'\n }\n};\n\nconst SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];\nlet currentLanguage = 'en';\n\nexport function setLanguage(lang) {\n if (SUPPORTED_LANGUAGES.includes(lang)) currentLanguage = lang;\n}\n\nexport function getLanguage() {\n return currentLanguage;\n}\n\nexport function t(key) {\n return (messages[currentLanguage] || messages.en)[key] || key;\n}\n\nexport { messages, SUPPORTED_LANGUAGES };\n","/**\n * QuantaBit Reputation SDK - useReputation Hook\n * \n * 用户信誉积分与荣誉徽章 React 状态管理器\n */\n\nimport { useState, useCallback } from 'react';\nimport { reputationApi } from '../services/reputationApi';\n\nexport function useReputation() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [reputationInfo, setReputationInfo] = useState(null);\n const [badges, setBadges] = useState([]);\n const [history, setHistory] = useState([]);\n\n // 获取信誉总览\n const fetchReputation = useCallback(async (userId) => {\n setLoading(true);\n setError(null);\n try {\n const data = userId \n ? await reputationApi.getUserReputation(userId)\n : await reputationApi.getMyReputation();\n setReputationInfo(data);\n return data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 获取拥有的徽章列表\n const fetchBadges = useCallback(async (userId) => {\n setLoading(true);\n setError(null);\n try {\n const data = await reputationApi.getBadges(userId);\n setBadges(data?.badges || []);\n return data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 获取信誉分变动历史\n const fetchHistory = useCallback(async (params = {}) => {\n setLoading(true);\n setError(null);\n try {\n const data = await reputationApi.getScoreHistory(params);\n setHistory(data?.history || []);\n return data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n loading,\n error,\n reputationInfo,\n badges,\n history,\n fetchReputation,\n fetchBadges,\n fetchHistory,\n };\n}\n","/**\n * QuantaBit Reputation SDK - ReputationBadgeCard Component\n * \n * 个人信誉徽章卡片组件,支持信誉分展示、信任等级、勋章墙等,响应式设计并支持多语言\n */\n\nimport React, { useEffect } from 'react';\nimport { t } from '../i18n';\nimport { useReputation } from '../hooks/useReputation';\n\nexport function ReputationBadgeCard({ userId, className = '' }) {\n const { \n loading, \n error, \n reputationInfo, \n badges, \n fetchReputation, \n fetchBadges \n } = useReputation();\n\n useEffect(() => {\n fetchReputation(userId).catch(err => console.error(err));\n fetchBadges(userId).catch(err => console.error(err));\n }, [userId, fetchReputation, fetchBadges]);\n\n if (loading) {\n return (\n <div className={`qbit-reputation-card loading ${className}`}>\n <div className=\"qbit-skeleton-circle\"></div>\n <div className=\"qbit-skeleton-line\"></div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`qbit-reputation-card error ${className}`}>\n <p>Failed to load reputation data.</p>\n </div>\n );\n }\n\n const score = reputationInfo?.score ?? 100;\n const trustLevel = reputationInfo?.trustLevel ?? 'Standard';\n\n // 动态决定等级颜色\n const getLevelColor = (level) => {\n switch (String(level).toLowerCase()) {\n case 'trusted':\n case 'vip':\n case 'high':\n return '#10b981'; // 绿色\n case 'standard':\n case 'medium':\n return '#3b82f6'; // 蓝色\n case 'restricted':\n case 'low':\n return '#f59e0b'; // 橙色\n default:\n return '#64748b'; // 灰色\n }\n };\n\n return (\n <div className={`qbit-reputation-card ${className}`}>\n <div className=\"qbit-reputation-main\">\n <div className=\"qbit-reputation-circle-wrap\">\n <svg className=\"qbit-reputation-svg\" viewBox=\"0 0 36 36\">\n <path\n className=\"qbit-reputation-bg\"\n d=\"M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831\"\n />\n <path\n className=\"qbit-reputation-progress\"\n strokeDasharray={`${Math.min(100, Math.max(0, score))}, 100`}\n d=\"M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831\"\n stroke={getLevelColor(trustLevel)}\n />\n <text x=\"18\" y=\"20.35\" className=\"qbit-reputation-text\" fill={getLevelColor(trustLevel)}>\n {score}\n </text>\n </svg>\n </div>\n\n <div className=\"qbit-reputation-meta\">\n <h4 className=\"qbit-reputation-title\">{t('reputation')}</h4>\n <div className=\"qbit-reputation-badge-row\">\n <span \n className=\"qbit-reputation-level-badge\" \n style={{ backgroundColor: getLevelColor(trustLevel) + '15', color: getLevelColor(trustLevel), border: `1px solid ${getLevelColor(trustLevel)}30` }}\n >\n {t('trustLevel')}: {trustLevel}\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"qbit-reputation-badges-section\">\n <h5 className=\"qbit-badges-header\">{t('badges')}</h5>\n {badges.length === 0 ? (\n <p className=\"qbit-reputation-empty\">{t('noData')}</p>\n ) : (\n <div className=\"qbit-badges-grid\">\n {badges.map((badge, idx) => (\n <div key={badge.id || idx} className=\"qbit-badge-item\" title={badge.description || ''}>\n <div className=\"qbit-badge-icon\" style={{ background: badge.color || '#e2e8f0' }}>\n {badge.icon || '🏅'}\n </div>\n <span className=\"qbit-badge-name\">{badge.name}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <style>{`\n .qbit-reputation-card {\n background: #ffffff;\n border-radius: 16px;\n border: 1px solid #f1f5f9;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);\n padding: 20px;\n max-width: 320px;\n font-family: system-ui, -apple-system, sans-serif;\n }\n .qbit-reputation-main {\n display: flex;\n align-items: center;\n gap: 16px;\n border-bottom: 1px solid #f1f5f9;\n padding-bottom: 16px;\n margin-bottom: 16px;\n }\n .qbit-reputation-circle-wrap {\n width: 72px;\n height: 72px;\n }\n .qbit-reputation-svg {\n width: 100%;\n height: 100%;\n }\n .qbit-reputation-bg {\n fill: none;\n stroke: #f1f5f9;\n stroke-width: 2.8;\n }\n .qbit-reputation-progress {\n fill: none;\n stroke-width: 2.8;\n stroke-linecap: round;\n transition: stroke-dasharray 0.3s ease;\n }\n .qbit-reputation-text {\n font-size: 8px;\n font-weight: 700;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n .qbit-reputation-meta {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .qbit-reputation-title {\n margin: 0;\n font-size: 16px;\n color: #0f172a;\n font-weight: 600;\n }\n .qbit-reputation-level-badge {\n padding: 4px 8px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 500;\n display: inline-block;\n }\n .qbit-reputation-badges-section {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .qbit-badges-header {\n margin: 0;\n font-size: 13px;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n .qbit-reputation-empty {\n margin: 0;\n font-size: 13px;\n color: #94a3b8;\n text-align: center;\n padding: 12px 0;\n }\n .qbit-badges-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 10px;\n }\n .qbit-badge-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n text-align: center;\n cursor: pointer;\n }\n .qbit-badge-icon {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n transition: transform 0.2s;\n }\n .qbit-badge-item:hover .qbit-badge-icon {\n transform: scale(1.1);\n }\n .qbit-badge-name {\n font-size: 11px;\n color: #475569;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n .qbit-skeleton-circle {\n width: 72px;\n height: 72px;\n border-radius: 50%;\n background: #f1f5f9;\n }\n .qbit-skeleton-line {\n height: 16px;\n width: 120px;\n background: #f1f5f9;\n border-radius: 4px;\n }\n @keyframes pulse {\n 0% { opacity: 0.6; }\n 50% { opacity: 1; }\n 100% { opacity: 0.6; }\n }\n .qbit-reputation-card.loading {\n display: flex;\n align-items: center;\n gap: 16px;\n animation: pulse 1.5s infinite ease-in-out;\n }\n `}</style>\n </div>\n );\n}\n","/**\n * @quantabit/reputation-sdk\n * QuantaBit Reputation SDK - User reputation scoring, trust levels, and behavior-based rating\n */\n\nimport { reputationApi, ReputationApiClient } from './services/reputationApi';\nimport { messages, SUPPORTED_LANGUAGES, setLanguage, getLanguage, t } from './i18n';\nimport { useReputation } from './hooks/useReputation';\nimport { ReputationBadgeCard } from './components/ReputationBadgeCard.jsx';\n\nexport {\n reputationApi,\n ReputationApiClient,\n messages,\n SUPPORTED_LANGUAGES,\n setLanguage,\n getLanguage,\n t,\n useReputation,\n ReputationBadgeCard\n};\n\n// Convenience API exports\nexport const getMyReputation = (...args) => reputationApi.getMyReputation(...args);\nexport const getUserReputation = (...args) => reputationApi.getUserReputation(...args);\nexport const getLeaderboard = (...args) => reputationApi.getLeaderboard(...args);\nexport const getTrustLevel = (...args) => reputationApi.getTrustLevel(...args);\nexport const getScoreHistory = (...args) => reputationApi.getScoreHistory(...args);\nexport const recordEvent = (...args) => reputationApi.recordEvent(...args);\nexport const adjustScore = (...args) => reputationApi.adjustScore(...args);\nexport const getBadges = (...args) => reputationApi.getBadges(...args);\n"],"names":["ReputationApiClient","BaseApiClient","constructor","config","getMyReputation","get","getUserReputation","userId","getLeaderboard","params","getTrustLevel","getScoreHistory","recordEvent","eventType","data","post","event_type","adjustScore","delta","reason","getBadges","reputationApi","messages","en","reputation","score","badges","trustLevel","history","adjust","leaderboard","noData","zh","ja","ko","SUPPORTED_LANGUAGES","currentLanguage","setLanguage","lang","includes","getLanguage","t","key","useReputation","loading","setLoading","useState","error","setError","reputationInfo","setReputationInfo","setBadges","setHistory","fetchReputation","useCallback","err","fetchBadges","fetchHistory","ReputationBadgeCard","className","useEffect","catch","console","React","createElement","getLevelColor","level","String","toLowerCase","viewBox","d","strokeDasharray","Math","min","max","stroke","x","y","fill","style","backgroundColor","color","border","length","map","badge","idx","id","title","description","background","icon","name","args"],"mappings":"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CACN,CACE,CAEJ,CAAC,eAEN7B,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA,IAAA,EAAQ;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAA,CAAe,CACN,CAAC;AAEV;;ACjQA;AACA;AACA;AACA;;;AAmBA;AACO,MAAM5D,eAAe,GAAGA,CAAC,GAAGyF,IAAI,KAAKxE,aAAa,CAACjB,eAAe,CAAC,GAAGyF,IAAI;AAC1E,MAAMvF,iBAAiB,GAAGA,CAAC,GAAGuF,IAAI,KAAKxE,aAAa,CAACf,iBAAiB,CAAC,GAAGuF,IAAI;AAC9E,MAAMrF,cAAc,GAAGA,CAAC,GAAGqF,IAAI,KAAKxE,aAAa,CAACb,cAAc,CAAC,GAAGqF,IAAI;AACxE,MAAMnF,aAAa,GAAGA,CAAC,GAAGmF,IAAI,KAAKxE,aAAa,CAACX,aAAa,CAAC,GAAGmF,IAAI;AACtE,MAAMlF,eAAe,GAAGA,CAAC,GAAGkF,IAAI,KAAKxE,aAAa,CAACV,eAAe,CAAC,GAAGkF,IAAI;AAC1E,MAAMjF,WAAW,GAAGA,CAAC,GAAGiF,IAAI,KAAKxE,aAAa,CAACT,WAAW,CAAC,GAAGiF,IAAI;AAClE,MAAM5E,WAAW,GAAGA,CAAC,GAAG4E,IAAI,KAAKxE,aAAa,CAACJ,WAAW,CAAC,GAAG4E,IAAI;AAClE,MAAMzE,SAAS,GAAGA,CAAC,GAAGyE,IAAI,KAAKxE,aAAa,CAACD,SAAS,CAAC,GAAGyE,IAAI;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,496 @@
1
+ import { BaseApiClient } from '@quantabit/sdk-config';
2
+ import React, { useState, useCallback, useEffect } from 'react';
3
+
4
+ /**
5
+ * QuantaBit 信誉 SDK - API 客户端
6
+ * 提供用户信誉积分评估、信任等级、行为事件记录以及排行榜接口
7
+ */
8
+
9
+
10
+ /**
11
+ * 信誉 API 客户端
12
+ */
13
+ class ReputationApiClient extends BaseApiClient {
14
+ constructor(config = {}) {
15
+ super('/reputation', config);
16
+ }
17
+
18
+ /**
19
+ * 获取当前登录用户的信誉积分与画像
20
+ */
21
+ async getMyReputation() {
22
+ return this.get('/my');
23
+ }
24
+
25
+ /**
26
+ * 获取指定用户的信誉积分
27
+ * @param {string} userId - 用户 ID
28
+ */
29
+ async getUserReputation(userId) {
30
+ return this.get(`/users/${userId}`);
31
+ }
32
+
33
+ /**
34
+ * 获取信誉积分排行榜
35
+ * @param {Object} params - 分页及过滤参数
36
+ */
37
+ async getLeaderboard(params = {}) {
38
+ return this.get('/leaderboard', params);
39
+ }
40
+
41
+ /**
42
+ * 获取指定用户的信任等级(安全控制维度)
43
+ * @param {string} userId - 用户 ID
44
+ */
45
+ async getTrustLevel(userId) {
46
+ return this.get(`/users/${userId}/trust-level`);
47
+ }
48
+
49
+ /**
50
+ * 获取指定用户的信誉积分历史变动记录
51
+ * @param {string} userId - 用户 ID
52
+ * @param {Object} params - 时间范围与分页参数
53
+ */
54
+ async getScoreHistory(userId, params = {}) {
55
+ return this.get(`/users/${userId}/history`, params);
56
+ }
57
+
58
+ /**
59
+ * 上报用户行为事件(自动触发系统增减信誉分)
60
+ * @param {string} eventType - 事件类型 (如:完成任务、恶意举报等)
61
+ * @param {Object} data - 附带的业务数据
62
+ */
63
+ async recordEvent(eventType, data = {}) {
64
+ return this.post('/events', {
65
+ event_type: eventType,
66
+ data
67
+ });
68
+ }
69
+
70
+ /**
71
+ * 手动调整用户信誉积分(管理员权限)
72
+ * @param {string} userId - 用户 ID
73
+ * @param {number} delta - 积分变化值 (可正可负)
74
+ * @param {string} reason - 调整原因
75
+ */
76
+ async adjustScore(userId, delta, reason = '') {
77
+ return this.post(`/users/${userId}/adjust`, {
78
+ delta,
79
+ reason
80
+ });
81
+ }
82
+
83
+ /**
84
+ * 获取用户获得的所有信誉徽章 (SBT)
85
+ * @param {string} userId - 用户 ID
86
+ */
87
+ async getBadges(userId) {
88
+ return this.get(`/users/${userId}/badges`);
89
+ }
90
+ }
91
+ const reputationApi = new ReputationApiClient();
92
+
93
+ /**
94
+ * QuantaBit Reputation SDK - i18n support
95
+ */
96
+
97
+ const messages = {
98
+ en: {
99
+ reputation: 'Reputation',
100
+ score: 'Reputation Score',
101
+ badges: 'Badges',
102
+ trustLevel: 'Trust Level',
103
+ history: 'Score History',
104
+ adjust: 'Adjust Score',
105
+ leaderboard: 'Leaderboard',
106
+ noData: 'No Data'
107
+ },
108
+ zh: {
109
+ reputation: '信誉',
110
+ score: '信誉积分',
111
+ badges: '信誉徽章',
112
+ trustLevel: '信任等级',
113
+ history: '评分历史记录',
114
+ adjust: '调整评分',
115
+ leaderboard: '信誉排行榜',
116
+ noData: '无数据'
117
+ },
118
+ ja: {
119
+ reputation: 'レピュテーション',
120
+ score: '信頼スコア',
121
+ badges: 'バッジ',
122
+ trustLevel: '信頼レベル',
123
+ history: 'スコア履歴',
124
+ adjust: 'スコア調整',
125
+ leaderboard: 'リーダーボード',
126
+ noData: 'データなし'
127
+ },
128
+ ko: {
129
+ reputation: '평판',
130
+ score: '평판 점수',
131
+ badges: '배지',
132
+ trustLevel: '신뢰 등급',
133
+ history: '점수 이력',
134
+ adjust: '점수 조정',
135
+ leaderboard: '리더보드',
136
+ noData: '데이터 없음'
137
+ }
138
+ };
139
+ const SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];
140
+ let currentLanguage = 'en';
141
+ function setLanguage(lang) {
142
+ if (SUPPORTED_LANGUAGES.includes(lang)) currentLanguage = lang;
143
+ }
144
+ function getLanguage() {
145
+ return currentLanguage;
146
+ }
147
+ function t(key) {
148
+ return (messages[currentLanguage] || messages.en)[key] || key;
149
+ }
150
+
151
+ /**
152
+ * QuantaBit Reputation SDK - useReputation Hook
153
+ *
154
+ * 用户信誉积分与荣誉徽章 React 状态管理器
155
+ */
156
+
157
+ function useReputation() {
158
+ const [loading, setLoading] = useState(false);
159
+ const [error, setError] = useState(null);
160
+ const [reputationInfo, setReputationInfo] = useState(null);
161
+ const [badges, setBadges] = useState([]);
162
+ const [history, setHistory] = useState([]);
163
+
164
+ // 获取信誉总览
165
+ const fetchReputation = useCallback(async userId => {
166
+ setLoading(true);
167
+ setError(null);
168
+ try {
169
+ const data = userId ? await reputationApi.getUserReputation(userId) : await reputationApi.getMyReputation();
170
+ setReputationInfo(data);
171
+ return data;
172
+ } catch (err) {
173
+ setError(err);
174
+ throw err;
175
+ } finally {
176
+ setLoading(false);
177
+ }
178
+ }, []);
179
+
180
+ // 获取拥有的徽章列表
181
+ const fetchBadges = useCallback(async userId => {
182
+ setLoading(true);
183
+ setError(null);
184
+ try {
185
+ const data = await reputationApi.getBadges(userId);
186
+ setBadges(data?.badges || []);
187
+ return data;
188
+ } catch (err) {
189
+ setError(err);
190
+ throw err;
191
+ } finally {
192
+ setLoading(false);
193
+ }
194
+ }, []);
195
+
196
+ // 获取信誉分变动历史
197
+ const fetchHistory = useCallback(async (params = {}) => {
198
+ setLoading(true);
199
+ setError(null);
200
+ try {
201
+ const data = await reputationApi.getScoreHistory(params);
202
+ setHistory(data?.history || []);
203
+ return data;
204
+ } catch (err) {
205
+ setError(err);
206
+ throw err;
207
+ } finally {
208
+ setLoading(false);
209
+ }
210
+ }, []);
211
+ return {
212
+ loading,
213
+ error,
214
+ reputationInfo,
215
+ badges,
216
+ history,
217
+ fetchReputation,
218
+ fetchBadges,
219
+ fetchHistory
220
+ };
221
+ }
222
+
223
+ /**
224
+ * QuantaBit Reputation SDK - ReputationBadgeCard Component
225
+ *
226
+ * 个人信誉徽章卡片组件,支持信誉分展示、信任等级、勋章墙等,响应式设计并支持多语言
227
+ */
228
+
229
+ function ReputationBadgeCard({
230
+ userId,
231
+ className = ''
232
+ }) {
233
+ const {
234
+ loading,
235
+ error,
236
+ reputationInfo,
237
+ badges,
238
+ fetchReputation,
239
+ fetchBadges
240
+ } = useReputation();
241
+ useEffect(() => {
242
+ fetchReputation(userId).catch(err => console.error(err));
243
+ fetchBadges(userId).catch(err => console.error(err));
244
+ }, [userId, fetchReputation, fetchBadges]);
245
+ if (loading) {
246
+ return /*#__PURE__*/React.createElement("div", {
247
+ className: `qbit-reputation-card loading ${className}`
248
+ }, /*#__PURE__*/React.createElement("div", {
249
+ className: "qbit-skeleton-circle"
250
+ }), /*#__PURE__*/React.createElement("div", {
251
+ className: "qbit-skeleton-line"
252
+ }));
253
+ }
254
+ if (error) {
255
+ return /*#__PURE__*/React.createElement("div", {
256
+ className: `qbit-reputation-card error ${className}`
257
+ }, /*#__PURE__*/React.createElement("p", null, "Failed to load reputation data."));
258
+ }
259
+ const score = reputationInfo?.score ?? 100;
260
+ const trustLevel = reputationInfo?.trustLevel ?? 'Standard';
261
+
262
+ // 动态决定等级颜色
263
+ const getLevelColor = level => {
264
+ switch (String(level).toLowerCase()) {
265
+ case 'trusted':
266
+ case 'vip':
267
+ case 'high':
268
+ return '#10b981';
269
+ // 绿色
270
+ case 'standard':
271
+ case 'medium':
272
+ return '#3b82f6';
273
+ // 蓝色
274
+ case 'restricted':
275
+ case 'low':
276
+ return '#f59e0b';
277
+ // 橙色
278
+ default:
279
+ return '#64748b';
280
+ // 灰色
281
+ }
282
+ };
283
+ return /*#__PURE__*/React.createElement("div", {
284
+ className: `qbit-reputation-card ${className}`
285
+ }, /*#__PURE__*/React.createElement("div", {
286
+ className: "qbit-reputation-main"
287
+ }, /*#__PURE__*/React.createElement("div", {
288
+ className: "qbit-reputation-circle-wrap"
289
+ }, /*#__PURE__*/React.createElement("svg", {
290
+ className: "qbit-reputation-svg",
291
+ viewBox: "0 0 36 36"
292
+ }, /*#__PURE__*/React.createElement("path", {
293
+ className: "qbit-reputation-bg",
294
+ d: "M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831"
295
+ }), /*#__PURE__*/React.createElement("path", {
296
+ className: "qbit-reputation-progress",
297
+ strokeDasharray: `${Math.min(100, Math.max(0, score))}, 100`,
298
+ d: "M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831",
299
+ stroke: getLevelColor(trustLevel)
300
+ }), /*#__PURE__*/React.createElement("text", {
301
+ x: "18",
302
+ y: "20.35",
303
+ className: "qbit-reputation-text",
304
+ fill: getLevelColor(trustLevel)
305
+ }, score))), /*#__PURE__*/React.createElement("div", {
306
+ className: "qbit-reputation-meta"
307
+ }, /*#__PURE__*/React.createElement("h4", {
308
+ className: "qbit-reputation-title"
309
+ }, t('reputation')), /*#__PURE__*/React.createElement("div", {
310
+ className: "qbit-reputation-badge-row"
311
+ }, /*#__PURE__*/React.createElement("span", {
312
+ className: "qbit-reputation-level-badge",
313
+ style: {
314
+ backgroundColor: getLevelColor(trustLevel) + '15',
315
+ color: getLevelColor(trustLevel),
316
+ border: `1px solid ${getLevelColor(trustLevel)}30`
317
+ }
318
+ }, t('trustLevel'), ": ", trustLevel)))), /*#__PURE__*/React.createElement("div", {
319
+ className: "qbit-reputation-badges-section"
320
+ }, /*#__PURE__*/React.createElement("h5", {
321
+ className: "qbit-badges-header"
322
+ }, t('badges')), badges.length === 0 ? /*#__PURE__*/React.createElement("p", {
323
+ className: "qbit-reputation-empty"
324
+ }, t('noData')) : /*#__PURE__*/React.createElement("div", {
325
+ className: "qbit-badges-grid"
326
+ }, badges.map((badge, idx) => /*#__PURE__*/React.createElement("div", {
327
+ key: badge.id || idx,
328
+ className: "qbit-badge-item",
329
+ title: badge.description || ''
330
+ }, /*#__PURE__*/React.createElement("div", {
331
+ className: "qbit-badge-icon",
332
+ style: {
333
+ background: badge.color || '#e2e8f0'
334
+ }
335
+ }, badge.icon || '🏅'), /*#__PURE__*/React.createElement("span", {
336
+ className: "qbit-badge-name"
337
+ }, badge.name))))), /*#__PURE__*/React.createElement("style", null, `
338
+ .qbit-reputation-card {
339
+ background: #ffffff;
340
+ border-radius: 16px;
341
+ border: 1px solid #f1f5f9;
342
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);
343
+ padding: 20px;
344
+ max-width: 320px;
345
+ font-family: system-ui, -apple-system, sans-serif;
346
+ }
347
+ .qbit-reputation-main {
348
+ display: flex;
349
+ align-items: center;
350
+ gap: 16px;
351
+ border-bottom: 1px solid #f1f5f9;
352
+ padding-bottom: 16px;
353
+ margin-bottom: 16px;
354
+ }
355
+ .qbit-reputation-circle-wrap {
356
+ width: 72px;
357
+ height: 72px;
358
+ }
359
+ .qbit-reputation-svg {
360
+ width: 100%;
361
+ height: 100%;
362
+ }
363
+ .qbit-reputation-bg {
364
+ fill: none;
365
+ stroke: #f1f5f9;
366
+ stroke-width: 2.8;
367
+ }
368
+ .qbit-reputation-progress {
369
+ fill: none;
370
+ stroke-width: 2.8;
371
+ stroke-linecap: round;
372
+ transition: stroke-dasharray 0.3s ease;
373
+ }
374
+ .qbit-reputation-text {
375
+ font-size: 8px;
376
+ font-weight: 700;
377
+ text-anchor: middle;
378
+ dominant-baseline: middle;
379
+ }
380
+ .qbit-reputation-meta {
381
+ display: flex;
382
+ flex-direction: column;
383
+ gap: 6px;
384
+ }
385
+ .qbit-reputation-title {
386
+ margin: 0;
387
+ font-size: 16px;
388
+ color: #0f172a;
389
+ font-weight: 600;
390
+ }
391
+ .qbit-reputation-level-badge {
392
+ padding: 4px 8px;
393
+ border-radius: 6px;
394
+ font-size: 11px;
395
+ font-weight: 500;
396
+ display: inline-block;
397
+ }
398
+ .qbit-reputation-badges-section {
399
+ display: flex;
400
+ flex-direction: column;
401
+ gap: 12px;
402
+ }
403
+ .qbit-badges-header {
404
+ margin: 0;
405
+ font-size: 13px;
406
+ color: #64748b;
407
+ text-transform: uppercase;
408
+ letter-spacing: 0.05em;
409
+ }
410
+ .qbit-reputation-empty {
411
+ margin: 0;
412
+ font-size: 13px;
413
+ color: #94a3b8;
414
+ text-align: center;
415
+ padding: 12px 0;
416
+ }
417
+ .qbit-badges-grid {
418
+ display: grid;
419
+ grid-template-columns: repeat(3, 1fr);
420
+ gap: 10px;
421
+ }
422
+ .qbit-badge-item {
423
+ display: flex;
424
+ flex-direction: column;
425
+ align-items: center;
426
+ gap: 6px;
427
+ text-align: center;
428
+ cursor: pointer;
429
+ }
430
+ .qbit-badge-icon {
431
+ width: 36px;
432
+ height: 36px;
433
+ border-radius: 50%;
434
+ display: flex;
435
+ align-items: center;
436
+ justify-content: center;
437
+ font-size: 18px;
438
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
439
+ transition: transform 0.2s;
440
+ }
441
+ .qbit-badge-item:hover .qbit-badge-icon {
442
+ transform: scale(1.1);
443
+ }
444
+ .qbit-badge-name {
445
+ font-size: 11px;
446
+ color: #475569;
447
+ font-weight: 500;
448
+ white-space: nowrap;
449
+ overflow: hidden;
450
+ text-overflow: ellipsis;
451
+ max-width: 100%;
452
+ }
453
+ .qbit-skeleton-circle {
454
+ width: 72px;
455
+ height: 72px;
456
+ border-radius: 50%;
457
+ background: #f1f5f9;
458
+ }
459
+ .qbit-skeleton-line {
460
+ height: 16px;
461
+ width: 120px;
462
+ background: #f1f5f9;
463
+ border-radius: 4px;
464
+ }
465
+ @keyframes pulse {
466
+ 0% { opacity: 0.6; }
467
+ 50% { opacity: 1; }
468
+ 100% { opacity: 0.6; }
469
+ }
470
+ .qbit-reputation-card.loading {
471
+ display: flex;
472
+ align-items: center;
473
+ gap: 16px;
474
+ animation: pulse 1.5s infinite ease-in-out;
475
+ }
476
+ `));
477
+ }
478
+
479
+ /**
480
+ * @quantabit/reputation-sdk
481
+ * QuantaBit Reputation SDK - User reputation scoring, trust levels, and behavior-based rating
482
+ */
483
+
484
+
485
+ // Convenience API exports
486
+ const getMyReputation = (...args) => reputationApi.getMyReputation(...args);
487
+ const getUserReputation = (...args) => reputationApi.getUserReputation(...args);
488
+ const getLeaderboard = (...args) => reputationApi.getLeaderboard(...args);
489
+ const getTrustLevel = (...args) => reputationApi.getTrustLevel(...args);
490
+ const getScoreHistory = (...args) => reputationApi.getScoreHistory(...args);
491
+ const recordEvent = (...args) => reputationApi.recordEvent(...args);
492
+ const adjustScore = (...args) => reputationApi.adjustScore(...args);
493
+ const getBadges = (...args) => reputationApi.getBadges(...args);
494
+
495
+ export { ReputationApiClient, ReputationBadgeCard, SUPPORTED_LANGUAGES, adjustScore, getBadges, getLanguage, getLeaderboard, getMyReputation, getScoreHistory, getTrustLevel, getUserReputation, messages, recordEvent, reputationApi, setLanguage, t, useReputation };
496
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/services/reputationApi.js","../src/i18n/index.js","../src/hooks/useReputation.js","../src/components/ReputationBadgeCard.jsx","../src/index.js"],"sourcesContent":["/**\n * QuantaBit 信誉 SDK - API 客户端\n * 提供用户信誉积分评估、信任等级、行为事件记录以及排行榜接口\n */\n\nimport { BaseApiClient } from '@quantabit/sdk-config';\n\n/**\n * 信誉 API 客户端\n */\nexport class ReputationApiClient extends BaseApiClient {\n constructor(config = {}) {\n super('/reputation', config);\n }\n\n /**\n * 获取当前登录用户的信誉积分与画像\n */\n async getMyReputation() {\n return this.get('/my');\n }\n\n /**\n * 获取指定用户的信誉积分\n * @param {string} userId - 用户 ID\n */\n async getUserReputation(userId) {\n return this.get(`/users/${userId}`);\n }\n\n /**\n * 获取信誉积分排行榜\n * @param {Object} params - 分页及过滤参数\n */\n async getLeaderboard(params = {}) {\n return this.get('/leaderboard', params);\n }\n\n /**\n * 获取指定用户的信任等级(安全控制维度)\n * @param {string} userId - 用户 ID\n */\n async getTrustLevel(userId) {\n return this.get(`/users/${userId}/trust-level`);\n }\n\n /**\n * 获取指定用户的信誉积分历史变动记录\n * @param {string} userId - 用户 ID\n * @param {Object} params - 时间范围与分页参数\n */\n async getScoreHistory(userId, params = {}) {\n return this.get(`/users/${userId}/history`, params);\n }\n\n /**\n * 上报用户行为事件(自动触发系统增减信誉分)\n * @param {string} eventType - 事件类型 (如:完成任务、恶意举报等)\n * @param {Object} data - 附带的业务数据\n */\n async recordEvent(eventType, data = {}) {\n return this.post('/events', { event_type: eventType, data });\n }\n\n /**\n * 手动调整用户信誉积分(管理员权限)\n * @param {string} userId - 用户 ID\n * @param {number} delta - 积分变化值 (可正可负)\n * @param {string} reason - 调整原因\n */\n async adjustScore(userId, delta, reason = '') {\n return this.post(`/users/${userId}/adjust`, { delta, reason });\n }\n\n /**\n * 获取用户获得的所有信誉徽章 (SBT)\n * @param {string} userId - 用户 ID\n */\n async getBadges(userId) {\n return this.get(`/users/${userId}/badges`);\n }\n}\n\nexport const reputationApi = new ReputationApiClient();\nexport default reputationApi;\n","/**\n * QuantaBit Reputation SDK - i18n support\n */\n\nconst messages = {\n en: {\n reputation: 'Reputation',\n score: 'Reputation Score',\n badges: 'Badges',\n trustLevel: 'Trust Level',\n history: 'Score History',\n adjust: 'Adjust Score',\n leaderboard: 'Leaderboard',\n noData: 'No Data'\n },\n zh: {\n reputation: '信誉',\n score: '信誉积分',\n badges: '信誉徽章',\n trustLevel: '信任等级',\n history: '评分历史记录',\n adjust: '调整评分',\n leaderboard: '信誉排行榜',\n noData: '无数据'\n },\n ja: {\n reputation: 'レピュテーション',\n score: '信頼スコア',\n badges: 'バッジ',\n trustLevel: '信頼レベル',\n history: 'スコア履歴',\n adjust: 'スコア調整',\n leaderboard: 'リーダーボード',\n noData: 'データなし'\n },\n ko: {\n reputation: '평판',\n score: '평판 점수',\n badges: '배지',\n trustLevel: '신뢰 등급',\n history: '점수 이력',\n adjust: '점수 조정',\n leaderboard: '리더보드',\n noData: '데이터 없음'\n }\n};\n\nconst SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];\nlet currentLanguage = 'en';\n\nexport function setLanguage(lang) {\n if (SUPPORTED_LANGUAGES.includes(lang)) currentLanguage = lang;\n}\n\nexport function getLanguage() {\n return currentLanguage;\n}\n\nexport function t(key) {\n return (messages[currentLanguage] || messages.en)[key] || key;\n}\n\nexport { messages, SUPPORTED_LANGUAGES };\n","/**\n * QuantaBit Reputation SDK - useReputation Hook\n * \n * 用户信誉积分与荣誉徽章 React 状态管理器\n */\n\nimport { useState, useCallback } from 'react';\nimport { reputationApi } from '../services/reputationApi';\n\nexport function useReputation() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [reputationInfo, setReputationInfo] = useState(null);\n const [badges, setBadges] = useState([]);\n const [history, setHistory] = useState([]);\n\n // 获取信誉总览\n const fetchReputation = useCallback(async (userId) => {\n setLoading(true);\n setError(null);\n try {\n const data = userId \n ? await reputationApi.getUserReputation(userId)\n : await reputationApi.getMyReputation();\n setReputationInfo(data);\n return data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 获取拥有的徽章列表\n const fetchBadges = useCallback(async (userId) => {\n setLoading(true);\n setError(null);\n try {\n const data = await reputationApi.getBadges(userId);\n setBadges(data?.badges || []);\n return data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 获取信誉分变动历史\n const fetchHistory = useCallback(async (params = {}) => {\n setLoading(true);\n setError(null);\n try {\n const data = await reputationApi.getScoreHistory(params);\n setHistory(data?.history || []);\n return data;\n } catch (err) {\n setError(err);\n throw err;\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n loading,\n error,\n reputationInfo,\n badges,\n history,\n fetchReputation,\n fetchBadges,\n fetchHistory,\n };\n}\n","/**\n * QuantaBit Reputation SDK - ReputationBadgeCard Component\n * \n * 个人信誉徽章卡片组件,支持信誉分展示、信任等级、勋章墙等,响应式设计并支持多语言\n */\n\nimport React, { useEffect } from 'react';\nimport { t } from '../i18n';\nimport { useReputation } from '../hooks/useReputation';\n\nexport function ReputationBadgeCard({ userId, className = '' }) {\n const { \n loading, \n error, \n reputationInfo, \n badges, \n fetchReputation, \n fetchBadges \n } = useReputation();\n\n useEffect(() => {\n fetchReputation(userId).catch(err => console.error(err));\n fetchBadges(userId).catch(err => console.error(err));\n }, [userId, fetchReputation, fetchBadges]);\n\n if (loading) {\n return (\n <div className={`qbit-reputation-card loading ${className}`}>\n <div className=\"qbit-skeleton-circle\"></div>\n <div className=\"qbit-skeleton-line\"></div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`qbit-reputation-card error ${className}`}>\n <p>Failed to load reputation data.</p>\n </div>\n );\n }\n\n const score = reputationInfo?.score ?? 100;\n const trustLevel = reputationInfo?.trustLevel ?? 'Standard';\n\n // 动态决定等级颜色\n const getLevelColor = (level) => {\n switch (String(level).toLowerCase()) {\n case 'trusted':\n case 'vip':\n case 'high':\n return '#10b981'; // 绿色\n case 'standard':\n case 'medium':\n return '#3b82f6'; // 蓝色\n case 'restricted':\n case 'low':\n return '#f59e0b'; // 橙色\n default:\n return '#64748b'; // 灰色\n }\n };\n\n return (\n <div className={`qbit-reputation-card ${className}`}>\n <div className=\"qbit-reputation-main\">\n <div className=\"qbit-reputation-circle-wrap\">\n <svg className=\"qbit-reputation-svg\" viewBox=\"0 0 36 36\">\n <path\n className=\"qbit-reputation-bg\"\n d=\"M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831\"\n />\n <path\n className=\"qbit-reputation-progress\"\n strokeDasharray={`${Math.min(100, Math.max(0, score))}, 100`}\n d=\"M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831\"\n stroke={getLevelColor(trustLevel)}\n />\n <text x=\"18\" y=\"20.35\" className=\"qbit-reputation-text\" fill={getLevelColor(trustLevel)}>\n {score}\n </text>\n </svg>\n </div>\n\n <div className=\"qbit-reputation-meta\">\n <h4 className=\"qbit-reputation-title\">{t('reputation')}</h4>\n <div className=\"qbit-reputation-badge-row\">\n <span \n className=\"qbit-reputation-level-badge\" \n style={{ backgroundColor: getLevelColor(trustLevel) + '15', color: getLevelColor(trustLevel), border: `1px solid ${getLevelColor(trustLevel)}30` }}\n >\n {t('trustLevel')}: {trustLevel}\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"qbit-reputation-badges-section\">\n <h5 className=\"qbit-badges-header\">{t('badges')}</h5>\n {badges.length === 0 ? (\n <p className=\"qbit-reputation-empty\">{t('noData')}</p>\n ) : (\n <div className=\"qbit-badges-grid\">\n {badges.map((badge, idx) => (\n <div key={badge.id || idx} className=\"qbit-badge-item\" title={badge.description || ''}>\n <div className=\"qbit-badge-icon\" style={{ background: badge.color || '#e2e8f0' }}>\n {badge.icon || '🏅'}\n </div>\n <span className=\"qbit-badge-name\">{badge.name}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <style>{`\n .qbit-reputation-card {\n background: #ffffff;\n border-radius: 16px;\n border: 1px solid #f1f5f9;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);\n padding: 20px;\n max-width: 320px;\n font-family: system-ui, -apple-system, sans-serif;\n }\n .qbit-reputation-main {\n display: flex;\n align-items: center;\n gap: 16px;\n border-bottom: 1px solid #f1f5f9;\n padding-bottom: 16px;\n margin-bottom: 16px;\n }\n .qbit-reputation-circle-wrap {\n width: 72px;\n height: 72px;\n }\n .qbit-reputation-svg {\n width: 100%;\n height: 100%;\n }\n .qbit-reputation-bg {\n fill: none;\n stroke: #f1f5f9;\n stroke-width: 2.8;\n }\n .qbit-reputation-progress {\n fill: none;\n stroke-width: 2.8;\n stroke-linecap: round;\n transition: stroke-dasharray 0.3s ease;\n }\n .qbit-reputation-text {\n font-size: 8px;\n font-weight: 700;\n text-anchor: middle;\n dominant-baseline: middle;\n }\n .qbit-reputation-meta {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .qbit-reputation-title {\n margin: 0;\n font-size: 16px;\n color: #0f172a;\n font-weight: 600;\n }\n .qbit-reputation-level-badge {\n padding: 4px 8px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 500;\n display: inline-block;\n }\n .qbit-reputation-badges-section {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .qbit-badges-header {\n margin: 0;\n font-size: 13px;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n .qbit-reputation-empty {\n margin: 0;\n font-size: 13px;\n color: #94a3b8;\n text-align: center;\n padding: 12px 0;\n }\n .qbit-badges-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 10px;\n }\n .qbit-badge-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n text-align: center;\n cursor: pointer;\n }\n .qbit-badge-icon {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n transition: transform 0.2s;\n }\n .qbit-badge-item:hover .qbit-badge-icon {\n transform: scale(1.1);\n }\n .qbit-badge-name {\n font-size: 11px;\n color: #475569;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n .qbit-skeleton-circle {\n width: 72px;\n height: 72px;\n border-radius: 50%;\n background: #f1f5f9;\n }\n .qbit-skeleton-line {\n height: 16px;\n width: 120px;\n background: #f1f5f9;\n border-radius: 4px;\n }\n @keyframes pulse {\n 0% { opacity: 0.6; }\n 50% { opacity: 1; }\n 100% { opacity: 0.6; }\n }\n .qbit-reputation-card.loading {\n display: flex;\n align-items: center;\n gap: 16px;\n animation: pulse 1.5s infinite ease-in-out;\n }\n `}</style>\n </div>\n );\n}\n","/**\n * @quantabit/reputation-sdk\n * QuantaBit Reputation SDK - User reputation scoring, trust levels, and behavior-based rating\n */\n\nimport { reputationApi, ReputationApiClient } from './services/reputationApi';\nimport { messages, SUPPORTED_LANGUAGES, setLanguage, getLanguage, t } from './i18n';\nimport { useReputation } from './hooks/useReputation';\nimport { ReputationBadgeCard } from './components/ReputationBadgeCard.jsx';\n\nexport {\n reputationApi,\n ReputationApiClient,\n messages,\n SUPPORTED_LANGUAGES,\n setLanguage,\n getLanguage,\n t,\n useReputation,\n ReputationBadgeCard\n};\n\n// Convenience API exports\nexport const getMyReputation = (...args) => reputationApi.getMyReputation(...args);\nexport const getUserReputation = (...args) => reputationApi.getUserReputation(...args);\nexport const getLeaderboard = (...args) => reputationApi.getLeaderboard(...args);\nexport const getTrustLevel = (...args) => reputationApi.getTrustLevel(...args);\nexport const getScoreHistory = (...args) => reputationApi.getScoreHistory(...args);\nexport const recordEvent = (...args) => reputationApi.recordEvent(...args);\nexport const adjustScore = (...args) => reputationApi.adjustScore(...args);\nexport const getBadges = (...args) => reputationApi.getBadges(...args);\n"],"names":["ReputationApiClient","BaseApiClient","constructor","config","getMyReputation","get","getUserReputation","userId","getLeaderboard","params","getTrustLevel","getScoreHistory","recordEvent","eventType","data","post","event_type","adjustScore","delta","reason","getBadges","reputationApi","messages","en","reputation","score","badges","trustLevel","history","adjust","leaderboard","noData","zh","ja","ko","SUPPORTED_LANGUAGES","currentLanguage","setLanguage","lang","includes","getLanguage","t","key","useReputation","loading","setLoading","useState","error","setError","reputationInfo","setReputationInfo","setBadges","setHistory","fetchReputation","useCallback","err","fetchBadges","fetchHistory","ReputationBadgeCard","className","useEffect","catch","console","React","createElement","getLevelColor","level","String","toLowerCase","viewBox","d","strokeDasharray","Math","min","max","stroke","x","y","fill","style","backgroundColor","color","border","length","map","badge","idx","id","title","description","background","icon","name","args"],"mappings":"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ACE,CAEJ,CAAC,eAEN7B,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA,IAAA,EAAQ;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAA,CAAe,CACN,CAAC;AAEV;;ACjQA;AACA;AACA;AACA;;;AAmBA;AACO,MAAM5D,eAAe,GAAGA,CAAC,GAAGyF,IAAI,KAAKxE,aAAa,CAACjB,eAAe,CAAC,GAAGyF,IAAI;AAC1E,MAAMvF,iBAAiB,GAAGA,CAAC,GAAGuF,IAAI,KAAKxE,aAAa,CAACf,iBAAiB,CAAC,GAAGuF,IAAI;AAC9E,MAAMrF,cAAc,GAAGA,CAAC,GAAGqF,IAAI,KAAKxE,aAAa,CAACb,cAAc,CAAC,GAAGqF,IAAI;AACxE,MAAMnF,aAAa,GAAGA,CAAC,GAAGmF,IAAI,KAAKxE,aAAa,CAACX,aAAa,CAAC,GAAGmF,IAAI;AACtE,MAAMlF,eAAe,GAAGA,CAAC,GAAGkF,IAAI,KAAKxE,aAAa,CAACV,eAAe,CAAC,GAAGkF,IAAI;AAC1E,MAAMjF,WAAW,GAAGA,CAAC,GAAGiF,IAAI,KAAKxE,aAAa,CAACT,WAAW,CAAC,GAAGiF,IAAI;AAClE,MAAM5E,WAAW,GAAGA,CAAC,GAAG4E,IAAI,KAAKxE,aAAa,CAACJ,WAAW,CAAC,GAAG4E,IAAI;AAClE,MAAMzE,SAAS,GAAGA,CAAC,GAAGyE,IAAI,KAAKxE,aAAa,CAACD,SAAS,CAAC,GAAGyE,IAAI;;;;"}
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "@quantabit/reputation-sdk",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "QuantaBit Reputation SDK - User reputation scoring, trust levels, and behavior-based rating",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.esm.js",
8
+ "types": "types/index.d.ts",
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "LICENSE",
13
+ "types"
14
+ ],
15
+ "exports": {
16
+ ".": {
17
+ "import": "./dist/index.esm.js",
18
+ "require": "./dist/index.cjs",
19
+ "types": "./types/index.d.ts"
20
+ },
21
+ "./styles": "./dist/styles.css",
22
+ "./styles.css": "./dist/styles.css"
23
+ },
24
+ "scripts": {
25
+ "build": "rollup -c",
26
+ "dev": "rollup -c -w",
27
+ "clean": "rm -rf dist",
28
+ "prepublishOnly": "npm run clean && npm run build",
29
+ "test": "jest --passWithNoTests"
30
+ },
31
+ "peerDependencies": {
32
+ "react": ">=17.0.0",
33
+ "react-dom": ">=17.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@babel/core": "^7.23.0",
37
+ "@babel/preset-env": "^7.23.0",
38
+ "@babel/preset-react": "^7.23.0",
39
+ "@rollup/plugin-babel": "^6.0.0",
40
+ "@rollup/plugin-commonjs": "^25.0.0",
41
+ "@rollup/plugin-node-resolve": "^15.0.0",
42
+ "babel-jest": "^29.7.0",
43
+ "identity-obj-proxy": "^3.0.0",
44
+ "jest": "^29.7.0",
45
+ "jest-environment-jsdom": "^29.7.0",
46
+ "react": "^18.2.0",
47
+ "react-dom": "^18.2.0",
48
+ "rollup": "^4.0.0",
49
+ "rollup-plugin-postcss": "^4.0.0"
50
+ },
51
+ "keywords": [
52
+ "reputation",
53
+ "trust",
54
+ "rating",
55
+ "quantabit"
56
+ ],
57
+ "author": "QuantaBit Team",
58
+ "license": "MIT",
59
+ "publishConfig": {
60
+ "access": "public",
61
+ "registry": "https://registry.npmjs.org"
62
+ },
63
+ "dependencies": {
64
+ "@quantabit/sdk-config": "^1.0.6"
65
+ },
66
+ "repository": {
67
+ "type": "git",
68
+ "url": "https://github.com/quantabit-chain/qbit-sdk.git",
69
+ "directory": "packages/reputation-sdk"
70
+ },
71
+ "homepage": "https://github.com/quantabit-chain/qbit-sdk/tree/main/packages/reputation-sdk#readme",
72
+ "bugs": {
73
+ "url": "https://github.com/quantabit-chain/qbit-sdk/issues"
74
+ },
75
+ "engines": {
76
+ "node": ">=18.0.0"
77
+ },
78
+ "sideEffects": false,
79
+ "qbit": {
80
+ "privacy": {
81
+ "level": "functional",
82
+ "dataCollection": "Feature-related data for personalization. Requires user consent.",
83
+ "gdprCompliant": true,
84
+ "ccpaCompliant": true
85
+ }
86
+ }
87
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @quantabit/reputation-sdk TypeScript Type Definitions
3
+ *
4
+ * Auto-generated type stubs. Enhance with specific types as the SDK matures.
5
+ */
6
+
7
+ // ============ Services ============
8
+
9
+ export declare const reputationApi: ReputationApiClient;
10
+
11
+ export declare class ReputationApiClient {
12
+ constructor(config?: Record<string, any>);
13
+ setToken(token: string): void;
14
+ setBaseUrl(url: string): void;
15
+ destroy(): void;
16
+ getMyReputation(): Promise<any>;
17
+ getUserReputation(userId: string): Promise<any>;
18
+ getLeaderboard(params?: Record<string, any>): Promise<any>;
19
+ getTrustLevel(userId: string): Promise<any>;
20
+ getScoreHistory(userId: string, params?: Record<string, any>): Promise<any>;
21
+ recordEvent(eventType: string, data?: Record<string, any>): Promise<any>;
22
+ adjustScore(userId: string, delta: number, reason?: string): Promise<any>;
23
+ getBadges(userId: string): Promise<any>;
24
+ }
25
+
26
+ // ============ Functions & Utilities ============
27
+
28
+ export declare const SUPPORTED_LANGUAGES: string[];
29
+ export declare function setLanguage(lang: string): void;
30
+ export declare function getLanguage(): string;
31
+ export declare function t(key: string): string;