diff --git a/client/lib/demo-storage.ts b/client/lib/demo-storage.ts new file mode 100644 index 00000000..79d46141 --- /dev/null +++ b/client/lib/demo-storage.ts @@ -0,0 +1,230 @@ +// Demo storage service - simulates backend functionality using localStorage +import type { UserProfile, Project, Achievement } from './database.types'; +import { aethexToast } from './aethex-toast'; + +const STORAGE_KEYS = { + USER_PROFILE: 'aethex_demo_user_profile', + PROJECTS: 'aethex_demo_projects', + ACHIEVEMENTS: 'aethex_demo_achievements', + NOTIFICATIONS: 'aethex_demo_notifications', + INTERESTS: 'aethex_demo_interests', +}; + +// Demo user data +const DEMO_USER_PROFILE: Partial = { + id: 'demo-user-123', + username: 'demo_developer', + full_name: 'Demo Developer', + user_type: 'game_developer', + experience_level: 'intermediate', + total_xp: 1250, + level: 5, + bio: 'Passionate game developer exploring the AeThex ecosystem', + location: 'Digital Realm', + github_url: 'https://github.com/demo-developer', + twitter_url: 'https://twitter.com/demo_dev', + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), +}; + +const DEMO_PROJECTS: Project[] = [ + { + id: 'proj-1', + user_id: 'demo-user-123', + title: 'Quantum Quest', + description: 'A sci-fi adventure game built with AeThex Engine', + status: 'in_progress', + technologies: ['AeThex Engine', 'TypeScript', 'WebGL'], + github_url: 'https://github.com/demo/quantum-quest', + demo_url: 'https://quantum-quest-demo.com', + image_url: null, + start_date: '2024-01-15', + end_date: null, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + }, + { + id: 'proj-2', + user_id: 'demo-user-123', + title: 'Neon Runner', + description: 'Fast-paced endless runner with cyberpunk aesthetics', + status: 'completed', + technologies: ['AeThex Engine', 'JavaScript', 'CSS3'], + github_url: 'https://github.com/demo/neon-runner', + demo_url: 'https://neon-runner-demo.com', + image_url: null, + start_date: '2023-08-01', + end_date: '2023-12-15', + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + }, + { + id: 'proj-3', + user_id: 'demo-user-123', + title: 'Pixel Physics', + description: 'Educational physics simulation game', + status: 'planning', + technologies: ['AeThex Engine', 'React', 'Physics Engine'], + github_url: null, + demo_url: null, + image_url: null, + start_date: '2024-03-01', + end_date: null, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + }, +]; + +const DEMO_ACHIEVEMENTS: Achievement[] = [ + { + id: 'ach-1', + name: 'Welcome to AeThex', + description: 'Complete your profile setup', + icon: '🎉', + xp_reward: 100, + badge_color: '#10B981', + created_at: new Date().toISOString(), + }, + { + id: 'ach-2', + name: 'First Project', + description: 'Create your first project', + icon: '🚀', + xp_reward: 150, + badge_color: '#3B82F6', + created_at: new Date().toISOString(), + }, + { + id: 'ach-3', + name: 'Community Contributor', + description: 'Make your first community post', + icon: '💬', + xp_reward: 75, + badge_color: '#8B5CF6', + created_at: new Date().toISOString(), + }, + { + id: 'ach-4', + name: 'Experienced Developer', + description: 'Complete 5 projects', + icon: '👨‍💻', + xp_reward: 300, + badge_color: '#EF4444', + created_at: new Date().toISOString(), + }, +]; + +export class DemoStorageService { + // User Profile Management + static getUserProfile(): UserProfile | null { + const stored = localStorage.getItem(STORAGE_KEYS.USER_PROFILE); + return stored ? JSON.parse(stored) : DEMO_USER_PROFILE; + } + + static updateUserProfile(updates: Partial): UserProfile { + const current = this.getUserProfile() || DEMO_USER_PROFILE; + const updated = { ...current, ...updates, updated_at: new Date().toISOString() }; + localStorage.setItem(STORAGE_KEYS.USER_PROFILE, JSON.stringify(updated)); + return updated as UserProfile; + } + + // Projects Management + static getUserProjects(): Project[] { + const stored = localStorage.getItem(STORAGE_KEYS.PROJECTS); + return stored ? JSON.parse(stored) : DEMO_PROJECTS; + } + + static createProject(project: Omit): Project { + const projects = this.getUserProjects(); + const newProject: Project = { + ...project, + id: `proj-${Date.now()}`, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + }; + projects.unshift(newProject); + localStorage.setItem(STORAGE_KEYS.PROJECTS, JSON.stringify(projects)); + return newProject; + } + + static updateProject(projectId: string, updates: Partial): Project | null { + const projects = this.getUserProjects(); + const index = projects.findIndex(p => p.id === projectId); + if (index === -1) return null; + + projects[index] = { ...projects[index], ...updates, updated_at: new Date().toISOString() }; + localStorage.setItem(STORAGE_KEYS.PROJECTS, JSON.stringify(projects)); + return projects[index]; + } + + static deleteProject(projectId: string): boolean { + const projects = this.getUserProjects(); + const filtered = projects.filter(p => p.id !== projectId); + localStorage.setItem(STORAGE_KEYS.PROJECTS, JSON.stringify(filtered)); + return filtered.length < projects.length; + } + + // Achievements Management + static getAllAchievements(): Achievement[] { + return DEMO_ACHIEVEMENTS; + } + + static getUserAchievements(): Achievement[] { + const stored = localStorage.getItem(STORAGE_KEYS.ACHIEVEMENTS); + const earnedIds = stored ? JSON.parse(stored) : ['ach-1', 'ach-2', 'ach-3']; + return DEMO_ACHIEVEMENTS.filter(ach => earnedIds.includes(ach.id)); + } + + static awardAchievement(achievementId: string): void { + const stored = localStorage.getItem(STORAGE_KEYS.ACHIEVEMENTS); + const earnedIds = stored ? JSON.parse(stored) : ['ach-1', 'ach-2', 'ach-3']; + + if (!earnedIds.includes(achievementId)) { + earnedIds.push(achievementId); + localStorage.setItem(STORAGE_KEYS.ACHIEVEMENTS, JSON.stringify(earnedIds)); + + const achievement = DEMO_ACHIEVEMENTS.find(a => a.id === achievementId); + if (achievement) { + aethexToast.aethex({ + title: 'Achievement Unlocked!', + description: `${achievement.icon} ${achievement.name} - ${achievement.description}`, + duration: 8000, + }); + } + } + } + + // Interests Management + static getUserInterests(): string[] { + const stored = localStorage.getItem(STORAGE_KEYS.INTERESTS); + return stored ? JSON.parse(stored) : ['Game Development', 'AI/ML', 'Web3', 'Mobile Apps']; + } + + static updateUserInterests(interests: string[]): void { + localStorage.setItem(STORAGE_KEYS.INTERESTS, JSON.stringify(interests)); + } + + // Demo data initialization + static initializeDemoData(): void { + // Only initialize if no data exists + if (!localStorage.getItem(STORAGE_KEYS.USER_PROFILE)) { + localStorage.setItem(STORAGE_KEYS.USER_PROFILE, JSON.stringify(DEMO_USER_PROFILE)); + } + if (!localStorage.getItem(STORAGE_KEYS.PROJECTS)) { + localStorage.setItem(STORAGE_KEYS.PROJECTS, JSON.stringify(DEMO_PROJECTS)); + } + if (!localStorage.getItem(STORAGE_KEYS.ACHIEVEMENTS)) { + localStorage.setItem(STORAGE_KEYS.ACHIEVEMENTS, JSON.stringify(['ach-1', 'ach-2', 'ach-3'])); + } + if (!localStorage.getItem(STORAGE_KEYS.INTERESTS)) { + localStorage.setItem(STORAGE_KEYS.INTERESTS, JSON.stringify(['Game Development', 'AI/ML', 'Web3', 'Mobile Apps'])); + } + } + + // Clear all demo data + static clearDemoData(): void { + Object.values(STORAGE_KEYS).forEach(key => { + localStorage.removeItem(key); + }); + } +}