146 lines
3 KiB
TypeScript
146 lines
3 KiB
TypeScript
import { Achievement, LeaderboardEntry } from '../types';
|
|
|
|
const MOCK_XP = {
|
|
current: 4250,
|
|
next: 5000,
|
|
level: 12,
|
|
rank: 420,
|
|
totalEarned: 15400,
|
|
};
|
|
|
|
const MOCK_ACHIEVEMENTS: Achievement[] = [
|
|
{
|
|
id: 'a1',
|
|
name: 'First Upload',
|
|
description: 'Uploaded your first track',
|
|
icon: '🎵',
|
|
progress: 1,
|
|
maxProgress: 1,
|
|
xpReward: 50,
|
|
category: 'creation',
|
|
},
|
|
{
|
|
id: 'a2',
|
|
name: 'Social Butterfly',
|
|
description: 'Follow 10 users',
|
|
icon: '🦋',
|
|
progress: 10,
|
|
maxProgress: 10,
|
|
xpReward: 100,
|
|
category: 'social',
|
|
},
|
|
{
|
|
id: 'a3',
|
|
name: 'Hit Maker',
|
|
description: 'Get 1000 plays on a track',
|
|
icon: '🔥',
|
|
progress: 850,
|
|
maxProgress: 1000,
|
|
xpReward: 500,
|
|
category: 'creation',
|
|
},
|
|
{
|
|
id: 'a4',
|
|
name: 'Collector',
|
|
description: 'Buy 5 items from marketplace',
|
|
icon: '💎',
|
|
progress: 2,
|
|
maxProgress: 5,
|
|
xpReward: 300,
|
|
category: 'collection',
|
|
},
|
|
{
|
|
id: 'a5',
|
|
name: 'Critique',
|
|
description: 'Post 20 comments',
|
|
icon: '💬',
|
|
progress: 20,
|
|
maxProgress: 20,
|
|
xpReward: 150,
|
|
category: 'community',
|
|
},
|
|
{
|
|
id: 'a6',
|
|
name: 'Influencer',
|
|
description: 'Gain 100 followers',
|
|
icon: '🌟',
|
|
progress: 45,
|
|
maxProgress: 100,
|
|
xpReward: 1000,
|
|
category: 'social',
|
|
},
|
|
];
|
|
|
|
const MOCK_LEADERBOARD: LeaderboardEntry[] = [
|
|
{
|
|
rank: 1,
|
|
userId: 'u4',
|
|
username: 'Deadmau5',
|
|
avatar: 'https://picsum.photos/id/100/100/100',
|
|
level: 99,
|
|
xp: 990000,
|
|
trend: 0,
|
|
},
|
|
{
|
|
rank: 2,
|
|
userId: 'u2',
|
|
username: 'Sarah Connor',
|
|
avatar: 'https://picsum.photos/id/64/100/100',
|
|
level: 45,
|
|
xp: 45000,
|
|
trend: 1,
|
|
},
|
|
{
|
|
rank: 3,
|
|
userId: 'u1',
|
|
username: 'Cyber_Producer',
|
|
avatar: 'https://picsum.photos/id/237/100/100',
|
|
level: 12,
|
|
xp: 4250,
|
|
trend: -1,
|
|
},
|
|
{
|
|
rank: 4,
|
|
userId: 'u5',
|
|
username: 'Neon_Pulse',
|
|
avatar: 'https://picsum.photos/id/55/100/100',
|
|
level: 10,
|
|
xp: 3000,
|
|
trend: 2,
|
|
},
|
|
{
|
|
rank: 5,
|
|
userId: 'u9',
|
|
username: 'Newbie',
|
|
avatar: 'https://picsum.photos/id/10/100/100',
|
|
level: 2,
|
|
xp: 500,
|
|
trend: 0,
|
|
},
|
|
];
|
|
|
|
export const gamificationService = {
|
|
getUserXP: async (_userId: string) => {
|
|
await new Promise((resolve) => setTimeout(resolve, 400));
|
|
return MOCK_XP;
|
|
},
|
|
|
|
getAchievements: async (_userId: string) => {
|
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
return MOCK_ACHIEVEMENTS;
|
|
},
|
|
|
|
getLeaderboard: async (period: 'weekly' | 'monthly' | 'all' = 'weekly') => {
|
|
await new Promise((resolve) => setTimeout(resolve, 600));
|
|
// Simulate slightly different data for periods
|
|
if (period === 'monthly') {
|
|
return MOCK_LEADERBOARD.map((e) => ({ ...e, xp: e.xp * 4 }));
|
|
}
|
|
return MOCK_LEADERBOARD;
|
|
},
|
|
|
|
claimReward: async (_achievementId: string) => {
|
|
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
return { success: true, xpAdded: 50 };
|
|
},
|
|
};
|