import React, { useEffect, useState } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { StorageService } from '../services/storageService'; import { UserProfile } from '../types'; import { Loader2, ArrowLeft, Trophy, Shield, Calendar, Users, MapPin, Briefcase, GraduationCap, UserPlus, CheckCircle, UserCheck, Quote } from 'lucide-react'; import { Button } from '../components/ui/Button'; // Reusing theme configs to apply them locally const THEMES: Record; uiMode: 'light' | 'dark' | 'auto'; bgPattern?: string; bgColor: string; darkBgColor?: string; darkBgPattern?: string; }> = { 'default': { uiMode: 'auto', bgColor: '#fdfbf7', darkBgColor: '#09090b', bgPattern: "radial-gradient(circle at 0% 0%, rgba(255, 200, 150, 0.15) 0%, transparent 50%), radial-gradient(circle at 100% 100%, rgba(255, 100, 100, 0.1) 0%, transparent 50%)", darkBgPattern: "radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.03) 0%, transparent 50%)", colors: {} }, 'theme_royal': { uiMode: 'dark', bgColor: '#1a0b2e', bgPattern: "radial-gradient(circle at 50% 0%, #581c87 0%, transparent 70%), radial-gradient(circle at 100% 100%, #3b0764 0%, transparent 50%)", colors: { '--color-red-600': '#c084fc', '--color-red-700': '#d8b4fe' }, }, 'theme_nature': { uiMode: 'auto', bgColor: '#f0fdf4', darkBgColor: '#022c22', bgPattern: "radial-gradient(circle at 0% 100%, rgba(34, 197, 94, 0.1) 0%, transparent 40%), url('https://www.transparenttextures.com/patterns/leaves.png')", darkBgPattern: "radial-gradient(circle at 0% 100%, rgba(34, 197, 94, 0.05) 0%, transparent 40%)", colors: { '--color-red-600': '#16a34a' }, }, 'theme_ocean': { uiMode: 'auto', bgColor: '#eff6ff', darkBgColor: '#0f172a', bgPattern: "radial-gradient(circle at 100% 0%, rgba(59, 130, 246, 0.1) 0%, transparent 60%), url('https://www.transparenttextures.com/patterns/cubes.png')", darkBgPattern: "radial-gradient(circle at 100% 0%, rgba(59, 130, 246, 0.05) 0%, transparent 60%)", colors: { '--color-red-600': '#2563eb' }, }, 'theme_midnight': { uiMode: 'dark', bgColor: '#020617', bgPattern: "radial-gradient(circle at 50% 50%, rgba(99, 102, 241, 0.15) 0%, transparent 60%), radial-gradient(circle, rgba(255,255,255,0.05) 1px, transparent 1px) 0 0/30px 30px", colors: { '--color-red-600': '#4f46e5' }, }, 'theme_sky': { uiMode: 'light', bgColor: '#f0f9ff', bgPattern: "linear-gradient(180deg, #e0f2fe 0%, #f0f9ff 100%)", colors: { '--color-red-600': '#0891b2' }, }, }; const getFrameStyle = (id?: string) => { if (!id || id === 'none') return 'ring-4 ring-white/50'; if (id === 'unicorn') return 'ring-4 ring-pink-400 shadow-[0_0_20px_#f472b6]'; if (id === 'royal') return 'ring-4 ring-yellow-500 shadow-[0_0_20px_#eab308]'; if (id === 'nature') return 'ring-4 ring-green-500'; if (id === 'dark') return 'ring-4 ring-gray-800 shadow-[0_0_20px_#000]'; return 'ring-4 ring-indigo-400'; }; const PublicProfile: React.FC = () => { const { userId } = useParams<{ userId: string }>(); const navigate = useNavigate(); const [user, setUser] = useState(null); const [currentUser, setCurrentUser] = useState(null); const [loading, setLoading] = useState(true); const [friendStatus, setFriendStatus] = useState<'none' | 'sent' | 'friends' | 'received'>('none'); useEffect(() => { const fetchUser = async () => { if (userId) { const [targetUser, me] = await Promise.all([ StorageService.getUserPublicProfile(userId), StorageService.getProfile() ]); setUser(targetUser); setCurrentUser(me); if (targetUser && me) { if (me.friends?.includes(targetUser.id)) setFriendStatus('friends'); else if (me.sentRequests?.includes(targetUser.id)) setFriendStatus('sent'); else if (me.friendRequests?.includes(targetUser.id)) setFriendStatus('received'); else setFriendStatus('none'); } } setLoading(false); }; fetchUser(); }, [userId]); // Apply User's Theme Effect useEffect(() => { if (!user) return; const themeId = user.activeTheme || 'default'; const themeConfig = THEMES[themeId] || THEMES['default']; const root = document.documentElement; const body = document.body; // Save previous state to restore const prevBgColor = body.style.backgroundColor; const prevBgImage = body.style.backgroundImage; const prevDataTheme = body.getAttribute('data-theme'); // Apply new theme body.setAttribute('data-theme', themeId); body.setAttribute('data-theme-override', 'true'); // Flag to prevent Layout from overwriting immediately // Mode let isDark = false; if (themeConfig.uiMode !== 'auto') { isDark = themeConfig.uiMode === 'dark'; } else { // Use system pref if auto isDark = window.matchMedia('(prefers-color-scheme: dark)').matches; } if (isDark) root.classList.add('dark'); else root.classList.remove('dark'); // Backgrounds const bgColor = (isDark && themeConfig.darkBgColor) ? themeConfig.darkBgColor : themeConfig.bgColor; const bgPattern = (isDark && themeConfig.darkBgPattern !== undefined) ? themeConfig.darkBgPattern : (themeConfig.bgPattern || 'none'); body.style.backgroundColor = bgColor; body.style.backgroundImage = bgPattern; // Apply colors const appliedProps: string[] = []; Object.entries(themeConfig.colors).forEach(([key, value]) => { root.style.setProperty(key, value); appliedProps.push(key); }); // Cleanup on Unmount return () => { body.removeAttribute('data-theme-override'); // We trigger a global event to let Layout.tsx re-apply the logged-in user's theme window.dispatchEvent(new Event('rudraksha-profile-update')); // Clean up explicit props if needed, though Layout will likely overwrite them appliedProps.forEach(k => root.style.removeProperty(k)); }; }, [user]); const handleFriendRequest = async () => { if (!user) return; setFriendStatus('sent'); await StorageService.sendFriendRequest(user.id); }; const handleAcceptRequest = async () => { if (!user) return; setFriendStatus('friends'); await StorageService.acceptFriendRequest(user.id); }; if (loading) return
; if (!user) return
User not found
; return (
{/* Back Button */}
{/* Hero Section */}
{user.bannerUrl ? ( Banner ) : (
)}
{/* Avatar */}
{user.name}

{user.name}

@{user.username || 'user'}

{user.role} {user.schoolName && ( {user.schoolName} )}
{/* Friend Action */}
{friendStatus === 'none' && currentUser && user.id !== currentUser.id ? ( ) : friendStatus === 'sent' ? ( ) : friendStatus === 'received' ? ( ) : friendStatus === 'friends' ? ( ) : null}
{/* Stats */}

{user.points}

Karma

{Math.floor((user.xp || 0) / 500) + 1}

Level

{/* Content Body - Consolidated "About" with Bio */}

Personal Profile

{user.bio && (

"{user.bio}"

)}

Role

{user.profession || user.role}

{user.grade && (

Class

{user.grade}

)}

Joined

2024

); }; export default PublicProfile;