import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { motion } from 'framer-motion'; import { Camera, Trash2, LogOut, ArrowLeft, Settings, Eye, EyeOff } from 'lucide-react'; import { userService } from '../services/userService'; import type { UserUpdate } from '../services/userService'; import { useAuthStore } from '../store/authStore'; import { authService } from '../services/authService'; import miniLogo from '../assets/mini-logo.png'; import VerificationBanner from '../components/common/VerificationBanner'; export default function ProfilePage() { const navigate = useNavigate(); const user = useAuthStore((state) => state.user); const logout = useAuthStore((state) => state.logout); const [isEditing, setIsEditing] = useState(false); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); const [success, setSuccess] = useState(''); const [isChangingPassword, setIsChangingPassword] = useState(false); const [oldPassword, setOldPassword] = useState(''); const [newPassword, setNewPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [showOldPassword, setShowOldPassword] = useState(false); const [showNewPassword, setShowNewPassword] = useState(false); const [passwordError, setPasswordError] = useState(''); const [passwordSuccess, setPasswordSuccess] = useState(''); const [formData, setFormData] = useState({ display_name: user?.display_name || '', username: user?.username || '', description: user?.description || '', birth_day: user?.birth_day || '', }); useEffect(() => { if (user) { setFormData({ display_name: user.display_name || '', username: user.username, description: user.description || '', birth_day: user.birth_day || '', }); } }, [user]); const handleAvatarUpload = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; try { setIsLoading(true); const updatedUser = await userService.uploadAvatar(file); useAuthStore.getState().setUser(updatedUser); setSuccess('Аватар успешно загружен'); setTimeout(() => setSuccess(''), 3000); } catch (err: any) { setError(err.response?.data?.detail || 'Ошибка загрузки аватара'); } finally { setIsLoading(false); } }; const handleDeleteAvatar = async () => { if (!confirm('Удалить аватар?')) return; try { setIsLoading(true); await userService.deleteAvatar(); const updatedUser = await userService.getCurrentUser(); useAuthStore.getState().setUser(updatedUser); setSuccess('Аватар удален'); setTimeout(() => setSuccess(''), 3000); } catch (err: any) { setError(err.response?.data?.detail || 'Ошибка удаления аватара'); } finally { setIsLoading(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setSuccess(''); setIsLoading(true); try { const updatedUser = await userService.updateProfile(formData); useAuthStore.getState().setUser(updatedUser); setSuccess('Профиль обновлен'); setIsEditing(false); setTimeout(() => setSuccess(''), 3000); } catch (err: any) { setError(err.response?.data?.detail || 'Ошибка обновления профиля'); } finally { setIsLoading(false); } }; const handleLogout = async () => { logout(); navigate('/auth'); }; const handleDeleteAccount = async () => { if (!confirm('Вы уверены? Это действие необратимо!')) return; try { await userService.deleteAccount(); logout(); navigate('/auth'); } catch (err: any) { setError(err.response?.data?.detail || 'Ошибка удаления аккаунта'); } }; const handleChangePassword = async (e: React.FormEvent) => { e.preventDefault(); setPasswordError(''); setPasswordSuccess(''); if (newPassword !== confirmPassword) { setPasswordError('Пароли не совпадают'); return; } if (newPassword.length < 8) { setPasswordError('Пароль должен быть минимум 8 символов'); return; } setIsLoading(true); try { await authService.changePassword(oldPassword, newPassword); setPasswordSuccess('Пароль успешно изменен'); setOldPassword(''); setNewPassword(''); setConfirmPassword(''); setIsChangingPassword(false); setTimeout(() => setPasswordSuccess(''), 3000); } catch (err: any) { setPasswordError(err.response?.data?.detail || 'Ошибка изменения пароля'); } finally { setIsLoading(false); } }; if (!user) return null; return (
{/* Header */}
{/* Verification Banner */} {!user.is_verified && ( )} {/* Profile Card */} {/* Avatar Section */}
{!user.avatar_url && ( Avatar )}
{user.avatar_url && ( )}

{user.username}

{user.email}

{/* Profile Form */}
setFormData({ ...formData, display_name: e.target.value })} disabled={!isEditing} className="w-full px-4 py-3 rounded-xl font-inter transition-all" style={{ backgroundColor: isEditing ? 'var(--bg-input)' : 'var(--bg-input-disabled)', color: 'var(--text-primary)', border: '2px solid transparent', }} />
setFormData({ ...formData, username: e.target.value })} disabled={!isEditing} className="w-full px-4 py-3 rounded-xl font-inter transition-all" style={{ backgroundColor: isEditing ? 'var(--bg-input)' : 'var(--bg-input-disabled)', color: 'var(--text-primary)', border: '2px solid transparent', }} />
setFormData({ ...formData, birth_day: e.target.value })} disabled={!isEditing} className="w-full px-4 py-3 rounded-xl font-inter transition-all" style={{ backgroundColor: isEditing ? 'var(--bg-input)' : 'var(--bg-input-disabled)', color: 'var(--text-primary)', border: '2px solid transparent', }} />