import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { familyApi, userApi, authApi } from '../api/client'; import { useStore } from '../store/useStore'; import type { Theme } from '../types'; import { User as UserIcon, Users, Settings, AlertTriangle, ArrowLeft, Loader2, Check, Palette, Languages, LogOut, Edit3, Save, X, } from 'lucide-react'; const THEMES: { id: Theme; gradient: string }[] = [ { id: 'light', gradient: 'bg-gradient-to-r from-gray-100 to-gray-200' }, { id: 'dark', gradient: 'bg-gradient-to-r from-black to-gray-900' }, { id: 'sunset', gradient: 'bg-gradient-to-r from-orange-400 to-pink-500' }, { id: 'ocean', gradient: 'bg-gradient-to-r from-blue-400 to-cyan-500' }, { id: 'forest', gradient: 'bg-gradient-to-r from-green-400 to-teal-500' }, { id: 'purple', gradient: 'bg-gradient-to-r from-purple-500 to-pink-500' }, ]; export default function Profile() { const { t, i18n } = useTranslation(); const navigate = useNavigate(); const { user, selectedFamily, setSelectedFamily, setUser, preferences, setPreferences, familyMembers, setFamilyMembers } = useStore(); const [membersLoading, setMembersLoading] = useState(false); const [leavingFamily, setLeavingFamily] = useState(false); const [editingName, setEditingName] = useState(false); const [newFamilyName, setNewFamilyName] = useState(''); const [savingName, setSavingName] = useState(false); useEffect(() => { if (user?.family_id) { loadFamily(); } }, [user?.family_id]); useEffect(() => { if (user?.family_id && selectedFamily) { loadMembers(); } }, [user?.family_id, selectedFamily]); const loadFamily = async () => { if (!user?.family_id) return; try { const response = await familyApi.getById(user.family_id); setSelectedFamily(response.data); } catch (err) { console.error('Error loading family:', err); } }; const loadMembers = async () => { if (!user?.family_id) return; try { setMembersLoading(true); const response = await familyApi.getMembers(user.family_id); console.log('Loaded members:', response.data); setFamilyMembers(response.data); } catch (err) { console.error('Error loading members:', err); } finally { setMembersLoading(false); } }; const handleLeaveFamily = async () => { if (!confirm(t('profile.leaveConfirm'))) return; try { setLeavingFamily(true); await userApi.leaveFamily(); const meResponse = await authApi.me(); setUser(meResponse.data); setSelectedFamily(null); setFamilyMembers([]); navigate('/'); } catch (err) { console.error('Error leaving family:', err); alert(t('profile.leaveError')); } finally { setLeavingFamily(false); } }; const handleThemeChange = (theme: Theme) => { setPreferences({ theme }); document.documentElement.setAttribute('data-theme', theme); }; const handleLocaleChange = (locale: 'ru' | 'en') => { setPreferences({ locale }); i18n.changeLanguage(locale); }; const handleStartEditName = () => { setNewFamilyName(selectedFamily?.name || ''); setEditingName(true); }; const handleSaveName = async () => { if (!selectedFamily || !newFamilyName.trim()) return; try { setSavingName(true); const response = await familyApi.update(selectedFamily.id, { name: newFamilyName.trim() }); setSelectedFamily(response.data); setEditingName(false); } catch (err) { console.error('Error updating family name:', err); alert(t('profile.renameError')); } finally { setSavingName(false); } }; const handleBack = () => { if (user?.family_id) { navigate(`/family/${user.family_id}`); } else { navigate('/'); } }; return (

{t('profile.title')}

{t('profile.info')}

{t('profile.username')} {user?.username || '-'}
{t('profile.email')} {user?.email || '-'}
{selectedFamily && (

{t('profile.family')}

{t('profile.familyName')} {editingName ? (
setNewFamilyName(e.target.value)} className="px-3 py-1 border border-gray-300 rounded-lg focus:border-purple-500 focus:ring-1 focus:ring-purple-200" autoFocus />
) : (
{selectedFamily.name}
)}

{t('profile.members')}

{membersLoading ? (
) : familyMembers.length === 0 ? (
{t('profile.noMembers') || 'Нет участников'}
) : (
{familyMembers.map((member) => (
{(member.username || member.email || '?')[0].toUpperCase()}
{member.username || member.email || t('profile.unknownUser')} {member.id === user?.id && ( {t('profile.you')} )}
{member.is_admin && ( Admin )}
))}
)}
)}

{t('profile.settings')}

{t('profile.language')}

{t('profile.theme')}

{THEMES.map((theme) => ( ))}
{selectedFamily && (

{t('profile.dangerZone')}

{t('profile.leaveDescription')}

)}
); }