@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.
@@ -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":"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"}
@@ -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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"}