@quantabit/account-merge-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/dist/index.esm.js +486 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.iife.js +499 -0
- package/dist/index.iife.js.map +1 -0
- package/dist/index.js +498 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.js +500 -0
- package/dist/index.umd.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
var QbitDIDAuth = (function (exports, sdkConfig, React) {
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Account Merge SDK - API 客户端
|
|
6
|
+
* 账号合并系统后端接口封装
|
|
7
|
+
*
|
|
8
|
+
* 使用 BaseApiClient 基类简化代码
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 账号合并 API 客户端
|
|
14
|
+
*/
|
|
15
|
+
class AccountMergeApiClient extends sdkConfig.BaseApiClient {
|
|
16
|
+
constructor(config = {}) {
|
|
17
|
+
super('/account/merge', config);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// ============ 合并预检 ============
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 检查账号是否可合并
|
|
24
|
+
* @param {string} targetAccountId - 目标账号 ID
|
|
25
|
+
*/
|
|
26
|
+
async checkMergeEligibility(targetAccountId) {
|
|
27
|
+
return this.post('/check', {
|
|
28
|
+
target_account_id: targetAccountId
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 预览合并结果
|
|
34
|
+
* @param {string} targetAccountId - 目标账号 ID
|
|
35
|
+
*/
|
|
36
|
+
async previewMerge(targetAccountId) {
|
|
37
|
+
return this.post('/preview', {
|
|
38
|
+
target_account_id: targetAccountId
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 获取数据冲突列表
|
|
44
|
+
* @param {string} targetAccountId - 目标账号 ID
|
|
45
|
+
*/
|
|
46
|
+
async getConflicts(targetAccountId) {
|
|
47
|
+
return this.post('/conflicts', {
|
|
48
|
+
target_account_id: targetAccountId
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ============ 发起合并 ============
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 发起合并请求
|
|
56
|
+
* @param {Object} mergeRequest - 合并请求数据
|
|
57
|
+
*/
|
|
58
|
+
async requestMerge(mergeRequest) {
|
|
59
|
+
return this.post('/request', mergeRequest);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 验证目标账号
|
|
64
|
+
* @param {string} requestId - 请求 ID
|
|
65
|
+
* @param {Object} verification - 验证数据
|
|
66
|
+
*/
|
|
67
|
+
async verifyTargetAccount(requestId, verification) {
|
|
68
|
+
return this.post(`/request/${requestId}/verify`, verification);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* 确认合并
|
|
73
|
+
* @param {string} requestId - 请求 ID
|
|
74
|
+
* @param {Object} options - 合并选项
|
|
75
|
+
*/
|
|
76
|
+
async confirmMerge(requestId, options = {}) {
|
|
77
|
+
return this.post(`/request/${requestId}/confirm`, options);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 取消合并请求
|
|
82
|
+
* @param {string} requestId - 请求 ID
|
|
83
|
+
*/
|
|
84
|
+
async cancelMerge(requestId) {
|
|
85
|
+
return this.post(`/request/${requestId}/cancel`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ============ 合并状态 ============
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 获取合并请求状态
|
|
92
|
+
* @param {string} requestId - 请求 ID
|
|
93
|
+
*/
|
|
94
|
+
async getMergeStatus(requestId) {
|
|
95
|
+
return this.get(`/request/${requestId}/status`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 获取我的合并历史
|
|
100
|
+
* @param {Object} params - 查询参数
|
|
101
|
+
*/
|
|
102
|
+
async getMergeHistory(params = {}) {
|
|
103
|
+
return this.get('/history', params);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 获取待处理的合并请求
|
|
108
|
+
*/
|
|
109
|
+
async getPendingRequests() {
|
|
110
|
+
return this.get('/pending');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ============ 数据迁移 ============
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* 获取可迁移的数据类型
|
|
117
|
+
*/
|
|
118
|
+
async getMigratableDataTypes() {
|
|
119
|
+
return this.get('/data-types');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* 选择要迁移的数据
|
|
124
|
+
* @param {string} requestId - 请求 ID
|
|
125
|
+
* @param {Object} selections - 数据选择
|
|
126
|
+
*/
|
|
127
|
+
async selectDataToMigrate(requestId, selections) {
|
|
128
|
+
return this.post(`/request/${requestId}/select-data`, selections);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 获取迁移进度
|
|
133
|
+
* @param {string} requestId - 请求 ID
|
|
134
|
+
*/
|
|
135
|
+
async getMigrationProgress(requestId) {
|
|
136
|
+
return this.get(`/request/${requestId}/progress`);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ============ 冲突解决 ============
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* 解决数据冲突
|
|
143
|
+
* @param {string} requestId - 请求 ID
|
|
144
|
+
* @param {Object} resolutions - 冲突解决方案
|
|
145
|
+
*/
|
|
146
|
+
async resolveConflicts(requestId, resolutions) {
|
|
147
|
+
return this.post(`/request/${requestId}/resolve`, resolutions);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* 选择保留的数据
|
|
152
|
+
* @param {string} requestId - 请求 ID
|
|
153
|
+
* @param {string} conflictId - 冲突 ID
|
|
154
|
+
* @param {string} choice - 选择 (source/target/merge)
|
|
155
|
+
*/
|
|
156
|
+
async chooseConflictResolution(requestId, conflictId, choice) {
|
|
157
|
+
return this.post(`/request/${requestId}/conflicts/${conflictId}`, {
|
|
158
|
+
choice
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ============ 账号注销 ============
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 合并后注销原账号
|
|
166
|
+
* @param {string} requestId - 请求 ID
|
|
167
|
+
*/
|
|
168
|
+
async deactivateSourceAccount(requestId) {
|
|
169
|
+
return this.post(`/request/${requestId}/deactivate-source`);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* 保留原账号为备用
|
|
174
|
+
* @param {string} requestId - 请求 ID
|
|
175
|
+
*/
|
|
176
|
+
async keepSourceAsBackup(requestId) {
|
|
177
|
+
return this.post(`/request/${requestId}/keep-backup`);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// ============ 回滚 ============
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* 检查是否可回滚
|
|
184
|
+
* @param {string} requestId - 请求 ID
|
|
185
|
+
*/
|
|
186
|
+
async checkRollbackEligibility(requestId) {
|
|
187
|
+
return this.get(`/request/${requestId}/rollback-check`);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* 回滚合并
|
|
192
|
+
* @param {string} requestId - 请求 ID
|
|
193
|
+
*/
|
|
194
|
+
async rollbackMerge(requestId) {
|
|
195
|
+
return this.post(`/request/${requestId}/rollback`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// 创建默认实例
|
|
200
|
+
const accountMergeApi = new AccountMergeApiClient();
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Account Merge SDK - React Hooks
|
|
204
|
+
*/
|
|
205
|
+
|
|
206
|
+
function useAccountMerge() {
|
|
207
|
+
const [mergeHistory, setMergeHistory] = React.useState([]);
|
|
208
|
+
const [pendingRequests, setPendingRequests] = React.useState([]);
|
|
209
|
+
const [loading, setLoading] = React.useState(false);
|
|
210
|
+
const [error, setError] = React.useState(null);
|
|
211
|
+
const fetchHistory = React.useCallback(async () => {
|
|
212
|
+
try {
|
|
213
|
+
const result = await accountMergeApi.getMergeHistory();
|
|
214
|
+
setMergeHistory(result.data || []);
|
|
215
|
+
} catch (err) {
|
|
216
|
+
setError(err.message);
|
|
217
|
+
}
|
|
218
|
+
}, []);
|
|
219
|
+
const fetchPending = React.useCallback(async () => {
|
|
220
|
+
try {
|
|
221
|
+
const result = await accountMergeApi.getPendingRequests();
|
|
222
|
+
setPendingRequests(result.data || []);
|
|
223
|
+
} catch (err) {
|
|
224
|
+
setError(err.message);
|
|
225
|
+
}
|
|
226
|
+
}, []);
|
|
227
|
+
const checkEligibility = React.useCallback(async targetAccountId => {
|
|
228
|
+
setLoading(true);
|
|
229
|
+
try {
|
|
230
|
+
return await accountMergeApi.checkMergeEligibility(targetAccountId);
|
|
231
|
+
} finally {
|
|
232
|
+
setLoading(false);
|
|
233
|
+
}
|
|
234
|
+
}, []);
|
|
235
|
+
const previewMerge = React.useCallback(async targetAccountId => {
|
|
236
|
+
setLoading(true);
|
|
237
|
+
try {
|
|
238
|
+
return await accountMergeApi.previewMerge(targetAccountId);
|
|
239
|
+
} finally {
|
|
240
|
+
setLoading(false);
|
|
241
|
+
}
|
|
242
|
+
}, []);
|
|
243
|
+
const requestMerge = React.useCallback(async mergeRequest => {
|
|
244
|
+
setLoading(true);
|
|
245
|
+
try {
|
|
246
|
+
const result = await accountMergeApi.requestMerge(mergeRequest);
|
|
247
|
+
await fetchPending();
|
|
248
|
+
return result;
|
|
249
|
+
} finally {
|
|
250
|
+
setLoading(false);
|
|
251
|
+
}
|
|
252
|
+
}, [fetchPending]);
|
|
253
|
+
const confirmMerge = React.useCallback(async (requestId, options) => {
|
|
254
|
+
setLoading(true);
|
|
255
|
+
try {
|
|
256
|
+
const result = await accountMergeApi.confirmMerge(requestId, options);
|
|
257
|
+
await fetchHistory();
|
|
258
|
+
return result;
|
|
259
|
+
} finally {
|
|
260
|
+
setLoading(false);
|
|
261
|
+
}
|
|
262
|
+
}, [fetchHistory]);
|
|
263
|
+
const cancelMerge = React.useCallback(async requestId => {
|
|
264
|
+
setLoading(true);
|
|
265
|
+
try {
|
|
266
|
+
const result = await accountMergeApi.cancelMerge(requestId);
|
|
267
|
+
await fetchPending();
|
|
268
|
+
return result;
|
|
269
|
+
} finally {
|
|
270
|
+
setLoading(false);
|
|
271
|
+
}
|
|
272
|
+
}, [fetchPending]);
|
|
273
|
+
React.useEffect(() => {
|
|
274
|
+
fetchHistory();
|
|
275
|
+
fetchPending();
|
|
276
|
+
}, [fetchHistory, fetchPending]);
|
|
277
|
+
return {
|
|
278
|
+
mergeHistory,
|
|
279
|
+
pendingRequests,
|
|
280
|
+
loading,
|
|
281
|
+
error,
|
|
282
|
+
checkEligibility,
|
|
283
|
+
previewMerge,
|
|
284
|
+
requestMerge,
|
|
285
|
+
confirmMerge,
|
|
286
|
+
cancelMerge,
|
|
287
|
+
fetchHistory,
|
|
288
|
+
fetchPending
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Account Merge SDK - 账号合并组件
|
|
294
|
+
*/
|
|
295
|
+
|
|
296
|
+
function AccountMergeWizard({
|
|
297
|
+
onComplete
|
|
298
|
+
}) {
|
|
299
|
+
const [step, setStep] = React.useState(1);
|
|
300
|
+
const [targetAccount, setTargetAccount] = React.useState('');
|
|
301
|
+
const [preview, setPreview] = React.useState(null);
|
|
302
|
+
const {
|
|
303
|
+
loading,
|
|
304
|
+
error,
|
|
305
|
+
checkEligibility,
|
|
306
|
+
previewMerge,
|
|
307
|
+
requestMerge,
|
|
308
|
+
confirmMerge
|
|
309
|
+
} = useAccountMerge();
|
|
310
|
+
const handleCheck = async () => {
|
|
311
|
+
const result = await checkEligibility(targetAccount);
|
|
312
|
+
if (result.data?.eligible) {
|
|
313
|
+
const previewResult = await previewMerge(targetAccount);
|
|
314
|
+
setPreview(previewResult.data);
|
|
315
|
+
setStep(2);
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
const handleConfirm = async () => {
|
|
319
|
+
const result = await requestMerge({
|
|
320
|
+
target_account_id: targetAccount
|
|
321
|
+
});
|
|
322
|
+
if (result.data?.request_id) {
|
|
323
|
+
await confirmMerge(result.data.request_id);
|
|
324
|
+
setStep(3);
|
|
325
|
+
onComplete?.();
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
329
|
+
className: "eco-merge-wizard"
|
|
330
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
331
|
+
className: "eco-wizard-steps"
|
|
332
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
333
|
+
className: `eco-step ${step >= 1 ? 'active' : ''}`
|
|
334
|
+
}, "1. \u9009\u62E9\u8D26\u53F7"), /*#__PURE__*/React.createElement("div", {
|
|
335
|
+
className: `eco-step ${step >= 2 ? 'active' : ''}`
|
|
336
|
+
}, "2. \u9884\u89C8\u5408\u5E76"), /*#__PURE__*/React.createElement("div", {
|
|
337
|
+
className: `eco-step ${step >= 3 ? 'active' : ''}`
|
|
338
|
+
}, "3. \u5B8C\u6210")), step === 1 && /*#__PURE__*/React.createElement("div", {
|
|
339
|
+
className: "eco-wizard-content"
|
|
340
|
+
}, /*#__PURE__*/React.createElement("h3", null, "\u9009\u62E9\u8981\u5408\u5E76\u7684\u8D26\u53F7"), /*#__PURE__*/React.createElement("div", {
|
|
341
|
+
className: "eco-form-group"
|
|
342
|
+
}, /*#__PURE__*/React.createElement("label", null, "\u76EE\u6807\u8D26\u53F7 ID"), /*#__PURE__*/React.createElement("input", {
|
|
343
|
+
type: "text",
|
|
344
|
+
value: targetAccount,
|
|
345
|
+
onChange: e => setTargetAccount(e.target.value),
|
|
346
|
+
placeholder: "\u8F93\u5165\u8981\u5408\u5E76\u7684\u8D26\u53F7 ID"
|
|
347
|
+
})), error && /*#__PURE__*/React.createElement("div", {
|
|
348
|
+
className: "eco-error"
|
|
349
|
+
}, error), /*#__PURE__*/React.createElement("button", {
|
|
350
|
+
className: "eco-btn eco-btn-primary",
|
|
351
|
+
onClick: handleCheck,
|
|
352
|
+
disabled: loading || !targetAccount
|
|
353
|
+
}, loading ? '检查中...' : '检查资格')), step === 2 && preview && /*#__PURE__*/React.createElement("div", {
|
|
354
|
+
className: "eco-wizard-content"
|
|
355
|
+
}, /*#__PURE__*/React.createElement("h3", null, "\u9884\u89C8\u5408\u5E76\u7ED3\u679C"), /*#__PURE__*/React.createElement("div", {
|
|
356
|
+
className: "eco-preview-info"
|
|
357
|
+
}, /*#__PURE__*/React.createElement("p", null, "\u5C06\u5408\u5E76\u4EE5\u4E0B\u6570\u636E\uFF1A"), /*#__PURE__*/React.createElement("ul", null, preview.data_to_migrate?.map((item, i) => /*#__PURE__*/React.createElement("li", {
|
|
358
|
+
key: i
|
|
359
|
+
}, item)))), /*#__PURE__*/React.createElement("div", {
|
|
360
|
+
className: "eco-wizard-actions"
|
|
361
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
362
|
+
className: "eco-btn",
|
|
363
|
+
onClick: () => setStep(1)
|
|
364
|
+
}, "\u8FD4\u56DE"), /*#__PURE__*/React.createElement("button", {
|
|
365
|
+
className: "eco-btn eco-btn-primary",
|
|
366
|
+
onClick: handleConfirm,
|
|
367
|
+
disabled: loading
|
|
368
|
+
}, loading ? '处理中...' : '确认合并'))), step === 3 && /*#__PURE__*/React.createElement("div", {
|
|
369
|
+
className: "eco-wizard-content eco-success"
|
|
370
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
371
|
+
className: "eco-success-icon"
|
|
372
|
+
}, "\u2713"), /*#__PURE__*/React.createElement("h3", null, "\u5408\u5E76\u5B8C\u6210"), /*#__PURE__*/React.createElement("p", null, "\u60A8\u7684\u8D26\u53F7\u5DF2\u6210\u529F\u5408\u5E76")));
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Account Merge SDK - 国际化
|
|
377
|
+
*/
|
|
378
|
+
|
|
379
|
+
const zh = {
|
|
380
|
+
accountMerge: {
|
|
381
|
+
title: '账号合并',
|
|
382
|
+
subtitle: '将多个账号合并为一个',
|
|
383
|
+
steps: {
|
|
384
|
+
check: '检查资格',
|
|
385
|
+
preview: '预览合并',
|
|
386
|
+
confirm: '确认合并',
|
|
387
|
+
complete: '完成'
|
|
388
|
+
},
|
|
389
|
+
actions: {
|
|
390
|
+
startMerge: '开始合并',
|
|
391
|
+
preview: '预览',
|
|
392
|
+
confirm: '确认合并',
|
|
393
|
+
cancel: '取消',
|
|
394
|
+
rollback: '回滚'
|
|
395
|
+
},
|
|
396
|
+
status: {
|
|
397
|
+
pending: '待处理',
|
|
398
|
+
processing: '处理中',
|
|
399
|
+
completed: '已完成',
|
|
400
|
+
cancelled: '已取消',
|
|
401
|
+
failed: '失败'
|
|
402
|
+
},
|
|
403
|
+
conflicts: {
|
|
404
|
+
title: '数据冲突',
|
|
405
|
+
keepSource: '保留源账号',
|
|
406
|
+
keepTarget: '保留目标账号',
|
|
407
|
+
merge: '合并两者'
|
|
408
|
+
},
|
|
409
|
+
messages: {
|
|
410
|
+
eligible: '账号可以合并',
|
|
411
|
+
notEligible: '账号无法合并',
|
|
412
|
+
mergeSuccess: '合并成功',
|
|
413
|
+
mergeCancelled: '合并已取消'
|
|
414
|
+
},
|
|
415
|
+
errors: {
|
|
416
|
+
checkFailed: '检查失败',
|
|
417
|
+
mergeFailed: '合并失败',
|
|
418
|
+
rollbackFailed: '回滚失败'
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
const en = {
|
|
423
|
+
accountMerge: {
|
|
424
|
+
title: 'Account Merge',
|
|
425
|
+
subtitle: 'Merge multiple accounts into one',
|
|
426
|
+
steps: {
|
|
427
|
+
check: 'Check Eligibility',
|
|
428
|
+
preview: 'Preview Merge',
|
|
429
|
+
confirm: 'Confirm Merge',
|
|
430
|
+
complete: 'Complete'
|
|
431
|
+
},
|
|
432
|
+
actions: {
|
|
433
|
+
startMerge: 'Start Merge',
|
|
434
|
+
preview: 'Preview',
|
|
435
|
+
confirm: 'Confirm Merge',
|
|
436
|
+
cancel: 'Cancel',
|
|
437
|
+
rollback: 'Rollback'
|
|
438
|
+
},
|
|
439
|
+
status: {
|
|
440
|
+
pending: 'Pending',
|
|
441
|
+
processing: 'Processing',
|
|
442
|
+
completed: 'Completed',
|
|
443
|
+
cancelled: 'Cancelled',
|
|
444
|
+
failed: 'Failed'
|
|
445
|
+
},
|
|
446
|
+
conflicts: {
|
|
447
|
+
title: 'Data Conflicts',
|
|
448
|
+
keepSource: 'Keep Source',
|
|
449
|
+
keepTarget: 'Keep Target',
|
|
450
|
+
merge: 'Merge Both'
|
|
451
|
+
},
|
|
452
|
+
messages: {
|
|
453
|
+
eligible: 'Accounts can be merged',
|
|
454
|
+
notEligible: 'Accounts cannot be merged',
|
|
455
|
+
mergeSuccess: 'Merge successful',
|
|
456
|
+
mergeCancelled: 'Merge cancelled'
|
|
457
|
+
},
|
|
458
|
+
errors: {
|
|
459
|
+
checkFailed: 'Check failed',
|
|
460
|
+
mergeFailed: 'Merge failed',
|
|
461
|
+
rollbackFailed: 'Rollback failed'
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* @quantabit/account-merge-sdk - 账号合并 SDK
|
|
468
|
+
*/
|
|
469
|
+
|
|
470
|
+
// 类型定义
|
|
471
|
+
const MergeStatus = {
|
|
472
|
+
PENDING: 'pending',
|
|
473
|
+
PROCESSING: 'processing',
|
|
474
|
+
COMPLETED: 'completed',
|
|
475
|
+
CANCELLED: 'cancelled',
|
|
476
|
+
FAILED: 'failed'
|
|
477
|
+
};
|
|
478
|
+
const ConflictResolution = {
|
|
479
|
+
KEEP_SOURCE: 'source',
|
|
480
|
+
KEEP_TARGET: 'target',
|
|
481
|
+
MERGE: 'merge'
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
exports.AccountMergeApiClient = AccountMergeApiClient;
|
|
485
|
+
exports.AccountMergeWizard = AccountMergeWizard;
|
|
486
|
+
exports.ConflictResolution = ConflictResolution;
|
|
487
|
+
exports.MergeStatus = MergeStatus;
|
|
488
|
+
exports.accountMergeApi = accountMergeApi;
|
|
489
|
+
exports.default = accountMergeApi;
|
|
490
|
+
exports.en = en;
|
|
491
|
+
exports.useAccountMerge = useAccountMerge;
|
|
492
|
+
exports.zh = zh;
|
|
493
|
+
|
|
494
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
495
|
+
|
|
496
|
+
return exports;
|
|
497
|
+
|
|
498
|
+
})({}, sdkConfig, React);
|
|
499
|
+
//# sourceMappingURL=index.iife.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.iife.js","sources":["../src/services/accountMergeApi.js","../src/hooks/useAccountMerge.js","../src/components/AccountMergeWizard.jsx","../src/i18n/index.js","../src/index.js"],"sourcesContent":["/**\n * Account Merge SDK - API 客户端\n * 账号合并系统后端接口封装\n * \n * 使用 BaseApiClient 基类简化代码\n */\n\nimport { BaseApiClient } from '@quantabit/sdk-config';\n\n/**\n * 账号合并 API 客户端\n */\nexport class AccountMergeApiClient extends BaseApiClient {\n constructor(config = {}) {\n super('/account/merge', config);\n }\n\n // ============ 合并预检 ============\n\n /**\n * 检查账号是否可合并\n * @param {string} targetAccountId - 目标账号 ID\n */\n async checkMergeEligibility(targetAccountId) {\n return this.post('/check', { target_account_id: targetAccountId });\n }\n\n /**\n * 预览合并结果\n * @param {string} targetAccountId - 目标账号 ID\n */\n async previewMerge(targetAccountId) {\n return this.post('/preview', { target_account_id: targetAccountId });\n }\n\n /**\n * 获取数据冲突列表\n * @param {string} targetAccountId - 目标账号 ID\n */\n async getConflicts(targetAccountId) {\n return this.post('/conflicts', { target_account_id: targetAccountId });\n }\n\n // ============ 发起合并 ============\n\n /**\n * 发起合并请求\n * @param {Object} mergeRequest - 合并请求数据\n */\n async requestMerge(mergeRequest) {\n return this.post('/request', mergeRequest);\n }\n\n /**\n * 验证目标账号\n * @param {string} requestId - 请求 ID\n * @param {Object} verification - 验证数据\n */\n async verifyTargetAccount(requestId, verification) {\n return this.post(`/request/${requestId}/verify`, verification);\n }\n\n /**\n * 确认合并\n * @param {string} requestId - 请求 ID\n * @param {Object} options - 合并选项\n */\n async confirmMerge(requestId, options = {}) {\n return this.post(`/request/${requestId}/confirm`, options);\n }\n\n /**\n * 取消合并请求\n * @param {string} requestId - 请求 ID\n */\n async cancelMerge(requestId) {\n return this.post(`/request/${requestId}/cancel`);\n }\n\n // ============ 合并状态 ============\n\n /**\n * 获取合并请求状态\n * @param {string} requestId - 请求 ID\n */\n async getMergeStatus(requestId) {\n return this.get(`/request/${requestId}/status`);\n }\n\n /**\n * 获取我的合并历史\n * @param {Object} params - 查询参数\n */\n async getMergeHistory(params = {}) {\n return this.get('/history', params);\n }\n\n /**\n * 获取待处理的合并请求\n */\n async getPendingRequests() {\n return this.get('/pending');\n }\n\n // ============ 数据迁移 ============\n\n /**\n * 获取可迁移的数据类型\n */\n async getMigratableDataTypes() {\n return this.get('/data-types');\n }\n\n /**\n * 选择要迁移的数据\n * @param {string} requestId - 请求 ID\n * @param {Object} selections - 数据选择\n */\n async selectDataToMigrate(requestId, selections) {\n return this.post(`/request/${requestId}/select-data`, selections);\n }\n\n /**\n * 获取迁移进度\n * @param {string} requestId - 请求 ID\n */\n async getMigrationProgress(requestId) {\n return this.get(`/request/${requestId}/progress`);\n }\n\n // ============ 冲突解决 ============\n\n /**\n * 解决数据冲突\n * @param {string} requestId - 请求 ID\n * @param {Object} resolutions - 冲突解决方案\n */\n async resolveConflicts(requestId, resolutions) {\n return this.post(`/request/${requestId}/resolve`, resolutions);\n }\n\n /**\n * 选择保留的数据\n * @param {string} requestId - 请求 ID\n * @param {string} conflictId - 冲突 ID\n * @param {string} choice - 选择 (source/target/merge)\n */\n async chooseConflictResolution(requestId, conflictId, choice) {\n return this.post(`/request/${requestId}/conflicts/${conflictId}`, { choice });\n }\n\n // ============ 账号注销 ============\n\n /**\n * 合并后注销原账号\n * @param {string} requestId - 请求 ID\n */\n async deactivateSourceAccount(requestId) {\n return this.post(`/request/${requestId}/deactivate-source`);\n }\n\n /**\n * 保留原账号为备用\n * @param {string} requestId - 请求 ID\n */\n async keepSourceAsBackup(requestId) {\n return this.post(`/request/${requestId}/keep-backup`);\n }\n\n // ============ 回滚 ============\n\n /**\n * 检查是否可回滚\n * @param {string} requestId - 请求 ID\n */\n async checkRollbackEligibility(requestId) {\n return this.get(`/request/${requestId}/rollback-check`);\n }\n\n /**\n * 回滚合并\n * @param {string} requestId - 请求 ID\n */\n async rollbackMerge(requestId) {\n return this.post(`/request/${requestId}/rollback`);\n }\n}\n\n// 创建默认实例\nexport const accountMergeApi = new AccountMergeApiClient();\n\n\n\nexport default accountMergeApi;\n","/**\n * Account Merge SDK - React Hooks\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { accountMergeApi } from '../services/accountMergeApi';\n\nexport function useAccountMerge() {\n const [mergeHistory, setMergeHistory] = useState([]);\n const [pendingRequests, setPendingRequests] = useState([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n\n const fetchHistory = useCallback(async () => {\n try {\n const result = await accountMergeApi.getMergeHistory();\n setMergeHistory(result.data || []);\n } catch (err) {\n setError(err.message);\n }\n }, []);\n\n const fetchPending = useCallback(async () => {\n try {\n const result = await accountMergeApi.getPendingRequests();\n setPendingRequests(result.data || []);\n } catch (err) {\n setError(err.message);\n }\n }, []);\n\n const checkEligibility = useCallback(async (targetAccountId) => {\n setLoading(true);\n try {\n return await accountMergeApi.checkMergeEligibility(targetAccountId);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const previewMerge = useCallback(async (targetAccountId) => {\n setLoading(true);\n try {\n return await accountMergeApi.previewMerge(targetAccountId);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const requestMerge = useCallback(async (mergeRequest) => {\n setLoading(true);\n try {\n const result = await accountMergeApi.requestMerge(mergeRequest);\n await fetchPending();\n return result;\n } finally {\n setLoading(false);\n }\n }, [fetchPending]);\n\n const confirmMerge = useCallback(async (requestId, options) => {\n setLoading(true);\n try {\n const result = await accountMergeApi.confirmMerge(requestId, options);\n await fetchHistory();\n return result;\n } finally {\n setLoading(false);\n }\n }, [fetchHistory]);\n\n const cancelMerge = useCallback(async (requestId) => {\n setLoading(true);\n try {\n const result = await accountMergeApi.cancelMerge(requestId);\n await fetchPending();\n return result;\n } finally {\n setLoading(false);\n }\n }, [fetchPending]);\n\n useEffect(() => {\n fetchHistory();\n fetchPending();\n }, [fetchHistory, fetchPending]);\n\n return {\n mergeHistory,\n pendingRequests,\n loading,\n error,\n checkEligibility,\n previewMerge,\n requestMerge,\n confirmMerge,\n cancelMerge,\n fetchHistory,\n fetchPending,\n };\n}\n\nexport default { useAccountMerge };\n","/**\n * Account Merge SDK - 账号合并组件\n */\n\nimport React, { useState } from 'react';\nimport { useAccountMerge } from '../hooks/useAccountMerge';\n\nexport function AccountMergeWizard({ onComplete }) {\n const [step, setStep] = useState(1);\n const [targetAccount, setTargetAccount] = useState('');\n const [preview, setPreview] = useState(null);\n const { loading, error, checkEligibility, previewMerge, requestMerge, confirmMerge } = useAccountMerge();\n\n const handleCheck = async () => {\n const result = await checkEligibility(targetAccount);\n if (result.data?.eligible) {\n const previewResult = await previewMerge(targetAccount);\n setPreview(previewResult.data);\n setStep(2);\n }\n };\n\n const handleConfirm = async () => {\n const result = await requestMerge({ target_account_id: targetAccount });\n if (result.data?.request_id) {\n await confirmMerge(result.data.request_id);\n setStep(3);\n onComplete?.();\n }\n };\n\n return (\n <div className=\"eco-merge-wizard\">\n <div className=\"eco-wizard-steps\">\n <div className={`eco-step ${step >= 1 ? 'active' : ''}`}>1. 选择账号</div>\n <div className={`eco-step ${step >= 2 ? 'active' : ''}`}>2. 预览合并</div>\n <div className={`eco-step ${step >= 3 ? 'active' : ''}`}>3. 完成</div>\n </div>\n\n {step === 1 && (\n <div className=\"eco-wizard-content\">\n <h3>选择要合并的账号</h3>\n <div className=\"eco-form-group\">\n <label>目标账号 ID</label>\n <input\n type=\"text\"\n value={targetAccount}\n onChange={(e) => setTargetAccount(e.target.value)}\n placeholder=\"输入要合并的账号 ID\"\n />\n </div>\n {error && <div className=\"eco-error\">{error}</div>}\n <button \n className=\"eco-btn eco-btn-primary\"\n onClick={handleCheck}\n disabled={loading || !targetAccount}\n >\n {loading ? '检查中...' : '检查资格'}\n </button>\n </div>\n )}\n\n {step === 2 && preview && (\n <div className=\"eco-wizard-content\">\n <h3>预览合并结果</h3>\n <div className=\"eco-preview-info\">\n <p>将合并以下数据:</p>\n <ul>\n {preview.data_to_migrate?.map((item, i) => (\n <li key={i}>{item}</li>\n ))}\n </ul>\n </div>\n <div className=\"eco-wizard-actions\">\n <button className=\"eco-btn\" onClick={() => setStep(1)}>返回</button>\n <button \n className=\"eco-btn eco-btn-primary\"\n onClick={handleConfirm}\n disabled={loading}\n >\n {loading ? '处理中...' : '确认合并'}\n </button>\n </div>\n </div>\n )}\n\n {step === 3 && (\n <div className=\"eco-wizard-content eco-success\">\n <div className=\"eco-success-icon\">✓</div>\n <h3>合并完成</h3>\n <p>您的账号已成功合并</p>\n </div>\n )}\n </div>\n );\n}\n\nexport default AccountMergeWizard;\n","/**\n * Account Merge SDK - 国际化\n */\n\nexport const zh = {\n accountMerge: {\n title: '账号合并',\n subtitle: '将多个账号合并为一个',\n \n steps: {\n check: '检查资格',\n preview: '预览合并',\n confirm: '确认合并',\n complete: '完成',\n },\n \n actions: {\n startMerge: '开始合并',\n preview: '预览',\n confirm: '确认合并',\n cancel: '取消',\n rollback: '回滚',\n },\n \n status: {\n pending: '待处理',\n processing: '处理中',\n completed: '已完成',\n cancelled: '已取消',\n failed: '失败',\n },\n \n conflicts: {\n title: '数据冲突',\n keepSource: '保留源账号',\n keepTarget: '保留目标账号',\n merge: '合并两者',\n },\n \n messages: {\n eligible: '账号可以合并',\n notEligible: '账号无法合并',\n mergeSuccess: '合并成功',\n mergeCancelled: '合并已取消',\n },\n \n errors: {\n checkFailed: '检查失败',\n mergeFailed: '合并失败',\n rollbackFailed: '回滚失败',\n },\n },\n};\n\nexport const en = {\n accountMerge: {\n title: 'Account Merge',\n subtitle: 'Merge multiple accounts into one',\n \n steps: {\n check: 'Check Eligibility',\n preview: 'Preview Merge',\n confirm: 'Confirm Merge',\n complete: 'Complete',\n },\n \n actions: {\n startMerge: 'Start Merge',\n preview: 'Preview',\n confirm: 'Confirm Merge',\n cancel: 'Cancel',\n rollback: 'Rollback',\n },\n \n status: {\n pending: 'Pending',\n processing: 'Processing',\n completed: 'Completed',\n cancelled: 'Cancelled',\n failed: 'Failed',\n },\n \n conflicts: {\n title: 'Data Conflicts',\n keepSource: 'Keep Source',\n keepTarget: 'Keep Target',\n merge: 'Merge Both',\n },\n \n messages: {\n eligible: 'Accounts can be merged',\n notEligible: 'Accounts cannot be merged',\n mergeSuccess: 'Merge successful',\n mergeCancelled: 'Merge cancelled',\n },\n \n errors: {\n checkFailed: 'Check failed',\n mergeFailed: 'Merge failed',\n rollbackFailed: 'Rollback failed',\n },\n },\n};\n\nexport default { zh, en };\n","/**\n * @quantabit/account-merge-sdk - 账号合并 SDK\n */\n\n// 类型定义\nexport const MergeStatus = {\n PENDING: 'pending',\n PROCESSING: 'processing',\n COMPLETED: 'completed',\n CANCELLED: 'cancelled',\n FAILED: 'failed',\n};\n\nexport const ConflictResolution = {\n KEEP_SOURCE: 'source',\n KEEP_TARGET: 'target',\n MERGE: 'merge',\n};\n\n// API 客户端\nexport { AccountMergeApiClient, accountMergeApi } from './services/accountMergeApi';\n\n// React Hooks\nexport { useAccountMerge } from './hooks/useAccountMerge';\n\n// 组件\nexport { AccountMergeWizard } from './components/AccountMergeWizard';\n\n// 国际化\nexport { zh, en } from './i18n';\n\n// 默认导出\nimport { accountMergeApi } from './services/accountMergeApi';\nexport default accountMergeApi;\n"],"names":["AccountMergeApiClient","BaseApiClient","constructor","config","checkMergeEligibility","targetAccountId","post","target_account_id","previewMerge","getConflicts","requestMerge","mergeRequest","verifyTargetAccount","requestId","verification","confirmMerge","options","cancelMerge","getMergeStatus","get","getMergeHistory","params","getPendingRequests","getMigratableDataTypes","selectDataToMigrate","selections","getMigrationProgress","resolveConflicts","resolutions","chooseConflictResolution","conflictId","choice","deactivateSourceAccount","keepSourceAsBackup","checkRollbackEligibility","rollbackMerge","accountMergeApi","useAccountMerge","mergeHistory","setMergeHistory","useState","pendingRequests","setPendingRequests","loading","setLoading","error","setError","fetchHistory","useCallback","result","data","err","message","fetchPending","checkEligibility","useEffect","AccountMergeWizard","onComplete","step","setStep","targetAccount","setTargetAccount","preview","setPreview","handleCheck","eligible","previewResult","handleConfirm","request_id","React","createElement","className","type","value","onChange","e","target","placeholder","onClick","disabled","data_to_migrate","map","item","i","key","zh","accountMerge","title","subtitle","steps","check","confirm","complete","actions","startMerge","cancel","rollback","status","pending","processing","completed","cancelled","failed","conflicts","keepSource","keepTarget","merge","messages","notEligible","mergeSuccess","mergeCancelled","errors","checkFailed","mergeFailed","rollbackFailed","en","MergeStatus","PENDING","PROCESSING","COMPLETED","CANCELLED","FAILED","ConflictResolution","KEEP_SOURCE","KEEP_TARGET","MERGE"],"mappings":"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"}
|