import { useState } from 'react' import { Settings, Heart, Edit2, Shield, Copy, Users } from 'lucide-react' import { updateProfile } from '../utils/api' import { hapticFeedback, showAlert } from '../utils/telegram' import { decodeHtmlEntities } from '../utils/htmlEntities' import ThemeToggle from '../components/ThemeToggle' import FollowListModal from '../components/FollowListModal' import './Profile.css' const DONATION_URL = 'https://donatepay.ru/don/1435720' const ALLOWED_SEARCH_PREFERENCES = ['furry', 'anime'] const normalizeSearchPreference = (value) => ALLOWED_SEARCH_PREFERENCES.includes(value) ? value : 'furry' const DEFAULT_SETTINGS = { whitelist: { noNSFW: true, // Скрыть гомосексуальный контент noHomo: true }, searchPreference: 'furry' } const normalizeSettings = (rawSettings = {}) => { const mergedWhitelist = { ...DEFAULT_SETTINGS.whitelist, ...(rawSettings.whitelist || {}) } return { ...DEFAULT_SETTINGS, ...rawSettings, whitelist: mergedWhitelist, searchPreference: normalizeSearchPreference(rawSettings.searchPreference) } } export default function Profile({ user, setUser }) { const [showSettings, setShowSettings] = useState(false) const [showEditBio, setShowEditBio] = useState(false) const [bio, setBio] = useState(user.bio || '') const [showFollowers, setShowFollowers] = useState(false) const [showFollowing, setShowFollowing] = useState(false) const [settings, setSettings] = useState(normalizeSettings(user.settings)) const [saving, setSaving] = useState(false) const handleSaveBio = async () => { try { setSaving(true) hapticFeedback('light') const updatedUser = await updateProfile({ bio }) setUser({ ...user, bio }) setShowEditBio(false) hapticFeedback('success') } catch (error) { console.error('Ошибка сохранения:', error) hapticFeedback('error') } finally { setSaving(false) } } const handleSaveSettings = async () => { try { setSaving(true) hapticFeedback('light') const normalizedSettings = normalizeSettings(settings) await updateProfile({ settings: normalizedSettings }) setUser({ ...user, settings: normalizedSettings }) setSettings(normalizedSettings) setShowSettings(false) hapticFeedback('success') } catch (error) { console.error('Ошибка сохранения:', error) hapticFeedback('error') } finally { setSaving(false) } } const handleDonate = () => { hapticFeedback('light') window.open(DONATION_URL, '_blank', 'noopener,noreferrer') } const updateWhitelistSetting = async (key, value) => { const updatedSettings = normalizeSettings({ ...settings, whitelist: { ...settings.whitelist, [key]: value } }) setSettings(updatedSettings) // Сохранить сразу на сервер try { await updateProfile({ settings: updatedSettings }) hapticFeedback('success') } catch (error) { console.error('Ошибка сохранения настроек:', error) hapticFeedback('error') } } const updateSearchPreference = (value) => { const updatedSettings = normalizeSettings({ ...settings, searchPreference: value }) setSettings(updatedSettings) } return (
{/* Хедер */}

Профиль

{/* Информация о пользователе */}
{user.username

{user.firstName || ''} {user.lastName || ''} {!user.firstName && !user.lastName && 'Пользователь'} {(user.role === 'moderator' || user.role === 'admin') && ( )}

@{user.username || user.firstName || 'user'}

{user.bio ? (

{decodeHtmlEntities(user.bio)}

) : ( )}
setShowFollowers(true)} style={{ cursor: 'pointer' }}> {user.followersCount || 0} Подписчики
setShowFollowing(true)} style={{ cursor: 'pointer' }}> {user.followingCount || 0} Подписки

Поддержите проект

Каждый взнос помогает развивать Nakama и запускать новые функции.

{/* Реферальная ссылка */} {user.referralCode && (

Пригласи друзей

Получи +1 к счетчику, когда приглашенный создаст первый пост

Приглашено: {user.referralsCount || 0}
{`https://t.me/${import.meta.env.VITE_TELEGRAM_BOT_NAME || 'NakamaSpaceBot'}?startapp=${user.referralCode}`}
)}
Powered by glpshcn \\ RBach \\ E621 \\ GelBooru
{/* Быстрые настройки */}

Быстрые настройки

Тема оформления
Светлая / Тёмная / Авто
Скрыть контент 18+
Не показывать посты с пометкой NSFW
Скрыть Homo
Не показывать посты с гомосексуальным контентом
{/* Модальное окно редактирования bio */} {showEditBio && (
setShowEditBio(false)}>
e.stopPropagation()}>

Описание профиля