Skip to content

Commit 1485395

Browse files
Copilot0xrinegade
andcommitted
Fix guild system bugs and improve accessibility: synchronize guild membership, add keyboard focus styling, fix mock data
Co-authored-by: 0xrinegade <[email protected]>
1 parent 1f4f92a commit 1485395

File tree

4 files changed

+99
-17
lines changed

4 files changed

+99
-17
lines changed

src/components/Navbar/Navbar.tsx

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
MainLinksBlock,
2323
MainLinksWrap,
2424
NavLink,
25+
VaultNavLink,
2526
WalletContainer,
2627
} from './styles';
2728
import TelegramIcon from './TelegramIcon';
@@ -232,17 +233,9 @@ export const Navbar = () => {
232233
Wallet
233234
</NavLink>
234235

235-
<NavLink
236-
to="/vault"
237-
style={{
238-
background: 'linear-gradient(135deg, #FFD700, #FFA500)',
239-
color: '#000',
240-
fontWeight: 'bold',
241-
borderRadius: '8px',
242-
}}
243-
>
236+
<VaultNavLink to="/vault">
244237
🎰 Vault
245-
</NavLink>
238+
</VaultNavLink>
246239

247240
<NavLink
248241
to="/help"

src/components/Navbar/styles.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,34 @@ export const WalletDisconnectButton = styled(Button)`
238238
text-align: right;
239239
`;
240240

241+
export const VaultNavLink = styled(RouterNavLink)`
242+
text-decoration: none;
243+
font-size: 0.7em;
244+
padding: 8px 12px;
245+
margin: 0px 4px;
246+
text-align: center;
247+
border-radius: ${BORDER_RADIUS.md};
248+
background: linear-gradient(135deg, #FFD700, #FFA500);
249+
color: #000;
250+
font-weight: bold;
251+
transition: all ease-in 0.2s;
252+
border: 0;
253+
cursor: pointer;
254+
white-space: nowrap;
255+
box-shadow: 0 2px 8px rgba(255, 215, 0, 0.3);
256+
257+
&:hover {
258+
background: linear-gradient(135deg, #FFA500, #FFD700);
259+
transform: translateY(-1px);
260+
box-shadow: 0 4px 12px rgba(255, 215, 0, 0.4);
261+
color: #000;
262+
}
263+
264+
&:active {
265+
transform: translateY(0);
266+
}
267+
`;
268+
241269
export const Body = styled.div`
242270
font-family: ${FONTS.main};
243271
color: ${COLORS.white};

src/components/VaultAccessButton.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ const VaultFab = styled(Fab)(({ theme }) => ({
2323
'&:active': {
2424
transform: 'translateY(-2px) scale(1.02)',
2525
},
26+
// Keyboard focus styling for accessibility
27+
'&:focus-visible': {
28+
outline: '3px solid rgba(255, 215, 0, 0.8)',
29+
outlineOffset: '2px',
30+
background: 'linear-gradient(135deg, #FFA500, #FFD700)',
31+
transform: 'translateY(-2px) scale(1.02)',
32+
boxShadow: '0 12px 40px rgba(255, 215, 0, 0.7)',
33+
},
2634
// Pulsing animation to draw attention
2735
animation: 'vault-pulse 3s ease-in-out infinite',
2836
'@keyframes vault-pulse': {
@@ -49,6 +57,13 @@ const VaultAccessButton: React.FC = () => {
4957
navigate('/vault');
5058
};
5159

60+
const handleKeyDown = (event: React.KeyboardEvent) => {
61+
if (event.key === 'Enter' || event.key === ' ') {
62+
event.preventDefault();
63+
handleVaultClick();
64+
}
65+
};
66+
5267
return (
5368
<Tooltip
5469
title="🎰 Surprise Vault - Lottery rewards for every trade!"
@@ -57,7 +72,10 @@ const VaultAccessButton: React.FC = () => {
5772
>
5873
<VaultFab
5974
onClick={handleVaultClick}
60-
aria-label="Access Surprise Vault"
75+
onKeyDown={handleKeyDown}
76+
aria-label="Access Surprise Vault - Lottery rewards for every trade"
77+
tabIndex={0}
78+
role="button"
6179
>
6280
<CasinoIcon sx={{ fontSize: 28 }} />
6381
</VaultFab>

src/pages/SurpriseVault/services/VaultService.ts

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
Winner,
44
LeaderboardEntry,
55
Guild,
6+
GuildMember,
67
UserVaultData,
78
VaultConfig
89
} from '../types';
@@ -30,6 +31,7 @@ class VaultService {
3031
};
3132

3233
private eventSubscribers: Array<(event: any) => void> = [];
34+
private static readonly MAX_SUBSCRIBERS = 50; // Prevent memory leaks
3335
private updateInterval: NodeJS.Timeout | null = null;
3436

3537
public static getInstance(): VaultService {
@@ -259,12 +261,25 @@ class VaultService {
259261
const maxMembers = Math.floor(memberCount * 1.5) + 10;
260262
const totalReferrals = Math.floor(generateStableRandom(seed + '_referrals', 50, 300));
261263

264+
// Generate realistic member data for demo
265+
const members: GuildMember[] = [];
266+
for (let j = 0; j < memberCount; j++) {
267+
const memberAddress = this.generateStableAddress(`${seed}_member_${j}`);
268+
members.push({
269+
address: memberAddress,
270+
joinDate: new Date(Date.now() - generateStableRandom(`${seed}_member_${j}_join`, 0, 60 * 24 * 60 * 60 * 1000)),
271+
referrals: Math.floor(generateStableRandom(`${seed}_member_${j}_refs`, 0, 20)),
272+
earnings: Math.floor(generateStableRandom(`${seed}_member_${j}_earnings`, 100, 2000)),
273+
role: j === 0 ? 'owner' : (j === 1 && generateStableRandom(`${seed}_member_${j}_admin`) > 0.7 ? 'admin' : 'member'),
274+
});
275+
}
276+
262277
guilds.push({
263278
id: `guild_${i}`,
264279
name: guildNames[i % guildNames.length],
265280
description: `${guildNames[i % guildNames.length]} guild focused on maximizing rewards and community growth`,
266281
creator: this.generateStableAddress(seed + '_creator'),
267-
members: [], // Simplified for demo
282+
members,
268283
maxMembers,
269284
totalReferrals,
270285
totalEarnings: Math.floor(generateStableRandom(seed + '_earnings', 5000, 50000)),
@@ -382,6 +397,12 @@ class VaultService {
382397

383398
// Real-time event simulation
384399
subscribeToEvents(callback: (event: any) => void): () => void {
400+
// Prevent memory leaks by limiting subscribers
401+
if (this.eventSubscribers.length >= VaultService.MAX_SUBSCRIBERS) {
402+
console.warn('VaultService: Maximum subscribers reached, removing oldest subscriber');
403+
this.eventSubscribers.shift(); // Remove oldest subscriber
404+
}
405+
385406
this.eventSubscribers.push(callback);
386407

387408
// Return unsubscribe function
@@ -434,16 +455,16 @@ class VaultService {
434455
try {
435456
// TODO: Replace with actual on-chain guild joining
436457
const userGuilds = VaultStorage.get('userGuilds', []) as any[];
437-
const existingGuild = userGuilds.find(g => g.id === guildId);
458+
const existingUserGuild = userGuilds.find(g => g.id === guildId && g.members && g.members.includes(userAddress));
438459

439-
if (existingGuild && existingGuild.members.includes(userAddress)) {
460+
if (existingUserGuild) {
440461
return {
441462
success: false,
442463
message: 'You are already a member of this guild.',
443464
};
444465
}
445466

446-
// Simulate guild capacity check
467+
// Get current guild data to check capacity
447468
const guildData = await this.getGuildById(guildId);
448469
if (guildData && guildData.members.length >= guildData.maxMembers) {
449470
return {
@@ -452,6 +473,7 @@ class VaultService {
452473
};
453474
}
454475

476+
// Update user's guild list
455477
userGuilds.push({
456478
id: guildId,
457479
name: guildData?.name || 'Unknown Guild',
@@ -464,6 +486,27 @@ class VaultService {
464486

465487
VaultStorage.set('userGuilds', userGuilds);
466488

489+
// Update the guild's member list in cache (sync the two data stores)
490+
const cacheKey = 'guilds';
491+
const cached = VaultStorage.get(cacheKey, null) as { guilds: Guild[]; timestamp: number } | null;
492+
if (cached && cached.guilds) {
493+
const guildIndex = cached.guilds.findIndex(g => g.id === guildId);
494+
if (guildIndex !== -1) {
495+
// Add user to guild's member list if not already present
496+
const existingMember = cached.guilds[guildIndex].members.find(m => m.address === userAddress);
497+
if (!existingMember) {
498+
cached.guilds[guildIndex].members.push({
499+
address: userAddress,
500+
joinDate: new Date(),
501+
referrals: 0,
502+
earnings: 0,
503+
role: 'member',
504+
});
505+
VaultStorage.set(cacheKey, cached);
506+
}
507+
}
508+
}
509+
467510
return {
468511
success: true,
469512
message: 'Successfully joined the guild!',
@@ -484,13 +527,13 @@ class VaultService {
484527
// Check if user has joined a specific guild
485528
isUserInGuild(guildId: string, userAddress: string): boolean {
486529
const userGuilds = VaultStorage.get('userGuilds', []) as any[];
487-
return userGuilds.some(g => g.id === guildId && g.userAddress === userAddress);
530+
return userGuilds.some(g => g.id === guildId && g.members && g.members.includes(userAddress));
488531
}
489532

490533
// Get all guilds user has joined
491534
getUserGuilds(userAddress: string): any[] {
492535
const userGuilds = VaultStorage.get('userGuilds', []) as any[];
493-
return userGuilds.filter(g => g.userAddress === userAddress);
536+
return userGuilds.filter(g => g.members && g.members.includes(userAddress));
494537
}
495538

496539
// Add cleanup method

0 commit comments

Comments
 (0)