@mantle-rwa/react 0.1.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/cjs/components/InvestorDashboard/index.js +156 -0
- package/dist/cjs/components/InvestorDashboard/index.js.map +1 -0
- package/dist/cjs/components/KYCFlow/index.js +231 -0
- package/dist/cjs/components/KYCFlow/index.js.map +1 -0
- package/dist/cjs/components/TokenMintForm/index.js +286 -0
- package/dist/cjs/components/TokenMintForm/index.js.map +1 -0
- package/dist/cjs/components/YieldCalculator/index.js +245 -0
- package/dist/cjs/components/YieldCalculator/index.js.map +1 -0
- package/dist/cjs/components/index.js +15 -0
- package/dist/cjs/components/index.js.map +1 -0
- package/dist/cjs/hooks/index.js +9 -0
- package/dist/cjs/hooks/index.js.map +1 -0
- package/dist/cjs/hooks/useRWA.js +54 -0
- package/dist/cjs/hooks/useRWA.js.map +1 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types/index.js +10 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/esm/components/InvestorDashboard/index.js +153 -0
- package/dist/esm/components/InvestorDashboard/index.js.map +1 -0
- package/dist/esm/components/KYCFlow/index.js +228 -0
- package/dist/esm/components/KYCFlow/index.js.map +1 -0
- package/dist/esm/components/TokenMintForm/index.js +279 -0
- package/dist/esm/components/TokenMintForm/index.js.map +1 -0
- package/dist/esm/components/YieldCalculator/index.js +236 -0
- package/dist/esm/components/YieldCalculator/index.js.map +1 -0
- package/dist/esm/components/index.js +8 -0
- package/dist/esm/components/index.js.map +1 -0
- package/dist/esm/hooks/index.js +5 -0
- package/dist/esm/hooks/index.js.map +1 -0
- package/dist/esm/hooks/useRWA.js +51 -0
- package/dist/esm/hooks/useRWA.js.map +1 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/index.js +6 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/styles.css +1 -0
- package/dist/types/components/InvestorDashboard/index.d.ts +25 -0
- package/dist/types/components/InvestorDashboard/index.d.ts.map +1 -0
- package/dist/types/components/KYCFlow/index.d.ts +25 -0
- package/dist/types/components/KYCFlow/index.d.ts.map +1 -0
- package/dist/types/components/TokenMintForm/index.d.ts +60 -0
- package/dist/types/components/TokenMintForm/index.d.ts.map +1 -0
- package/dist/types/components/YieldCalculator/index.d.ts +59 -0
- package/dist/types/components/YieldCalculator/index.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +8 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/hooks/index.d.ts +5 -0
- package/dist/types/hooks/index.d.ts.map +1 -0
- package/dist/types/hooks/useRWA.d.ts +22 -0
- package/dist/types/hooks/useRWA.d.ts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +177 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/package.json +66 -0
- package/src/components/InvestorDashboard/index.tsx +359 -0
- package/src/components/KYCFlow/index.tsx +434 -0
- package/src/components/TokenMintForm/index.tsx +590 -0
- package/src/components/YieldCalculator/index.tsx +541 -0
- package/src/components/index.ts +8 -0
- package/src/hooks/index.ts +5 -0
- package/src/hooks/useRWA.ts +70 -0
- package/src/index.ts +32 -0
- package/src/styles/index.css +197 -0
- package/src/types/index.ts +193 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvestorDashboard = InvestorDashboard;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/**
|
|
6
|
+
* InvestorDashboard Component
|
|
7
|
+
* Displays investor portfolio, yield history, and compliance status
|
|
8
|
+
*
|
|
9
|
+
* @see Requirements 11.1, 11.2, 11.3, 11.4, 11.5
|
|
10
|
+
*/
|
|
11
|
+
const react_1 = require("react");
|
|
12
|
+
const useRWA_1 = require("../../hooks/useRWA");
|
|
13
|
+
/**
|
|
14
|
+
* Accreditation tier labels
|
|
15
|
+
*/
|
|
16
|
+
const TIER_LABELS = {
|
|
17
|
+
0: 'None',
|
|
18
|
+
1: 'Retail',
|
|
19
|
+
2: 'Accredited',
|
|
20
|
+
3: 'Institutional',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Format a bigint balance to a human-readable string
|
|
24
|
+
*/
|
|
25
|
+
function formatBalance(value, decimals = 18) {
|
|
26
|
+
const divisor = BigInt(10 ** decimals);
|
|
27
|
+
const integerPart = value / divisor;
|
|
28
|
+
const fractionalPart = value % divisor;
|
|
29
|
+
const fractionalStr = fractionalPart.toString().padStart(decimals, '0').slice(0, 2);
|
|
30
|
+
return `${integerPart.toLocaleString()}.${fractionalStr}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Format a date to a localized string
|
|
34
|
+
*/
|
|
35
|
+
function formatDate(date) {
|
|
36
|
+
return date.toLocaleDateString(undefined, {
|
|
37
|
+
year: 'numeric',
|
|
38
|
+
month: 'short',
|
|
39
|
+
day: 'numeric',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* InvestorDashboard component for displaying investor portfolio
|
|
44
|
+
* Shows token balance, yield history, and compliance status
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```tsx
|
|
48
|
+
* <InvestorDashboard
|
|
49
|
+
* tokenAddress="0x..."
|
|
50
|
+
* yieldDistributorAddress="0x..."
|
|
51
|
+
* kycRegistryAddress="0x..."
|
|
52
|
+
* onClaimYield={(id) => console.log('Claiming:', id)}
|
|
53
|
+
* />
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
function InvestorDashboard({ tokenAddress, yieldDistributorAddress, kycRegistryAddress, theme = 'light', onClaimYield, showPortfolioValue = true, priceOracle: _priceOracle, // Reserved for future price oracle integration
|
|
57
|
+
}) {
|
|
58
|
+
const { address, isConnected } = (0, useRWA_1.useRWA)();
|
|
59
|
+
const [balance, setBalance] = (0, react_1.useState)(BigInt(0));
|
|
60
|
+
const [yieldHistory, setYieldHistory] = (0, react_1.useState)([]);
|
|
61
|
+
const [pendingYield, setPendingYield] = (0, react_1.useState)(BigInt(0));
|
|
62
|
+
const [pendingDistributionId, setPendingDistributionId] = (0, react_1.useState)(null);
|
|
63
|
+
const [isKYCVerified, setIsKYCVerified] = (0, react_1.useState)(false);
|
|
64
|
+
const [accreditationTier, setAccreditationTier] = (0, react_1.useState)(0);
|
|
65
|
+
const [kycExpiry, setKycExpiry] = (0, react_1.useState)(null);
|
|
66
|
+
const [isLoading, setIsLoading] = (0, react_1.useState)(true);
|
|
67
|
+
const [isClaiming, setIsClaiming] = (0, react_1.useState)(false);
|
|
68
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
69
|
+
const [portfolioValue, setPortfolioValue] = (0, react_1.useState)(BigInt(0));
|
|
70
|
+
const isDark = theme === 'dark';
|
|
71
|
+
// Fetch dashboard data
|
|
72
|
+
(0, react_1.useEffect)(() => {
|
|
73
|
+
const fetchData = async () => {
|
|
74
|
+
if (!isConnected || !address) {
|
|
75
|
+
setIsLoading(false);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
setError(null);
|
|
79
|
+
try {
|
|
80
|
+
// In production, these would be actual contract calls via SDK
|
|
81
|
+
// For now, simulating data fetch with realistic mock data
|
|
82
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
83
|
+
// Simulate token balance (1000 tokens with 18 decimals)
|
|
84
|
+
const mockBalance = BigInt(1000) * BigInt(10 ** 18);
|
|
85
|
+
setBalance(mockBalance);
|
|
86
|
+
// Simulate yield history
|
|
87
|
+
const mockYieldHistory = [
|
|
88
|
+
{
|
|
89
|
+
distributionId: 1,
|
|
90
|
+
amount: BigInt(50) * BigInt(10 ** 6), // 50 USDC
|
|
91
|
+
paymentToken: 'USDC',
|
|
92
|
+
claimedAt: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
distributionId: 2,
|
|
96
|
+
amount: BigInt(75) * BigInt(10 ** 6), // 75 USDC
|
|
97
|
+
paymentToken: 'USDC',
|
|
98
|
+
claimedAt: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000),
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
setYieldHistory(mockYieldHistory);
|
|
102
|
+
// Simulate pending yield (25 USDC)
|
|
103
|
+
setPendingYield(BigInt(25) * BigInt(10 ** 6));
|
|
104
|
+
setPendingDistributionId(3);
|
|
105
|
+
// Simulate KYC status
|
|
106
|
+
setIsKYCVerified(true);
|
|
107
|
+
setAccreditationTier(2); // Accredited
|
|
108
|
+
setKycExpiry(new Date(Date.now() + 365 * 24 * 60 * 60 * 1000)); // 1 year from now
|
|
109
|
+
// Simulate portfolio value (assuming $1 per token)
|
|
110
|
+
setPortfolioValue(mockBalance);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
console.error('Failed to fetch dashboard data:', err);
|
|
114
|
+
setError('Failed to load dashboard data. Please try again.');
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
setIsLoading(false);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
fetchData();
|
|
121
|
+
}, [address, isConnected, tokenAddress, yieldDistributorAddress, kycRegistryAddress]);
|
|
122
|
+
// Handle claim yield
|
|
123
|
+
const handleClaimYield = (0, react_1.useCallback)(async (distributionId) => {
|
|
124
|
+
if (isClaiming)
|
|
125
|
+
return;
|
|
126
|
+
setIsClaiming(true);
|
|
127
|
+
setError(null);
|
|
128
|
+
try {
|
|
129
|
+
// Call the onClaimYield callback
|
|
130
|
+
onClaimYield?.(distributionId);
|
|
131
|
+
// In production, this would wait for transaction confirmation
|
|
132
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
133
|
+
// Update state after successful claim
|
|
134
|
+
setPendingYield(BigInt(0));
|
|
135
|
+
setPendingDistributionId(null);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
console.error('Failed to claim yield:', err);
|
|
139
|
+
setError('Failed to claim yield. Please try again.');
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
setIsClaiming(false);
|
|
143
|
+
}
|
|
144
|
+
}, [isClaiming, onClaimYield]);
|
|
145
|
+
// Render wallet not connected state
|
|
146
|
+
if (!isConnected) {
|
|
147
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-card ${isDark ? 'dark' : ''}`, "data-testid": "investor-dashboard", "data-theme": theme, children: (0, jsx_runtime_1.jsx)("p", { className: "text-center text-gray-600 dark:text-gray-400", children: "Please connect your wallet to view your dashboard." }) }));
|
|
148
|
+
}
|
|
149
|
+
// Render loading state
|
|
150
|
+
if (isLoading) {
|
|
151
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `rwa-card ${isDark ? 'dark' : ''}`, "data-testid": "investor-dashboard", "data-theme": theme, "aria-busy": "true", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-center py-8", children: [(0, jsx_runtime_1.jsx)("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-mantle-600" }), (0, jsx_runtime_1.jsx)("span", { className: "ml-3 text-gray-600 dark:text-gray-400", children: "Loading dashboard..." })] }) }));
|
|
152
|
+
}
|
|
153
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: `rwa-card ${isDark ? 'dark' : ''}`, "data-testid": "investor-dashboard", "data-theme": theme, children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-lg font-semibold mb-6 text-gray-900 dark:text-white", children: "Investor Dashboard" }), error && ((0, jsx_runtime_1.jsx)("div", { className: "mb-4 p-3 bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-md border border-red-200 dark:border-red-800", role: "alert", "data-testid": "dashboard-error", children: error })), showPortfolioValue && ((0, jsx_runtime_1.jsxs)("section", { className: "mb-6", "aria-labelledby": "portfolio-heading", "data-testid": "portfolio-section", children: [(0, jsx_runtime_1.jsx)("h3", { id: "portfolio-heading", className: "text-sm font-medium text-gray-500 dark:text-gray-400 mb-2", children: "Portfolio Overview" }), (0, jsx_runtime_1.jsxs)("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "p-4 bg-gray-50 dark:bg-gray-700 rounded-lg", children: [(0, jsx_runtime_1.jsx)("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: "Token Balance" }), (0, jsx_runtime_1.jsx)("p", { className: "text-2xl font-bold text-gray-900 dark:text-white", "data-testid": "token-balance", children: formatBalance(balance) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "p-4 bg-gray-50 dark:bg-gray-700 rounded-lg", children: [(0, jsx_runtime_1.jsx)("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: "Portfolio Value" }), (0, jsx_runtime_1.jsxs)("p", { className: "text-2xl font-bold text-gray-900 dark:text-white", "data-testid": "portfolio-value", children: ["$", formatBalance(portfolioValue)] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "p-4 bg-gray-50 dark:bg-gray-700 rounded-lg", children: [(0, jsx_runtime_1.jsx)("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: "Pending Yield" }), (0, jsx_runtime_1.jsxs)("p", { className: "text-2xl font-bold text-mantle-600", "data-testid": "pending-yield", children: ["$", formatBalance(pendingYield, 6)] })] })] })] })), (0, jsx_runtime_1.jsxs)("section", { className: "mb-6", "aria-labelledby": "compliance-heading", "data-testid": "compliance-section", children: [(0, jsx_runtime_1.jsx)("h3", { id: "compliance-heading", className: "text-sm font-medium text-gray-500 dark:text-gray-400 mb-2", children: "Compliance Status" }), (0, jsx_runtime_1.jsx)("div", { className: "p-4 bg-gray-50 dark:bg-gray-700 rounded-lg", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-wrap items-center gap-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center", children: [(0, jsx_runtime_1.jsx)("span", { className: `w-3 h-3 rounded-full mr-2 ${isKYCVerified ? 'bg-green-500' : 'bg-red-500'}`, "aria-hidden": "true" }), (0, jsx_runtime_1.jsxs)("span", { className: "text-sm text-gray-700 dark:text-gray-300", "data-testid": "kyc-status", children: ["KYC: ", isKYCVerified ? 'Verified' : 'Not Verified'] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "text-sm text-gray-700 dark:text-gray-300", children: ["Tier:", ' ', (0, jsx_runtime_1.jsx)("span", { className: "font-medium", "data-testid": "accreditation-tier", children: TIER_LABELS[accreditationTier] || 'Unknown' })] }), kycExpiry && ((0, jsx_runtime_1.jsxs)("div", { className: "text-sm text-gray-500 dark:text-gray-400", "data-testid": "kyc-expiry", children: ["Expires: ", formatDate(kycExpiry)] }))] }) })] }), (0, jsx_runtime_1.jsxs)("section", { className: "mb-6", "aria-labelledby": "yield-history-heading", "data-testid": "yield-history-section", children: [(0, jsx_runtime_1.jsx)("h3", { id: "yield-history-heading", className: "text-sm font-medium text-gray-500 dark:text-gray-400 mb-2", children: "Yield History" }), yieldHistory.length > 0 ? ((0, jsx_runtime_1.jsx)("ul", { className: "space-y-2", "data-testid": "yield-history-list", children: yieldHistory.map((entry) => ((0, jsx_runtime_1.jsxs)("li", { className: "flex justify-between items-center p-3 bg-gray-50 dark:bg-gray-700 rounded-lg", "data-testid": `yield-entry-${entry.distributionId}`, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("p", { className: "text-sm font-medium text-gray-900 dark:text-white", children: ["Distribution #", entry.distributionId] }), (0, jsx_runtime_1.jsx)("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: formatDate(entry.claimedAt) })] }), (0, jsx_runtime_1.jsxs)("p", { className: "font-medium text-gray-900 dark:text-white", children: [formatBalance(entry.amount, 6), " ", entry.paymentToken] })] }, entry.distributionId))) })) : ((0, jsx_runtime_1.jsx)("p", { className: "text-sm text-gray-500 dark:text-gray-400 p-4 bg-gray-50 dark:bg-gray-700 rounded-lg", "data-testid": "no-yield-history", children: "No yield history yet." }))] }), pendingYield > BigInt(0) && pendingDistributionId !== null && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "rwa-button-primary w-full", onClick: () => handleClaimYield(pendingDistributionId), disabled: isClaiming, "aria-busy": isClaiming, "data-testid": "claim-yield-btn", children: isClaiming ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { className: "animate-spin inline-block w-4 h-4 border-2 border-white border-t-transparent rounded-full mr-2" }), "Claiming..."] })) : (`Claim Pending Yield ($${formatBalance(pendingYield, 6)})`) }))] }));
|
|
154
|
+
}
|
|
155
|
+
exports.default = InvestorDashboard;
|
|
156
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/InvestorDashboard/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KYCFlow = KYCFlow;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/**
|
|
6
|
+
* KYCFlow Component
|
|
7
|
+
* Multi-step KYC verification flow with provider integration
|
|
8
|
+
*
|
|
9
|
+
* @see Requirements 10.1, 10.2, 10.3, 10.4, 10.5
|
|
10
|
+
*/
|
|
11
|
+
const react_1 = require("react");
|
|
12
|
+
const PROVIDER_CONFIGS = {
|
|
13
|
+
persona: {
|
|
14
|
+
name: 'persona',
|
|
15
|
+
displayName: 'Persona',
|
|
16
|
+
logo: '🔐',
|
|
17
|
+
description: 'Identity verification powered by Persona',
|
|
18
|
+
},
|
|
19
|
+
synaps: {
|
|
20
|
+
name: 'synaps',
|
|
21
|
+
displayName: 'Synaps',
|
|
22
|
+
logo: '🛡️',
|
|
23
|
+
description: 'KYC verification powered by Synaps',
|
|
24
|
+
},
|
|
25
|
+
jumio: {
|
|
26
|
+
name: 'jumio',
|
|
27
|
+
displayName: 'Jumio',
|
|
28
|
+
logo: '✓',
|
|
29
|
+
description: 'Identity verification powered by Jumio',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
const FIELD_LABELS = {
|
|
33
|
+
identity: {
|
|
34
|
+
label: 'Identity Verification',
|
|
35
|
+
description: 'Verify your identity with a government-issued ID',
|
|
36
|
+
},
|
|
37
|
+
accreditation: {
|
|
38
|
+
label: 'Accreditation Status',
|
|
39
|
+
description: 'Confirm your investor accreditation status',
|
|
40
|
+
},
|
|
41
|
+
address: {
|
|
42
|
+
label: 'Address Verification',
|
|
43
|
+
description: 'Verify your residential address',
|
|
44
|
+
},
|
|
45
|
+
tax: {
|
|
46
|
+
label: 'Tax Information',
|
|
47
|
+
description: 'Provide tax identification information',
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* KYCFlow component for investor verification
|
|
52
|
+
* Supports Persona, Synaps, and Jumio providers
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```tsx
|
|
56
|
+
* <KYCFlow
|
|
57
|
+
* provider="persona"
|
|
58
|
+
* requiredFields={['identity', 'accreditation']}
|
|
59
|
+
* onComplete={(result) => console.log('KYC complete:', result)}
|
|
60
|
+
* theme="light"
|
|
61
|
+
* />
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
function KYCFlow({ provider, onComplete, onError, requiredFields, theme = 'light', customStyles, registryAddress, autoUpdateRegistry = false, }) {
|
|
65
|
+
const [currentStepIndex, setCurrentStepIndex] = (0, react_1.useState)(0);
|
|
66
|
+
const [isLoading, setIsLoading] = (0, react_1.useState)(false);
|
|
67
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
68
|
+
const [sessionId, setSessionId] = (0, react_1.useState)(null);
|
|
69
|
+
const [verificationStarted, setVerificationStarted] = (0, react_1.useState)(false);
|
|
70
|
+
const isDark = theme === 'dark';
|
|
71
|
+
const providerConfig = PROVIDER_CONFIGS[provider];
|
|
72
|
+
// Initialize steps based on required fields
|
|
73
|
+
const [steps, setSteps] = (0, react_1.useState)(() => requiredFields.map((field) => ({
|
|
74
|
+
id: field,
|
|
75
|
+
label: FIELD_LABELS[field].label,
|
|
76
|
+
description: FIELD_LABELS[field].description,
|
|
77
|
+
status: 'pending',
|
|
78
|
+
})));
|
|
79
|
+
// Reset steps when requiredFields change
|
|
80
|
+
(0, react_1.useEffect)(() => {
|
|
81
|
+
setSteps(requiredFields.map((field) => ({
|
|
82
|
+
id: field,
|
|
83
|
+
label: FIELD_LABELS[field].label,
|
|
84
|
+
description: FIELD_LABELS[field].description,
|
|
85
|
+
status: 'pending',
|
|
86
|
+
})));
|
|
87
|
+
setCurrentStepIndex(0);
|
|
88
|
+
setVerificationStarted(false);
|
|
89
|
+
setSessionId(null);
|
|
90
|
+
setError(null);
|
|
91
|
+
}, [requiredFields]);
|
|
92
|
+
const currentStep = steps[currentStepIndex];
|
|
93
|
+
const isLastStep = currentStepIndex === steps.length - 1;
|
|
94
|
+
const allStepsCompleted = steps.every((step) => step.status === 'completed');
|
|
95
|
+
// Update step status
|
|
96
|
+
const updateStepStatus = (0, react_1.useCallback)((stepIndex, status) => {
|
|
97
|
+
setSteps((prev) => prev.map((step, idx) => (idx === stepIndex ? { ...step, status } : step)));
|
|
98
|
+
}, []);
|
|
99
|
+
// Start verification flow
|
|
100
|
+
const handleStartVerification = (0, react_1.useCallback)(async () => {
|
|
101
|
+
setIsLoading(true);
|
|
102
|
+
setError(null);
|
|
103
|
+
setVerificationStarted(true);
|
|
104
|
+
try {
|
|
105
|
+
// Generate session ID for this verification flow
|
|
106
|
+
const newSessionId = `${provider}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
107
|
+
setSessionId(newSessionId);
|
|
108
|
+
// Mark first step as in progress
|
|
109
|
+
updateStepStatus(0, 'in_progress');
|
|
110
|
+
// Simulate provider initialization
|
|
111
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
const errorMessage = err instanceof Error ? err.message : 'Failed to start verification';
|
|
115
|
+
setError(errorMessage);
|
|
116
|
+
onError?.(err instanceof Error ? err : new Error(errorMessage));
|
|
117
|
+
setVerificationStarted(false);
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
setIsLoading(false);
|
|
121
|
+
}
|
|
122
|
+
}, [provider, onError, updateStepStatus]);
|
|
123
|
+
// Complete current step and move to next
|
|
124
|
+
const handleCompleteStep = (0, react_1.useCallback)(async () => {
|
|
125
|
+
setIsLoading(true);
|
|
126
|
+
setError(null);
|
|
127
|
+
try {
|
|
128
|
+
// Simulate step completion
|
|
129
|
+
await new Promise((resolve) => setTimeout(resolve, 800));
|
|
130
|
+
// Mark current step as completed
|
|
131
|
+
updateStepStatus(currentStepIndex, 'completed');
|
|
132
|
+
if (!isLastStep) {
|
|
133
|
+
// Move to next step
|
|
134
|
+
const nextIndex = currentStepIndex + 1;
|
|
135
|
+
setCurrentStepIndex(nextIndex);
|
|
136
|
+
updateStepStatus(nextIndex, 'in_progress');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
const errorMessage = err instanceof Error ? err.message : 'Step verification failed';
|
|
141
|
+
setError(errorMessage);
|
|
142
|
+
updateStepStatus(currentStepIndex, 'failed');
|
|
143
|
+
onError?.(err instanceof Error ? err : new Error(errorMessage));
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
setIsLoading(false);
|
|
147
|
+
}
|
|
148
|
+
}, [currentStepIndex, isLastStep, onError, updateStepStatus]);
|
|
149
|
+
// Complete entire verification flow
|
|
150
|
+
const handleCompleteVerification = (0, react_1.useCallback)(async () => {
|
|
151
|
+
setIsLoading(true);
|
|
152
|
+
setError(null);
|
|
153
|
+
try {
|
|
154
|
+
// Complete the last step first
|
|
155
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
156
|
+
updateStepStatus(currentStepIndex, 'completed');
|
|
157
|
+
// Determine tier based on accreditation field
|
|
158
|
+
const hasAccreditation = requiredFields.includes('accreditation');
|
|
159
|
+
const tier = hasAccreditation ? 2 : 1; // Accredited (2) or Retail (1)
|
|
160
|
+
// Generate identity hash
|
|
161
|
+
const identityHash = '0x' + Array.from({ length: 64 }, () => Math.floor(Math.random() * 16).toString(16)).join('');
|
|
162
|
+
const result = {
|
|
163
|
+
verified: true,
|
|
164
|
+
tier,
|
|
165
|
+
identityHash,
|
|
166
|
+
sessionId: sessionId || `${provider}-${Date.now()}`,
|
|
167
|
+
};
|
|
168
|
+
// Auto-update registry if configured
|
|
169
|
+
if (autoUpdateRegistry && registryAddress) {
|
|
170
|
+
// In production, this would call the SDK to update the on-chain registry
|
|
171
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
172
|
+
}
|
|
173
|
+
onComplete(result);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
const errorMessage = err instanceof Error ? err.message : 'Verification completion failed';
|
|
177
|
+
setError(errorMessage);
|
|
178
|
+
updateStepStatus(currentStepIndex, 'failed');
|
|
179
|
+
onError?.(err instanceof Error ? err : new Error(errorMessage));
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
setIsLoading(false);
|
|
183
|
+
}
|
|
184
|
+
}, [
|
|
185
|
+
currentStepIndex,
|
|
186
|
+
requiredFields,
|
|
187
|
+
sessionId,
|
|
188
|
+
provider,
|
|
189
|
+
autoUpdateRegistry,
|
|
190
|
+
registryAddress,
|
|
191
|
+
onComplete,
|
|
192
|
+
onError,
|
|
193
|
+
updateStepStatus,
|
|
194
|
+
]);
|
|
195
|
+
// Retry failed step
|
|
196
|
+
const handleRetry = (0, react_1.useCallback)(() => {
|
|
197
|
+
setError(null);
|
|
198
|
+
updateStepStatus(currentStepIndex, 'in_progress');
|
|
199
|
+
}, [currentStepIndex, updateStepStatus]);
|
|
200
|
+
// Style classes
|
|
201
|
+
const containerClass = (0, react_1.useMemo)(() => customStyles?.container ?? `rwa-kyc-flow ${isDark ? 'dark' : ''}`, [customStyles?.container, isDark]);
|
|
202
|
+
const headerClass = (0, react_1.useMemo)(() => customStyles?.header ?? 'rwa-kyc-header', [customStyles?.header]);
|
|
203
|
+
const buttonClass = (0, react_1.useMemo)(() => customStyles?.button ?? 'rwa-button-primary', [customStyles?.button]);
|
|
204
|
+
// Render step indicator
|
|
205
|
+
const renderStepIndicator = () => ((0, jsx_runtime_1.jsx)("div", { className: "rwa-kyc-steps", role: "list", "aria-label": "Verification steps", children: steps.map((step, index) => ((0, jsx_runtime_1.jsxs)("div", { className: `rwa-kyc-step ${step.status}`, role: "listitem", "aria-current": index === currentStepIndex ? 'step' : undefined, children: [(0, jsx_runtime_1.jsx)("div", { className: "rwa-kyc-step-indicator", children: step.status === 'completed' ? ((0, jsx_runtime_1.jsx)("span", { "aria-hidden": "true", children: "\u2713" })) : step.status === 'failed' ? ((0, jsx_runtime_1.jsx)("span", { "aria-hidden": "true", children: "\u2717" })) : ((0, jsx_runtime_1.jsx)("span", { "aria-hidden": "true", children: index + 1 })) }), (0, jsx_runtime_1.jsxs)("div", { className: "rwa-kyc-step-content", children: [(0, jsx_runtime_1.jsx)("span", { className: "rwa-kyc-step-label", children: step.label }), index === currentStepIndex && verificationStarted && ((0, jsx_runtime_1.jsx)("span", { className: "rwa-kyc-step-description", children: step.description }))] })] }, step.id))) }));
|
|
206
|
+
// Render provider info
|
|
207
|
+
const renderProviderInfo = () => ((0, jsx_runtime_1.jsxs)("div", { className: "rwa-kyc-provider", "data-testid": "kyc-provider-info", children: [(0, jsx_runtime_1.jsx)("span", { className: "rwa-kyc-provider-logo", "aria-hidden": "true", children: providerConfig.logo }), (0, jsx_runtime_1.jsxs)("div", { className: "rwa-kyc-provider-details", children: [(0, jsx_runtime_1.jsx)("span", { className: "rwa-kyc-provider-name", children: providerConfig.displayName }), (0, jsx_runtime_1.jsx)("span", { className: "rwa-kyc-provider-description", children: providerConfig.description })] })] }));
|
|
208
|
+
// Render action buttons
|
|
209
|
+
const renderActions = () => {
|
|
210
|
+
if (!verificationStarted) {
|
|
211
|
+
return ((0, jsx_runtime_1.jsx)("button", { type: "button", className: buttonClass, onClick: handleStartVerification, disabled: isLoading, "aria-busy": isLoading, "data-testid": "start-verification-btn", children: isLoading ? 'Starting...' : 'Start Verification' }));
|
|
212
|
+
}
|
|
213
|
+
if (currentStep?.status === 'failed') {
|
|
214
|
+
return ((0, jsx_runtime_1.jsx)("button", { type: "button", className: buttonClass, onClick: handleRetry, disabled: isLoading, "data-testid": "retry-btn", children: "Retry Step" }));
|
|
215
|
+
}
|
|
216
|
+
if (allStepsCompleted) {
|
|
217
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "rwa-kyc-success", role: "status", children: [(0, jsx_runtime_1.jsx)("span", { className: "rwa-kyc-success-icon", "aria-hidden": "true", children: "\u2713" }), (0, jsx_runtime_1.jsx)("span", { children: "Verification Complete" })] }));
|
|
218
|
+
}
|
|
219
|
+
if (isLastStep) {
|
|
220
|
+
return ((0, jsx_runtime_1.jsx)("button", { type: "button", className: buttonClass, onClick: handleCompleteVerification, disabled: isLoading, "aria-busy": isLoading, "data-testid": "complete-verification-btn", children: isLoading ? 'Completing...' : 'Complete Verification' }));
|
|
221
|
+
}
|
|
222
|
+
return ((0, jsx_runtime_1.jsx)("button", { type: "button", className: buttonClass, onClick: handleCompleteStep, disabled: isLoading, "aria-busy": isLoading, "data-testid": "next-step-btn", children: isLoading ? 'Verifying...' : 'Continue' }));
|
|
223
|
+
};
|
|
224
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: containerClass, "data-testid": "kyc-flow", "data-provider": provider, "data-theme": theme, role: "form", "aria-label": "KYC Verification Flow", children: [(0, jsx_runtime_1.jsx)("h2", { className: headerClass, children: allStepsCompleted
|
|
225
|
+
? 'Verification Complete'
|
|
226
|
+
: verificationStarted
|
|
227
|
+
? `Step ${currentStepIndex + 1} of ${steps.length}: ${currentStep?.label}`
|
|
228
|
+
: 'Identity Verification' }), error && ((0, jsx_runtime_1.jsxs)("div", { className: "rwa-kyc-error", role: "alert", "aria-live": "polite", "data-testid": "kyc-error", children: [(0, jsx_runtime_1.jsx)("span", { className: "rwa-kyc-error-icon", "aria-hidden": "true", children: "\u26A0" }), (0, jsx_runtime_1.jsx)("span", { children: error })] })), renderProviderInfo(), renderStepIndicator(), (0, jsx_runtime_1.jsx)("div", { className: "rwa-kyc-actions", children: renderActions() }), sessionId && ((0, jsx_runtime_1.jsx)("div", { className: "rwa-kyc-session", "data-testid": "session-info", children: (0, jsx_runtime_1.jsxs)("span", { className: "text-xs text-gray-500 dark:text-gray-400", children: ["Session: ", sessionId.slice(0, 20), "..."] }) }))] }));
|
|
229
|
+
}
|
|
230
|
+
exports.default = KYCFlow;
|
|
231
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/KYCFlow/index.tsx"],"names":[],"mappings":"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"}
|