From f7256b1dbbe67088c879bfa71553db6a5106f95f Mon Sep 17 00:00:00 2001 From: glpshchn <464976@niuitmo.ru> Date: Fri, 5 Dec 2025 00:56:22 +0300 Subject: [PATCH] Update files --- frontend/src/pages/Profile.jsx | 95 +++++++++++++++++++++++++++++++--- 1 file changed, 89 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/Profile.jsx b/frontend/src/pages/Profile.jsx index ab4c6c2..54d0300 100644 --- a/frontend/src/pages/Profile.jsx +++ b/frontend/src/pages/Profile.jsx @@ -1,8 +1,11 @@ import { useState } from 'react' -import { Settings, Heart, Edit2, Shield } from 'lucide-react' +import { Settings, Heart, Edit2, Shield, UserPlus, Copy } from 'lucide-react' +import { createPortal } from 'react-dom' import { updateProfile } from '../utils/api' import { hapticFeedback } from '../utils/telegram' import ThemeToggle from '../components/ThemeToggle' +import FollowListModal from '../components/FollowListModal' +import { decodeHtmlEntities } from '../utils/htmlEntities' import './Profile.css' const DONATION_URL = 'https://donatepay.ru/don/1435720' @@ -40,6 +43,8 @@ export default function Profile({ user, setUser }) { const [bio, setBio] = useState(user.bio || '') const [settings, setSettings] = useState(normalizeSettings(user.settings)) const [saving, setSaving] = useState(false) + const [showFollowers, setShowFollowers] = useState(false) + const [showFollowing, setShowFollowing] = useState(false) const handleSaveBio = async () => { try { @@ -110,6 +115,19 @@ export default function Profile({ user, setUser }) { setSettings(updatedSettings) } + const handleCopyReferral = () => { + const botUsername = import.meta.env.VITE_BOT_USERNAME || 'NakamaSpaceBot' + const referralLink = `https://t.me/${botUsername}?startapp=ref_${user.referralCode || user.id}` + + navigator.clipboard.writeText(referralLink).then(() => { + hapticFeedback('success') + alert('Реферальная ссылка скопирована!') + }).catch(() => { + hapticFeedback('error') + alert('Не удалось скопировать ссылку') + }) + } + return (
{/* Хедер */} @@ -140,7 +158,7 @@ export default function Profile({ user, setUser }) { {user.bio ? (
-

{user.bio}

+

{decodeHtmlEntities(user.bio)}

@@ -154,18 +172,63 @@ export default function Profile({ user, setUser }) {
-
- {user.followersCount || 0} +
{ + if (user.followers && user.followers.length > 0) { + setShowFollowers(true) + hapticFeedback('light') + } + }} + style={{ cursor: (user.followers && user.followers.length > 0) ? 'pointer' : 'default' }} + > + {user.followersCount || user.followers?.length || 0} Подписчики
-
- {user.followingCount || 0} +
{ + if (user.following && user.following.length > 0) { + setShowFollowing(true) + hapticFeedback('light') + } + }} + style={{ cursor: (user.following && user.following.length > 0) ? 'pointer' : 'default' }} + > + {user.followingCount || user.following?.length || 0} Подписки
+ {/* Реферальная карточка */} + {user.referralCode && ( +
+
+
+ +
+
+

Реферальная программа

+

Приглашайте друзей и получайте бонусы за каждого приглашенного пользователя!

+
+ Приглашено: {user.referralsCount || 0} +
+
+
+
+
+ {`https://t.me/${import.meta.env.VITE_BOT_USERNAME || 'NakamaSpaceBot'}?startapp=ref_${user.referralCode}`} +
+ +
+
+ )} +
@@ -334,6 +397,26 @@ export default function Profile({ user, setUser }) {
)} + + {/* Модалка подписчиков */} + {showFollowers && user && user.followers && ( + setShowFollowers(false)} + /> + )} + + {/* Модалка подписок */} + {showFollowing && user && user.following && ( + setShowFollowing(false)} + /> + )}
) }