@chainloyalty/react 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/Leaderboard.d.ts +42 -0
- package/dist/Leaderboard.d.ts.map +1 -0
- package/dist/Leaderboard.js +186 -0
- package/dist/Leaderboard.js.map +1 -0
- package/dist/RewardsDashboard.d.ts +67 -0
- package/dist/RewardsDashboard.d.ts.map +1 -0
- package/dist/RewardsDashboard.js +256 -0
- package/dist/RewardsDashboard.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/useTrackEvent.d.ts +75 -0
- package/dist/useTrackEvent.d.ts.map +1 -0
- package/dist/useTrackEvent.js +218 -0
- package/dist/useTrackEvent.js.map +1 -0
- package/package.json +33 -0
- package/src/Leaderboard.tsx +528 -0
- package/src/RewardsDashboard.tsx +602 -0
- package/src/index.ts +18 -0
- package/src/useTrackEvent.ts +273 -0
- package/tsconfig.json +27 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @chainloyalty/react - Leaderboard Component
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* A fully-featured, embeddable leaderboard component that displays top users
|
|
6
|
+
* ranked by their points. This component provides real-time updates, filtering,
|
|
7
|
+
* and responsive design for both mobile and desktop.
|
|
8
|
+
*
|
|
9
|
+
* Key Features:
|
|
10
|
+
* - Top users ranked by points
|
|
11
|
+
* - Display: Rank, Wallet (shortened with copy), Points, Badge count
|
|
12
|
+
* - Filter options (All-time / This month)
|
|
13
|
+
* - Refresh button for real-time updates
|
|
14
|
+
* - Fully responsive design
|
|
15
|
+
* - Loading and empty states
|
|
16
|
+
* - Dark theme UI
|
|
17
|
+
* - Professional animations and interactions
|
|
18
|
+
*/
|
|
19
|
+
import React from 'react';
|
|
20
|
+
export type LeaderboardTimeframe = 'alltime' | 'month';
|
|
21
|
+
export interface LeaderboardEntry {
|
|
22
|
+
rank: number;
|
|
23
|
+
walletAddress: string;
|
|
24
|
+
points: number;
|
|
25
|
+
badgesCount: number;
|
|
26
|
+
displayName?: string;
|
|
27
|
+
avatar?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface LeaderboardProps {
|
|
30
|
+
walletAddress?: string | null;
|
|
31
|
+
customColors?: {
|
|
32
|
+
background?: string;
|
|
33
|
+
accent1?: string;
|
|
34
|
+
accent2?: string;
|
|
35
|
+
};
|
|
36
|
+
itemsPerPage?: number;
|
|
37
|
+
compactMode?: boolean;
|
|
38
|
+
hideTimeframeFilter?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare const Leaderboard: React.FC<LeaderboardProps>;
|
|
41
|
+
export default Leaderboard;
|
|
42
|
+
//# sourceMappingURL=Leaderboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Leaderboard.d.ts","sourceRoot":"","sources":["../src/Leaderboard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAgBnD,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,CAAC,EAAE;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AA2LD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA0RlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @chainloyalty/react - Leaderboard Component
|
|
4
|
+
*
|
|
5
|
+
* Purpose:
|
|
6
|
+
* A fully-featured, embeddable leaderboard component that displays top users
|
|
7
|
+
* ranked by their points. This component provides real-time updates, filtering,
|
|
8
|
+
* and responsive design for both mobile and desktop.
|
|
9
|
+
*
|
|
10
|
+
* Key Features:
|
|
11
|
+
* - Top users ranked by points
|
|
12
|
+
* - Display: Rank, Wallet (shortened with copy), Points, Badge count
|
|
13
|
+
* - Filter options (All-time / This month)
|
|
14
|
+
* - Refresh button for real-time updates
|
|
15
|
+
* - Fully responsive design
|
|
16
|
+
* - Loading and empty states
|
|
17
|
+
* - Dark theme UI
|
|
18
|
+
* - Professional animations and interactions
|
|
19
|
+
*/
|
|
20
|
+
import { useState, useEffect } from 'react';
|
|
21
|
+
import { Copy, CheckCircle, RefreshCw, Trophy, Calendar, Award, TrendingUp, ExternalLink, } from 'lucide-react';
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Mock Data & API Functions
|
|
24
|
+
// ============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Generate deterministic mock leaderboard data based on a seed
|
|
27
|
+
* In production, this would be fetched from an API
|
|
28
|
+
*/
|
|
29
|
+
const generateLeaderboardData = (timeframe) => {
|
|
30
|
+
const baseData = [
|
|
31
|
+
{ displayName: 'CryptoKing', points: 45230, badges: 12 },
|
|
32
|
+
{ displayName: 'LoyaltyPro', points: 42890, badges: 11 },
|
|
33
|
+
{ displayName: 'RewardSeeker', points: 38950, badges: 9 },
|
|
34
|
+
{ displayName: 'ChainMaster', points: 35670, badges: 8 },
|
|
35
|
+
{ displayName: 'TokenTrader', points: 32450, badges: 7 },
|
|
36
|
+
{ displayName: 'PointsCollector', points: 29876, badges: 6 },
|
|
37
|
+
{ displayName: 'EarnQuest', points: 27543, badges: 5 },
|
|
38
|
+
{ displayName: 'BlockchainBob', points: 24567, badges: 5 },
|
|
39
|
+
{ displayName: 'WebThreeWave', points: 21234, badges: 4 },
|
|
40
|
+
{ displayName: 'DecentralizedDave', points: 18765, badges: 3 },
|
|
41
|
+
{ displayName: 'SmartContractSally', points: 16543, badges: 3 },
|
|
42
|
+
{ displayName: 'FutureOfFinance', points: 14321, badges: 2 },
|
|
43
|
+
{ displayName: 'CryptoNinja', points: 12876, badges: 2 },
|
|
44
|
+
{ displayName: 'BlockBuilder', points: 11234, badges: 2 },
|
|
45
|
+
{ displayName: 'RewardRunner', points: 9876, badges: 1 },
|
|
46
|
+
];
|
|
47
|
+
// Apply timeframe multiplier for month view
|
|
48
|
+
const multiplier = timeframe === 'month' ? 0.4 : 1;
|
|
49
|
+
return baseData.map((user, index) => ({
|
|
50
|
+
rank: index + 1,
|
|
51
|
+
walletAddress: `0x${(Math.random().toString(16) + '000000000000000000000000').slice(2, 42)}`,
|
|
52
|
+
points: Math.floor(user.points * multiplier),
|
|
53
|
+
badgesCount: user.badges,
|
|
54
|
+
displayName: user.displayName,
|
|
55
|
+
}));
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Mock API call to fetch leaderboard data
|
|
59
|
+
*/
|
|
60
|
+
const fetchLeaderboardData = async (timeframe) => {
|
|
61
|
+
// Simulate network delay
|
|
62
|
+
await new Promise((resolve) => setTimeout(resolve, 600));
|
|
63
|
+
// Return mock data
|
|
64
|
+
return generateLeaderboardData(timeframe);
|
|
65
|
+
};
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// Utility Functions
|
|
68
|
+
// ============================================================================
|
|
69
|
+
const shortenAddress = (address, chars = 6) => {
|
|
70
|
+
if (!address)
|
|
71
|
+
return '';
|
|
72
|
+
return `${address.substring(0, chars)}...${address.substring(address.length - 4)}`;
|
|
73
|
+
};
|
|
74
|
+
const copyToClipboard = (text) => {
|
|
75
|
+
navigator.clipboard.writeText(text);
|
|
76
|
+
};
|
|
77
|
+
const getRankColor = (rank) => {
|
|
78
|
+
if (rank === 1)
|
|
79
|
+
return '#F59E0B'; // Gold
|
|
80
|
+
if (rank === 2)
|
|
81
|
+
return '#E5E7EB'; // Silver
|
|
82
|
+
if (rank === 3)
|
|
83
|
+
return '#FB923C'; // Bronze
|
|
84
|
+
return '#9CA3AF'; // Gray
|
|
85
|
+
};
|
|
86
|
+
const getRankIcon = (rank) => {
|
|
87
|
+
if (rank === 1)
|
|
88
|
+
return '🥇';
|
|
89
|
+
if (rank === 2)
|
|
90
|
+
return '🥈';
|
|
91
|
+
if (rank === 3)
|
|
92
|
+
return '🥉';
|
|
93
|
+
return null;
|
|
94
|
+
};
|
|
95
|
+
const LeaderboardRow = ({ entry, accentColor, isCurrentUser = false, onCopyAddress, }) => {
|
|
96
|
+
const [copied, setCopied] = useState(false);
|
|
97
|
+
const handleCopy = () => {
|
|
98
|
+
copyToClipboard(entry.walletAddress);
|
|
99
|
+
setCopied(true);
|
|
100
|
+
if (onCopyAddress) {
|
|
101
|
+
onCopyAddress(entry.walletAddress);
|
|
102
|
+
}
|
|
103
|
+
setTimeout(() => setCopied(false), 2000);
|
|
104
|
+
};
|
|
105
|
+
const rankIcon = getRankIcon(entry.rank);
|
|
106
|
+
const rankColor = getRankColor(entry.rank);
|
|
107
|
+
return (_jsxs("tr", { className: `border-b border-gray-700 transition-all hover:bg-gray-700/30 ${isCurrentUser ? 'bg-gray-700/20' : ''}`, children: [_jsx("td", { className: "px-4 py-3 text-sm", children: _jsxs("div", { className: "flex items-center justify-center", children: [rankIcon && _jsx("span", { className: "text-lg mr-2", children: rankIcon }), _jsxs("span", { className: "font-bold", style: {
|
|
108
|
+
color: rankColor,
|
|
109
|
+
}, children: ["#", entry.rank] })] }) }), _jsx("td", { className: "px-4 py-3 text-sm", children: _jsxs("div", { className: "flex items-center gap-2 group", children: [_jsx("span", { className: "text-white font-mono", children: shortenAddress(entry.walletAddress) }), _jsx("button", { onClick: handleCopy, className: "p-1.5 rounded-md text-gray-500 group-hover:text-gray-300 hover:bg-gray-700/50 transition-all opacity-0 group-hover:opacity-100", title: entry.walletAddress, children: copied ? (_jsx(CheckCircle, { className: "w-4 h-4", style: { color: '#3FB950' } })) : (_jsx(Copy, { className: "w-4 h-4" })) }), entry.displayName && (_jsxs("span", { className: "hidden sm:inline text-xs text-gray-400", children: ["(", entry.displayName, ")"] }))] }) }), _jsx("td", { className: "px-4 py-3 text-sm", children: _jsxs("div", { className: "text-right", children: [_jsx("p", { className: "font-bold", style: { color: accentColor }, children: entry.points.toLocaleString() }), _jsx("p", { className: "text-xs text-gray-400 hidden sm:block", children: "points" })] }) }), _jsx("td", { className: "px-4 py-3 text-sm", children: _jsxs("div", { className: "inline-flex items-center gap-1 px-2 py-1 rounded-lg", style: {
|
|
110
|
+
backgroundColor: 'rgba(47, 129, 247, 0.1)',
|
|
111
|
+
borderColor: accentColor,
|
|
112
|
+
}, children: [_jsx(Award, { className: "w-4 h-4", style: { color: accentColor } }), _jsx("span", { className: "font-semibold text-white", children: entry.badgesCount })] }) })] }));
|
|
113
|
+
};
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// Main Leaderboard Component
|
|
116
|
+
// ============================================================================
|
|
117
|
+
export const Leaderboard = ({ walletAddress = null, customColors = {}, itemsPerPage = 15, compactMode = false, hideTimeframeFilter = false, }) => {
|
|
118
|
+
const [timeframe, setTimeframe] = useState('alltime');
|
|
119
|
+
const [data, setData] = useState([]);
|
|
120
|
+
const [loading, setLoading] = useState(false);
|
|
121
|
+
const [error, setError] = useState(null);
|
|
122
|
+
const [currentPage, setCurrentPage] = useState(1);
|
|
123
|
+
const backgroundColor = customColors.background || '#0D1117';
|
|
124
|
+
const accentColor = customColors.accent1 || '#2F81F7';
|
|
125
|
+
const accentColor2 = customColors.accent2 || '#3FB950';
|
|
126
|
+
// Fetch data when timeframe changes
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
setLoading(true);
|
|
129
|
+
setError(null);
|
|
130
|
+
setCurrentPage(1);
|
|
131
|
+
fetchLeaderboardData(timeframe)
|
|
132
|
+
.then((result) => {
|
|
133
|
+
setData(result);
|
|
134
|
+
setLoading(false);
|
|
135
|
+
})
|
|
136
|
+
.catch((err) => {
|
|
137
|
+
setError(err.message || 'Failed to load leaderboard');
|
|
138
|
+
setLoading(false);
|
|
139
|
+
});
|
|
140
|
+
}, [timeframe]);
|
|
141
|
+
const handleRefresh = async () => {
|
|
142
|
+
setLoading(true);
|
|
143
|
+
const result = await fetchLeaderboardData(timeframe);
|
|
144
|
+
setData(result);
|
|
145
|
+
setLoading(false);
|
|
146
|
+
};
|
|
147
|
+
// Pagination
|
|
148
|
+
const totalPages = Math.ceil(data.length / itemsPerPage);
|
|
149
|
+
const startIndex = (currentPage - 1) * itemsPerPage;
|
|
150
|
+
const endIndex = startIndex + itemsPerPage;
|
|
151
|
+
const displayedData = compactMode ? data.slice(0, 10) : data.slice(startIndex, endIndex);
|
|
152
|
+
const currentUserRank = walletAddress
|
|
153
|
+
? data.find((entry) => entry.walletAddress.toLowerCase() === walletAddress.toLowerCase())
|
|
154
|
+
: null;
|
|
155
|
+
return (_jsxs("div", { className: "rounded-lg border border-gray-700 overflow-hidden", style: { backgroundColor }, children: [_jsxs("div", { className: "p-6 border-b border-gray-700", children: [_jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Trophy, { className: "w-6 h-6", style: { color: accentColor2 } }), _jsx("h2", { className: "text-2xl font-bold text-white", children: "Leaderboard" })] }), _jsx("button", { onClick: handleRefresh, disabled: loading, className: "p-2 rounded-lg text-gray-400 hover:text-white hover:bg-gray-700 transition-all disabled:opacity-50", title: "Refresh leaderboard", children: _jsx(RefreshCw, { className: `w-5 h-5 ${loading ? 'animate-spin' : ''}` }) })] }), _jsxs("div", { className: "grid grid-cols-2 md:grid-cols-3 gap-3 mb-4", children: [_jsxs("div", { className: "p-3 rounded-lg border border-gray-700", style: { backgroundColor: 'rgba(31, 41, 55, 0.5)' }, children: [_jsx("p", { className: "text-xs text-gray-400", children: "Total Users" }), _jsx("p", { className: "text-2xl font-bold text-white", children: data.length.toLocaleString() })] }), currentUserRank && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "p-3 rounded-lg border", style: {
|
|
156
|
+
borderColor: accentColor,
|
|
157
|
+
backgroundColor: 'rgba(47, 129, 247, 0.1)',
|
|
158
|
+
}, children: [_jsx("p", { className: "text-xs text-gray-400", children: "Your Rank" }), _jsxs("p", { className: "text-2xl font-bold", style: { color: accentColor }, children: ["#", currentUserRank.rank] })] }), _jsxs("div", { className: "p-3 rounded-lg border", style: {
|
|
159
|
+
borderColor: accentColor2,
|
|
160
|
+
backgroundColor: 'rgba(63, 185, 80, 0.1)',
|
|
161
|
+
}, children: [_jsx("p", { className: "text-xs text-gray-400", children: "Your Points" }), _jsx("p", { className: "text-2xl font-bold", style: { color: accentColor2 }, children: currentUserRank.points.toLocaleString() })] })] }))] }), !hideTimeframeFilter && (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Calendar, { className: "w-4 h-4 text-gray-400" }), _jsx("div", { className: "flex gap-2", children: ['alltime', 'month'].map((tf) => (_jsx("button", { onClick: () => setTimeframe(tf), className: `px-3 py-1.5 rounded-lg text-sm font-medium transition-all ${timeframe === tf
|
|
162
|
+
? 'text-white'
|
|
163
|
+
: 'text-gray-400 hover:text-white hover:bg-gray-700/50'}`, style: timeframe === tf
|
|
164
|
+
? {
|
|
165
|
+
backgroundColor: accentColor,
|
|
166
|
+
color: 'white',
|
|
167
|
+
}
|
|
168
|
+
: {}, children: tf === 'alltime' ? 'All Time' : 'This Month' }, tf))) })] }))] }), _jsxs("div", { style: { backgroundColor: 'rgba(31, 41, 55, 0.2)' }, children: [loading && !data.length && (_jsx("div", { className: "p-6 space-y-3", children: [...Array(5)].map((_, i) => (_jsx("div", { className: "h-12 bg-gray-700 rounded-lg animate-pulse" }, i))) })), error && !data.length && (_jsxs("div", { className: "p-6 text-center", children: [_jsx("p", { className: "text-red-400 mb-4", children: error }), _jsx("button", { onClick: handleRefresh, className: "px-4 py-2 rounded-lg text-white text-sm transition-all", style: { backgroundColor: accentColor }, children: "Try Again" })] })), !loading && !error && data.length === 0 && (_jsxs("div", { className: "p-12 text-center", children: [_jsx(TrendingUp, { className: "w-12 h-12 mx-auto mb-4 text-gray-500" }), _jsx("h3", { className: "text-lg font-semibold text-white mb-2", children: "No Leaderboard Data" }), _jsx("p", { className: "text-gray-400", children: "The leaderboard will be populated as users start earning points." })] })), data.length > 0 && (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-gray-700 bg-gray-800/50", children: [_jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase", children: "Rank" }), _jsx("th", { className: "px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase", children: "Wallet" }), _jsx("th", { className: "px-4 py-3 text-right text-xs font-semibold text-gray-400 uppercase", children: "Points" }), _jsx("th", { className: "px-4 py-3 text-center text-xs font-semibold text-gray-400 uppercase", children: "Badges" })] }) }), _jsx("tbody", { children: displayedData.map((entry) => (_jsx(LeaderboardRow, { entry: entry, accentColor: accentColor, isCurrentUser: walletAddress
|
|
169
|
+
? entry.walletAddress.toLowerCase() === walletAddress.toLowerCase()
|
|
170
|
+
: false, onCopyAddress: () => {
|
|
171
|
+
// Toast notification would go here
|
|
172
|
+
console.log('Copied:', entry.walletAddress);
|
|
173
|
+
} }, entry.rank))) })] }) }))] }), !compactMode && data.length > itemsPerPage && (_jsxs("div", { className: "px-6 py-4 border-t border-gray-700 flex items-center justify-between", children: [_jsxs("div", { className: "text-sm text-gray-400", children: ["Showing ", startIndex + 1, " to ", Math.min(endIndex, data.length), " of ", data.length] }), _jsxs("div", { className: "flex gap-2", children: [_jsx("button", { onClick: () => setCurrentPage((p) => Math.max(1, p - 1)), disabled: currentPage === 1, className: "px-3 py-1.5 rounded-lg text-sm font-medium text-gray-400 hover:text-white hover:bg-gray-700 transition-all disabled:opacity-50 disabled:cursor-not-allowed", children: "\u2190 Previous" }), _jsx("div", { className: "flex items-center gap-1", children: [...Array(Math.min(5, totalPages))].map((_, i) => {
|
|
174
|
+
const pageNum = i + 1;
|
|
175
|
+
return (_jsx("button", { onClick: () => setCurrentPage(pageNum), className: `px-3 py-1.5 rounded-lg text-sm font-medium transition-all ${currentPage === pageNum
|
|
176
|
+
? 'text-white'
|
|
177
|
+
: 'text-gray-400 hover:text-white hover:bg-gray-700'}`, style: currentPage === pageNum
|
|
178
|
+
? {
|
|
179
|
+
backgroundColor: accentColor,
|
|
180
|
+
color: 'white',
|
|
181
|
+
}
|
|
182
|
+
: {}, children: pageNum }, pageNum));
|
|
183
|
+
}) }), _jsx("button", { onClick: () => setCurrentPage((p) => Math.min(totalPages, p + 1)), disabled: currentPage === totalPages, className: "px-3 py-1.5 rounded-lg text-sm font-medium text-gray-400 hover:text-white hover:bg-gray-700 transition-all disabled:opacity-50 disabled:cursor-not-allowed", children: "Next \u2192" })] })] })), _jsx("div", { className: "px-6 py-3 border-t border-gray-700 flex items-center justify-end text-xs text-gray-500", children: _jsxs("span", { className: "flex items-center gap-1", children: [_jsx(ExternalLink, { className: "w-3 h-3" }), "@chainloyalty/react"] }) })] }));
|
|
184
|
+
};
|
|
185
|
+
export default Leaderboard;
|
|
186
|
+
//# sourceMappingURL=Leaderboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Leaderboard.js","sourceRoot":"","sources":["../src/Leaderboard.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EACL,IAAI,EACJ,WAAW,EACX,SAAS,EACT,MAAM,EACN,QAAQ,EACR,KAAK,EACL,UAAU,EACV,YAAY,GACb,MAAM,cAAc,CAAC;AA6BtB,+EAA+E;AAC/E,4BAA4B;AAC5B,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,uBAAuB,GAAG,CAAC,SAA+B,EAAsB,EAAE;IACtF,MAAM,QAAQ,GAAG;QACf,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;QACxD,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;QACxD,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QACzD,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QACxD,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QACxD,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QAC5D,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QACtD,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QAC1D,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QACzD,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QAC9D,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QAC/D,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QAC5D,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QACxD,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;QACzD,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;KACzD,CAAC;IAEF,4CAA4C;IAC5C,MAAM,UAAU,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,EAAE,KAAK,GAAG,CAAC;QACf,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,0BAA0B,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;QAC5F,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QAC5C,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,oBAAoB,GAAG,KAAK,EAChC,SAA+B,EACF,EAAE;IAC/B,yBAAyB;IACzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzD,mBAAmB;IACnB,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,KAAK,GAAG,CAAC,EAAU,EAAE;IAC5D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAY,EAAQ,EAAE;IAC7C,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE;IAC5C,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,CAAC,OAAO;IACzC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,CAAC,SAAS;IAC3C,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,CAAC,SAAS;IAC3C,OAAO,SAAS,CAAC,CAAC,OAAO;AAC3B,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAmB,EAAE;IACpD,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAaF,MAAM,cAAc,GAAkC,CAAC,EACrD,KAAK,EACL,WAAW,EACX,aAAa,GAAG,KAAK,EACrB,aAAa,GACd,EAAE,EAAE;IACH,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QACD,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3C,OAAO,CACL,cACE,SAAS,EAAE,gEACT,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EACrC,EAAE,aAGF,aAAI,SAAS,EAAC,mBAAmB,YAC/B,eAAK,SAAS,EAAC,kCAAkC,aAC9C,QAAQ,IAAI,eAAM,SAAS,EAAC,cAAc,YAAE,QAAQ,GAAQ,EAC7D,gBACE,SAAS,EAAC,WAAW,EACrB,KAAK,EAAE;gCACL,KAAK,EAAE,SAAS;6BACjB,kBAEC,KAAK,CAAC,IAAI,IACP,IACH,GACH,EAGL,aAAI,SAAS,EAAC,mBAAmB,YAC/B,eAAK,SAAS,EAAC,+BAA+B,aAC5C,eAAM,SAAS,EAAC,sBAAsB,YACnC,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,GAC/B,EACP,iBACE,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,gIAAgI,EAC1I,KAAK,EAAE,KAAK,CAAC,aAAa,YAEzB,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAI,CACjE,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,CAC7B,GACM,EACR,KAAK,CAAC,WAAW,IAAI,CACpB,gBAAM,SAAS,EAAC,wCAAwC,kBAAG,KAAK,CAAC,WAAW,SAAS,CACtF,IACG,GACH,EAGL,aAAI,SAAS,EAAC,mBAAmB,YAC/B,eAAK,SAAS,EAAC,YAAY,aACzB,YAAG,SAAS,EAAC,WAAW,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,YACnD,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,GAC5B,EACJ,YAAG,SAAS,EAAC,uCAAuC,uBAAW,IAC3D,GACH,EAGL,aAAI,SAAS,EAAC,mBAAmB,YAC/B,eACE,SAAS,EAAC,qDAAqD,EAC/D,KAAK,EAAE;wBACL,eAAe,EAAE,yBAAyB;wBAC1C,WAAW,EAAE,WAAW;qBACzB,aAED,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,GAAI,EAC5D,eAAM,SAAS,EAAC,0BAA0B,YAAE,KAAK,CAAC,WAAW,GAAQ,IACjE,GACH,IACF,CACN,CAAC;AACJ,CAAC,CAAC;AAEF,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EACtD,aAAa,GAAG,IAAI,EACpB,YAAY,GAAG,EAAE,EACjB,YAAY,GAAG,EAAE,EACjB,WAAW,GAAG,KAAK,EACnB,mBAAmB,GAAG,KAAK,GAC5B,EAAE,EAAE;IACH,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAuB,SAAS,CAAC,CAAC;IAC5E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAqB,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAElD,MAAM,eAAe,GAAG,YAAY,CAAC,UAAU,IAAI,SAAS,CAAC;IAC7D,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,IAAI,SAAS,CAAC;IACtD,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,IAAI,SAAS,CAAC;IAEvD,oCAAoC;IACpC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,cAAc,CAAC,CAAC,CAAC,CAAC;QAElB,oBAAoB,CAAC,SAAS,CAAC;aAC5B,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,OAAO,CAAC,MAAM,CAAC,CAAC;YAChB,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,4BAA4B,CAAC,CAAC;YACtD,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACrD,OAAO,CAAC,MAAM,CAAC,CAAC;QAChB,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,aAAa;IACb,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC;IACpD,MAAM,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;IAC3C,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEzF,MAAM,eAAe,GAAG,aAAa;QACnC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE,CAAC;QACzF,CAAC,CAAC,IAAI,CAAC;IAET,OAAO,CACL,eACE,SAAS,EAAC,mDAAmD,EAC7D,KAAK,EAAE,EAAE,eAAe,EAAE,aAG1B,eAAK,SAAS,EAAC,8BAA8B,aAC3C,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAI,EAC9D,aAAI,SAAS,EAAC,+BAA+B,4BAAiB,IAC1D,EACN,iBACE,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAC,oGAAoG,EAC9G,KAAK,EAAC,qBAAqB,YAE3B,KAAC,SAAS,IAAC,SAAS,EAAE,WAAW,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,GAAI,GAC7D,IACL,EAGN,eAAK,SAAS,EAAC,4CAA4C,aACzD,eACE,SAAS,EAAC,uCAAuC,EACjD,KAAK,EAAE,EAAE,eAAe,EAAE,uBAAuB,EAAE,aAEnD,YAAG,SAAS,EAAC,uBAAuB,4BAAgB,EACpD,YAAG,SAAS,EAAC,+BAA+B,YAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAK,IAC3E,EAEL,eAAe,IAAI,CAClB,8BACE,eACE,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE;4CACL,WAAW,EAAE,WAAW;4CACxB,eAAe,EAAE,yBAAyB;yCAC3C,aAED,YAAG,SAAS,EAAC,uBAAuB,0BAAc,EAClD,aAAG,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,kBAC3D,eAAe,CAAC,IAAI,IACpB,IACA,EAEN,eACE,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE;4CACL,WAAW,EAAE,YAAY;4CACzB,eAAe,EAAE,wBAAwB;yCAC1C,aAED,YAAG,SAAS,EAAC,uBAAuB,4BAAgB,EACpD,YAAG,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,YAC7D,eAAe,CAAC,MAAM,CAAC,cAAc,EAAE,GACtC,IACA,IACL,CACJ,IACG,EAGL,CAAC,mBAAmB,IAAI,CACvB,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,QAAQ,IAAC,SAAS,EAAC,uBAAuB,GAAG,EAC9C,cAAK,SAAS,EAAC,YAAY,YACvB,CAAC,SAAS,EAAE,OAAO,CAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAC3C,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,EAC/B,SAAS,EAAE,6DACT,SAAS,KAAK,EAAE;wCACd,CAAC,CAAC,YAAY;wCACd,CAAC,CAAC,qDACN,EAAE,EACF,KAAK,EACH,SAAS,KAAK,EAAE;wCACd,CAAC,CAAC;4CACE,eAAe,EAAE,WAAW;4CAC5B,KAAK,EAAE,OAAO;yCACf;wCACH,CAAC,CAAC,EAAE,YAGP,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,IAhBxC,EAAE,CAiBA,CACV,CAAC,GACE,IACF,CACP,IACG,EAGN,eAAK,KAAK,EAAE,EAAE,eAAe,EAAE,uBAAuB,EAAE,aAErD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAC1B,cAAK,SAAS,EAAC,eAAe,YAC3B,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC3B,cAAa,SAAS,EAAC,2CAA2C,IAAxD,CAAC,CAA0D,CACtE,CAAC,GACE,CACP,EAGA,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CACxB,eAAK,SAAS,EAAC,iBAAiB,aAC9B,YAAG,SAAS,EAAC,mBAAmB,YAAE,KAAK,GAAK,EAC5C,iBACE,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,wDAAwD,EAClE,KAAK,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,0BAGhC,IACL,CACP,EAGA,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAC1C,eAAK,SAAS,EAAC,kBAAkB,aAC/B,KAAC,UAAU,IAAC,SAAS,EAAC,sCAAsC,GAAG,EAC/D,aAAI,SAAS,EAAC,uCAAuC,oCAAyB,EAC9E,YAAG,SAAS,EAAC,eAAe,iFAAqE,IAC7F,CACP,EAGA,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAClB,cAAK,SAAS,EAAC,iBAAiB,YAC9B,iBAAO,SAAS,EAAC,QAAQ,aACvB,0BACE,cAAI,SAAS,EAAC,yCAAyC,aACrD,aAAI,SAAS,EAAC,mEAAmE,qBAE5E,EACL,aAAI,SAAS,EAAC,mEAAmE,uBAE5E,EACL,aAAI,SAAS,EAAC,oEAAoE,uBAE7E,EACL,aAAI,SAAS,EAAC,qEAAqE,uBAE9E,IACF,GACC,EACR,0BACG,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC5B,KAAC,cAAc,IAEb,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,EACxB,aAAa,EACX,aAAa;4CACX,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE;4CACnE,CAAC,CAAC,KAAK,EAEX,aAAa,EAAE,GAAG,EAAE;4CAClB,mCAAmC;4CACnC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;wCAC9C,CAAC,IAXI,KAAK,CAAC,IAAI,CAYf,CACH,CAAC,GACI,IACF,GACJ,CACP,IACG,EAGL,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,GAAG,YAAY,IAAI,CAC7C,eAAK,SAAS,EAAC,sEAAsE,aACnF,eAAK,SAAS,EAAC,uBAAuB,yBAC3B,UAAU,GAAG,CAAC,UAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,UAAM,IAAI,CAAC,MAAM,IACzE,EACN,eAAK,SAAS,EAAC,YAAY,aACzB,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EACxD,QAAQ,EAAE,WAAW,KAAK,CAAC,EAC3B,SAAS,EAAC,4JAA4J,gCAG/J,EACT,cAAK,SAAS,EAAC,yBAAyB,YACrC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oCAChD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;oCACtB,OAAO,CACL,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,EACtC,SAAS,EAAE,6DACT,WAAW,KAAK,OAAO;4CACrB,CAAC,CAAC,YAAY;4CACd,CAAC,CAAC,kDACN,EAAE,EACF,KAAK,EACH,WAAW,KAAK,OAAO;4CACrB,CAAC,CAAC;gDACE,eAAe,EAAE,WAAW;gDAC5B,KAAK,EAAE,OAAO;6CACf;4CACH,CAAC,CAAC,EAAE,YAGP,OAAO,IAhBH,OAAO,CAiBL,CACV,CAAC;gCACJ,CAAC,CAAC,GACE,EACN,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EACjE,QAAQ,EAAE,WAAW,KAAK,UAAU,EACpC,SAAS,EAAC,4JAA4J,4BAG/J,IACL,IACF,CACP,EAGD,cAAK,SAAS,EAAC,wFAAwF,YACrG,gBAAM,SAAS,EAAC,yBAAyB,aACvC,KAAC,YAAY,IAAC,SAAS,EAAC,SAAS,GAAG,2BAE/B,GACH,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @chainloyalty/react - RewardsDashboard Component
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* A comprehensive, production-ready component that displays user rewards information.
|
|
6
|
+
* This embeddable component shows wallet connection status, points balance, earned badges,
|
|
7
|
+
* reward history, and tier level.
|
|
8
|
+
*
|
|
9
|
+
* Key Features:
|
|
10
|
+
* - Wallet connection display with copy functionality
|
|
11
|
+
* - Large, prominent points display
|
|
12
|
+
* - Badge gallery showing earned badges
|
|
13
|
+
* - Reward history with timestamps
|
|
14
|
+
* - Tier level indicator
|
|
15
|
+
* - Fully responsive design (mobile + desktop)
|
|
16
|
+
* - Dark theme with professional UI
|
|
17
|
+
* - Loading and empty states
|
|
18
|
+
* - Customizable via props
|
|
19
|
+
*/
|
|
20
|
+
import React from 'react';
|
|
21
|
+
export interface Badge {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
icon: string;
|
|
25
|
+
description: string;
|
|
26
|
+
earnedAt: string;
|
|
27
|
+
rarity: 'common' | 'rare' | 'epic' | 'legendary';
|
|
28
|
+
}
|
|
29
|
+
export interface RewardHistoryItem {
|
|
30
|
+
id: string;
|
|
31
|
+
type: 'purchase' | 'referral' | 'milestone' | 'subscription' | 'feature_usage';
|
|
32
|
+
title: string;
|
|
33
|
+
points: number;
|
|
34
|
+
timestamp: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface TierInfo {
|
|
38
|
+
name: string;
|
|
39
|
+
level: number;
|
|
40
|
+
icon: string;
|
|
41
|
+
nextMilestone: number;
|
|
42
|
+
currentProgress: number;
|
|
43
|
+
}
|
|
44
|
+
export interface RewardsDashboardProps {
|
|
45
|
+
walletAddress?: string | null;
|
|
46
|
+
onConnectWallet?: () => void;
|
|
47
|
+
onDisconnectWallet?: () => void;
|
|
48
|
+
customColors?: {
|
|
49
|
+
background?: string;
|
|
50
|
+
accent1?: string;
|
|
51
|
+
accent2?: string;
|
|
52
|
+
};
|
|
53
|
+
hideHistory?: boolean;
|
|
54
|
+
hideBadges?: boolean;
|
|
55
|
+
hideTier?: boolean;
|
|
56
|
+
compactMode?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface DashboardData {
|
|
59
|
+
totalPoints: number;
|
|
60
|
+
badges: Badge[];
|
|
61
|
+
rewardHistory: RewardHistoryItem[];
|
|
62
|
+
tier: TierInfo;
|
|
63
|
+
lastUpdated: string;
|
|
64
|
+
}
|
|
65
|
+
export declare const RewardsDashboard: React.FC<RewardsDashboardProps>;
|
|
66
|
+
export default RewardsDashboard;
|
|
67
|
+
//# sourceMappingURL=RewardsDashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RewardsDashboard.d.ts","sourceRoot":"","sources":["../src/RewardsDashboard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAiBnD,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;CAClD;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,eAAe,CAAC;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAmSD,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAgO5D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @chainloyalty/react - RewardsDashboard Component
|
|
4
|
+
*
|
|
5
|
+
* Purpose:
|
|
6
|
+
* A comprehensive, production-ready component that displays user rewards information.
|
|
7
|
+
* This embeddable component shows wallet connection status, points balance, earned badges,
|
|
8
|
+
* reward history, and tier level.
|
|
9
|
+
*
|
|
10
|
+
* Key Features:
|
|
11
|
+
* - Wallet connection display with copy functionality
|
|
12
|
+
* - Large, prominent points display
|
|
13
|
+
* - Badge gallery showing earned badges
|
|
14
|
+
* - Reward history with timestamps
|
|
15
|
+
* - Tier level indicator
|
|
16
|
+
* - Fully responsive design (mobile + desktop)
|
|
17
|
+
* - Dark theme with professional UI
|
|
18
|
+
* - Loading and empty states
|
|
19
|
+
* - Customizable via props
|
|
20
|
+
*/
|
|
21
|
+
import { useState, useEffect } from 'react';
|
|
22
|
+
import { Wallet, Copy, CheckCircle, Award, TrendingUp, Zap, ExternalLink, RefreshCw, Lock, } from 'lucide-react';
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Mock Data & API Functions
|
|
25
|
+
// ============================================================================
|
|
26
|
+
const generateMockBadges = () => {
|
|
27
|
+
return [
|
|
28
|
+
{
|
|
29
|
+
id: 'badge_1',
|
|
30
|
+
name: 'Early Bird',
|
|
31
|
+
icon: '🌅',
|
|
32
|
+
description: 'Joined in the first 100 users',
|
|
33
|
+
earnedAt: '2024-01-15',
|
|
34
|
+
rarity: 'legendary',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 'badge_2',
|
|
38
|
+
name: 'Referral Master',
|
|
39
|
+
icon: '🎯',
|
|
40
|
+
description: 'Referred 5+ users',
|
|
41
|
+
earnedAt: '2024-02-20',
|
|
42
|
+
rarity: 'epic',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'badge_3',
|
|
46
|
+
name: 'Subscriber',
|
|
47
|
+
icon: '🔔',
|
|
48
|
+
description: 'Active subscription holder',
|
|
49
|
+
earnedAt: '2024-02-01',
|
|
50
|
+
rarity: 'rare',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'badge_4',
|
|
54
|
+
name: 'Power User',
|
|
55
|
+
icon: '⚡',
|
|
56
|
+
description: 'Made 10+ transactions',
|
|
57
|
+
earnedAt: '2024-03-10',
|
|
58
|
+
rarity: 'rare',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'badge_5',
|
|
62
|
+
name: 'Champion',
|
|
63
|
+
icon: '👑',
|
|
64
|
+
description: 'Top 10 leaderboard',
|
|
65
|
+
earnedAt: '2024-03-25',
|
|
66
|
+
rarity: 'legendary',
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
};
|
|
70
|
+
const generateMockRewardHistory = () => {
|
|
71
|
+
return [
|
|
72
|
+
{
|
|
73
|
+
id: 'evt_1',
|
|
74
|
+
type: 'purchase',
|
|
75
|
+
title: 'Premium Purchase',
|
|
76
|
+
points: 500,
|
|
77
|
+
timestamp: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(),
|
|
78
|
+
description: 'Purchased premium features',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: 'evt_2',
|
|
82
|
+
type: 'referral',
|
|
83
|
+
title: 'Referral Bonus',
|
|
84
|
+
points: 250,
|
|
85
|
+
timestamp: new Date(Date.now() - 3 * 24 * 60 * 60 * 1000).toISOString(),
|
|
86
|
+
description: 'Friend Bob joined via your referral',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: 'evt_3',
|
|
90
|
+
type: 'milestone',
|
|
91
|
+
title: 'Milestone Reached',
|
|
92
|
+
points: 1000,
|
|
93
|
+
timestamp: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),
|
|
94
|
+
description: '5000 total points milestone',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: 'evt_4',
|
|
98
|
+
type: 'subscription',
|
|
99
|
+
title: 'Daily Subscription',
|
|
100
|
+
points: 100,
|
|
101
|
+
timestamp: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(),
|
|
102
|
+
description: 'Active subscription reward',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: 'evt_5',
|
|
106
|
+
type: 'feature_usage',
|
|
107
|
+
title: 'Feature Usage',
|
|
108
|
+
points: 75,
|
|
109
|
+
timestamp: new Date(Date.now() - 15 * 24 * 60 * 60 * 1000).toISOString(),
|
|
110
|
+
description: 'Used advanced analytics feature',
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
};
|
|
114
|
+
const fetchDashboardData = async (walletAddress) => {
|
|
115
|
+
// Simulate API delay
|
|
116
|
+
await new Promise((resolve) => setTimeout(resolve, 800));
|
|
117
|
+
// Mock data based on wallet address
|
|
118
|
+
const totalPoints = walletAddress.length * 123 + 4567; // Pseudo-random but deterministic
|
|
119
|
+
return {
|
|
120
|
+
totalPoints,
|
|
121
|
+
badges: generateMockBadges(),
|
|
122
|
+
rewardHistory: generateMockRewardHistory(),
|
|
123
|
+
tier: {
|
|
124
|
+
name: 'Platinum',
|
|
125
|
+
level: 3,
|
|
126
|
+
icon: '💎',
|
|
127
|
+
nextMilestone: 8000,
|
|
128
|
+
currentProgress: totalPoints,
|
|
129
|
+
},
|
|
130
|
+
lastUpdated: new Date().toISOString(),
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
// ============================================================================
|
|
134
|
+
// Utility Functions
|
|
135
|
+
// ============================================================================
|
|
136
|
+
const shortenAddress = (address) => {
|
|
137
|
+
if (!address)
|
|
138
|
+
return '';
|
|
139
|
+
return `${address.substring(0, 6)}...${address.substring(address.length - 4)}`;
|
|
140
|
+
};
|
|
141
|
+
const copyToClipboard = (text) => {
|
|
142
|
+
navigator.clipboard.writeText(text);
|
|
143
|
+
};
|
|
144
|
+
const formatDate = (isoDate) => {
|
|
145
|
+
const date = new Date(isoDate);
|
|
146
|
+
const now = new Date();
|
|
147
|
+
const diffMs = now.getTime() - date.getTime();
|
|
148
|
+
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
149
|
+
if (diffDays === 0)
|
|
150
|
+
return 'Today';
|
|
151
|
+
if (diffDays === 1)
|
|
152
|
+
return 'Yesterday';
|
|
153
|
+
if (diffDays < 7)
|
|
154
|
+
return `${diffDays} days ago`;
|
|
155
|
+
if (diffDays < 30)
|
|
156
|
+
return `${Math.floor(diffDays / 7)} weeks ago`;
|
|
157
|
+
if (diffDays < 365)
|
|
158
|
+
return `${Math.floor(diffDays / 30)} months ago`;
|
|
159
|
+
return `${Math.floor(diffDays / 365)} years ago`;
|
|
160
|
+
};
|
|
161
|
+
const getRarityColor = (rarity) => {
|
|
162
|
+
const rarityColors = {
|
|
163
|
+
common: '#A0AEC0',
|
|
164
|
+
rare: '#3FB950',
|
|
165
|
+
epic: '#2F81F7',
|
|
166
|
+
legendary: '#F59E0B',
|
|
167
|
+
};
|
|
168
|
+
return rarityColors[rarity] || '#A0AEC0';
|
|
169
|
+
};
|
|
170
|
+
const RewardHistory = ({ items, accentColor }) => {
|
|
171
|
+
return (_jsx("div", { className: "space-y-3", children: items.map((item) => (_jsxs("div", { className: "flex items-start justify-between p-3 rounded-lg border border-gray-700 hover:border-gray-600 transition-colors", style: { borderLeftColor: accentColor, borderLeftWidth: '3px' }, children: [_jsxs("div", { className: "flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-sm font-semibold text-white", children: item.title }), _jsx("span", { className: "text-xs px-2 py-0.5 rounded-full bg-gray-700 text-gray-300", children: item.type })] }), item.description && (_jsx("p", { className: "text-xs text-gray-400 mt-1", children: item.description })), _jsx("p", { className: "text-xs text-gray-500 mt-1", children: formatDate(item.timestamp) })] }), _jsxs("div", { className: "ml-4 text-right", children: [_jsxs("p", { className: "text-lg font-bold", style: { color: accentColor }, children: ["+", item.points] }), _jsx("p", { className: "text-xs text-gray-400", children: "points" })] })] }, item.id))) }));
|
|
172
|
+
};
|
|
173
|
+
const BadgeGrid = ({ badges, compactMode = false }) => {
|
|
174
|
+
const displayBadges = compactMode ? badges.slice(0, 4) : badges;
|
|
175
|
+
return (_jsx("div", { className: `grid gap-3 ${compactMode ? 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4' : 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5'}`, children: displayBadges.map((badge) => (_jsxs("div", { className: "group relative p-3 rounded-lg border transition-all hover:scale-105 cursor-pointer", style: {
|
|
176
|
+
borderColor: getRarityColor(badge.rarity),
|
|
177
|
+
backgroundColor: 'rgba(31, 41, 55, 0.5)',
|
|
178
|
+
}, title: `${badge.name} - ${badge.description}`, children: [_jsx("div", { className: "text-3xl mb-1 text-center", children: badge.icon }), _jsx("p", { className: "text-xs font-semibold text-white text-center truncate", children: badge.name }), _jsx("p", { className: "text-xs text-gray-400 text-center mt-0.5", children: new Date(badge.earnedAt).toLocaleDateString() }), _jsx("div", { className: "hidden group-hover:block absolute bottom-full left-1/2 transform -translate-x-1/2 mb-2 p-2 bg-gray-900 border border-gray-700 rounded-lg text-xs text-gray-300 w-32 text-center whitespace-normal z-10", children: badge.description })] }, badge.id))) }));
|
|
179
|
+
};
|
|
180
|
+
const TierCard = ({ tier, accentColor }) => {
|
|
181
|
+
const progressPercent = (tier.currentProgress / tier.nextMilestone) * 100;
|
|
182
|
+
return (_jsxs("div", { className: "p-4 rounded-lg border", style: {
|
|
183
|
+
borderColor: accentColor,
|
|
184
|
+
backgroundColor: 'rgba(31, 41, 55, 0.3)',
|
|
185
|
+
}, children: [_jsx("div", { className: "flex items-start justify-between mb-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-3xl", children: tier.icon }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-semibold text-white", children: tier.name }), _jsxs("p", { className: "text-xs text-gray-400", children: ["Level ", tier.level] })] })] }) }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex justify-between text-xs text-gray-400", children: [_jsxs("span", { children: [tier.currentProgress.toLocaleString(), " points"] }), _jsxs("span", { children: [tier.nextMilestone.toLocaleString(), " goal"] })] }), _jsx("div", { className: "w-full bg-gray-700 rounded-full h-2 overflow-hidden", children: _jsx("div", { className: "h-full rounded-full transition-all duration-500", style: {
|
|
186
|
+
width: `${Math.min(progressPercent, 100)}%`,
|
|
187
|
+
backgroundColor: accentColor,
|
|
188
|
+
} }) })] })] }));
|
|
189
|
+
};
|
|
190
|
+
// ============================================================================
|
|
191
|
+
// Main RewardsDashboard Component
|
|
192
|
+
// ============================================================================
|
|
193
|
+
export const RewardsDashboard = ({ walletAddress = null, onConnectWallet, customColors = {}, hideHistory = false, hideBadges = false, hideTier = false, compactMode = false, }) => {
|
|
194
|
+
const [data, setData] = useState(null);
|
|
195
|
+
const [loading, setLoading] = useState(false);
|
|
196
|
+
const [error, setError] = useState(null);
|
|
197
|
+
const [copied, setCopied] = useState(false);
|
|
198
|
+
const backgroundColor = customColors.background || '#0D1117';
|
|
199
|
+
const accentColor = customColors.accent1 || '#2F81F7';
|
|
200
|
+
const accentColor2 = customColors.accent2 || '#3FB950';
|
|
201
|
+
// Fetch data when wallet changes
|
|
202
|
+
useEffect(() => {
|
|
203
|
+
if (!walletAddress) {
|
|
204
|
+
setData(null);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
setLoading(true);
|
|
208
|
+
setError(null);
|
|
209
|
+
fetchDashboardData(walletAddress)
|
|
210
|
+
.then((result) => {
|
|
211
|
+
setData(result);
|
|
212
|
+
setLoading(false);
|
|
213
|
+
})
|
|
214
|
+
.catch((err) => {
|
|
215
|
+
setError(err.message);
|
|
216
|
+
setLoading(false);
|
|
217
|
+
});
|
|
218
|
+
}, [walletAddress]);
|
|
219
|
+
const handleCopyAddress = () => {
|
|
220
|
+
if (walletAddress) {
|
|
221
|
+
copyToClipboard(walletAddress);
|
|
222
|
+
setCopied(true);
|
|
223
|
+
setTimeout(() => setCopied(false), 2000);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const handleRefresh = async () => {
|
|
227
|
+
if (walletAddress) {
|
|
228
|
+
setLoading(true);
|
|
229
|
+
const result = await fetchDashboardData(walletAddress);
|
|
230
|
+
setData(result);
|
|
231
|
+
setLoading(false);
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
// Disconnected state
|
|
235
|
+
if (!walletAddress) {
|
|
236
|
+
return (_jsx("div", { className: "p-6 rounded-lg border border-gray-700 max-w-2xl", style: { backgroundColor }, children: _jsxs("div", { className: "text-center", children: [_jsx(Lock, { className: "w-12 h-12 mx-auto mb-4 text-gray-500" }), _jsx("h2", { className: "text-xl font-bold text-white mb-2", children: "Connect Your Wallet" }), _jsx("p", { className: "text-gray-400 mb-6", children: "Connect your wallet to view your rewards, badges, and track your achievements." }), onConnectWallet && (_jsxs("button", { onClick: onConnectWallet, className: "inline-flex items-center gap-2 px-6 py-2 rounded-lg font-semibold text-white transition-all hover:opacity-90", style: {
|
|
237
|
+
backgroundColor: accentColor,
|
|
238
|
+
}, children: [_jsx(Wallet, { className: "w-5 h-5" }), "Connect Wallet"] }))] }) }));
|
|
239
|
+
}
|
|
240
|
+
// Loading state
|
|
241
|
+
if (loading && !data) {
|
|
242
|
+
return (_jsx("div", { className: "p-6 rounded-lg border border-gray-700 max-w-2xl", style: { backgroundColor }, children: _jsxs("div", { className: "space-y-4", children: [_jsx("div", { className: "h-20 bg-gray-700 rounded-lg animate-pulse" }), _jsx("div", { className: "h-40 bg-gray-700 rounded-lg animate-pulse" }), _jsx("div", { className: "h-32 bg-gray-700 rounded-lg animate-pulse" })] }) }));
|
|
243
|
+
}
|
|
244
|
+
// Error state
|
|
245
|
+
if (error && !data) {
|
|
246
|
+
return (_jsxs("div", { className: "p-6 rounded-lg border border-red-700 max-w-2xl", style: { backgroundColor }, children: [_jsxs("p", { className: "text-red-400", children: ["Failed to load rewards: ", error] }), _jsx("button", { onClick: handleRefresh, className: "mt-4 px-4 py-2 rounded-lg text-white text-sm transition-all", style: { backgroundColor: accentColor }, children: "Try Again" })] }));
|
|
247
|
+
}
|
|
248
|
+
if (!data)
|
|
249
|
+
return null;
|
|
250
|
+
return (_jsxs("div", { className: "rounded-lg border border-gray-700 overflow-hidden", style: { backgroundColor }, children: [_jsxs("div", { className: "p-6 border-b border-gray-700", children: [_jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsx("h2", { className: "text-2xl font-bold text-white", children: "Rewards Dashboard" }), _jsx("button", { onClick: handleRefresh, disabled: loading, className: "p-2 rounded-lg text-gray-400 hover:text-white hover:bg-gray-700 transition-all disabled:opacity-50", children: _jsx(RefreshCw, { className: `w-5 h-5 ${loading ? 'animate-spin' : ''}` }) })] }), _jsxs("div", { className: "flex items-center justify-between p-3 rounded-lg bg-gray-800/50 border border-gray-700", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Wallet, { className: "w-5 h-5", style: { color: accentColor } }), _jsxs("div", { children: [_jsx("p", { className: "text-xs text-gray-400", children: "Connected Wallet" }), _jsx("p", { className: "text-sm font-mono font-semibold text-white", children: shortenAddress(walletAddress) })] })] }), _jsx("button", { onClick: handleCopyAddress, className: "p-2 rounded-lg text-gray-400 hover:text-white hover:bg-gray-700 transition-all", title: walletAddress, children: copied ? _jsx(CheckCircle, { className: "w-5 h-5", style: { color: accentColor2 } }) : _jsx(Copy, { className: "w-5 h-5" }) })] })] }), _jsxs("div", { className: `p-6 space-y-6 ${compactMode ? 'max-w-3xl' : ''}`, style: { backgroundColor: 'rgba(31, 41, 55, 0.2)' }, children: [_jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsxs("div", { className: "p-6 rounded-lg border text-center", style: {
|
|
251
|
+
borderColor: accentColor,
|
|
252
|
+
backgroundColor: 'rgba(47, 129, 247, 0.1)',
|
|
253
|
+
}, children: [_jsx("p", { className: "text-sm text-gray-400 mb-2", children: "Total Points" }), _jsx("p", { className: "text-4xl font-bold", style: { color: accentColor }, children: data.totalPoints.toLocaleString() }), _jsxs("div", { className: "flex items-center justify-center gap-1 mt-2 text-xs text-gray-400", children: [_jsx(TrendingUp, { className: "w-4 h-4" }), _jsx("span", { children: "Keep earning rewards" })] })] }), !hideTier && (_jsx(TierCard, { tier: data.tier, accentColor: accentColor2 }))] }), !hideBadges && data.badges.length > 0 && (_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx(Award, { className: "w-5 h-5", style: { color: accentColor } }), _jsxs("h3", { className: "text-lg font-semibold text-white", children: ["Badges (", data.badges.length, ")"] })] }), _jsx(BadgeGrid, { badges: data.badges, compactMode: compactMode })] })), !hideHistory && data.rewardHistory.length > 0 && (_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx(Zap, { className: "w-5 h-5", style: { color: accentColor2 } }), _jsx("h3", { className: "text-lg font-semibold text-white", children: "Recent Rewards" })] }), _jsx(RewardHistory, { items: compactMode ? data.rewardHistory.slice(0, 3) : data.rewardHistory, accentColor: accentColor })] }))] }), _jsxs("div", { className: "px-6 py-3 border-t border-gray-700 flex items-center justify-between text-xs text-gray-500", children: [_jsxs("span", { children: ["Last updated: ", formatDate(data.lastUpdated)] }), _jsxs("span", { className: "flex items-center gap-1", children: [_jsx(ExternalLink, { className: "w-3 h-3" }), "@chainloyalty/react"] })] })] }));
|
|
254
|
+
};
|
|
255
|
+
export default RewardsDashboard;
|
|
256
|
+
//# sourceMappingURL=RewardsDashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RewardsDashboard.js","sourceRoot":"","sources":["../src/RewardsDashboard.tsx"],"names":[],"mappings":"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"}
|