Update files
This commit is contained in:
parent
97f20486a1
commit
f7256b1dbb
|
|
@ -1,8 +1,11 @@
|
||||||
import { useState } from 'react'
|
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 { updateProfile } from '../utils/api'
|
||||||
import { hapticFeedback } from '../utils/telegram'
|
import { hapticFeedback } from '../utils/telegram'
|
||||||
import ThemeToggle from '../components/ThemeToggle'
|
import ThemeToggle from '../components/ThemeToggle'
|
||||||
|
import FollowListModal from '../components/FollowListModal'
|
||||||
|
import { decodeHtmlEntities } from '../utils/htmlEntities'
|
||||||
import './Profile.css'
|
import './Profile.css'
|
||||||
|
|
||||||
const DONATION_URL = 'https://donatepay.ru/don/1435720'
|
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 [bio, setBio] = useState(user.bio || '')
|
||||||
const [settings, setSettings] = useState(normalizeSettings(user.settings))
|
const [settings, setSettings] = useState(normalizeSettings(user.settings))
|
||||||
const [saving, setSaving] = useState(false)
|
const [saving, setSaving] = useState(false)
|
||||||
|
const [showFollowers, setShowFollowers] = useState(false)
|
||||||
|
const [showFollowing, setShowFollowing] = useState(false)
|
||||||
|
|
||||||
const handleSaveBio = async () => {
|
const handleSaveBio = async () => {
|
||||||
try {
|
try {
|
||||||
|
|
@ -110,6 +115,19 @@ export default function Profile({ user, setUser }) {
|
||||||
setSettings(updatedSettings)
|
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 (
|
return (
|
||||||
<div className="profile-page">
|
<div className="profile-page">
|
||||||
{/* Хедер */}
|
{/* Хедер */}
|
||||||
|
|
@ -140,7 +158,7 @@ export default function Profile({ user, setUser }) {
|
||||||
|
|
||||||
{user.bio ? (
|
{user.bio ? (
|
||||||
<div className="profile-bio">
|
<div className="profile-bio">
|
||||||
<p>{user.bio}</p>
|
<p>{decodeHtmlEntities(user.bio)}</p>
|
||||||
<button className="edit-bio-btn" onClick={() => setShowEditBio(true)}>
|
<button className="edit-bio-btn" onClick={() => setShowEditBio(true)}>
|
||||||
<Edit2 size={16} />
|
<Edit2 size={16} />
|
||||||
</button>
|
</button>
|
||||||
|
|
@ -154,18 +172,63 @@ export default function Profile({ user, setUser }) {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="profile-stats">
|
<div className="profile-stats">
|
||||||
<div className="stat-item">
|
<div
|
||||||
<span className="stat-value">{user.followersCount || 0}</span>
|
className="stat-item"
|
||||||
|
onClick={() => {
|
||||||
|
if (user.followers && user.followers.length > 0) {
|
||||||
|
setShowFollowers(true)
|
||||||
|
hapticFeedback('light')
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
style={{ cursor: (user.followers && user.followers.length > 0) ? 'pointer' : 'default' }}
|
||||||
|
>
|
||||||
|
<span className="stat-value">{user.followersCount || user.followers?.length || 0}</span>
|
||||||
<span className="stat-label">Подписчики</span>
|
<span className="stat-label">Подписчики</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="stat-divider" />
|
<div className="stat-divider" />
|
||||||
<div className="stat-item">
|
<div
|
||||||
<span className="stat-value">{user.followingCount || 0}</span>
|
className="stat-item"
|
||||||
|
onClick={() => {
|
||||||
|
if (user.following && user.following.length > 0) {
|
||||||
|
setShowFollowing(true)
|
||||||
|
hapticFeedback('light')
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
style={{ cursor: (user.following && user.following.length > 0) ? 'pointer' : 'default' }}
|
||||||
|
>
|
||||||
|
<span className="stat-value">{user.followingCount || user.following?.length || 0}</span>
|
||||||
<span className="stat-label">Подписки</span>
|
<span className="stat-label">Подписки</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Реферальная карточка */}
|
||||||
|
{user.referralCode && (
|
||||||
|
<div className="referral-card card">
|
||||||
|
<div className="referral-content">
|
||||||
|
<div className="referral-icon">
|
||||||
|
<UserPlus size={20} />
|
||||||
|
</div>
|
||||||
|
<div className="referral-text">
|
||||||
|
<h3>Реферальная программа</h3>
|
||||||
|
<p>Приглашайте друзей и получайте бонусы за каждого приглашенного пользователя!</p>
|
||||||
|
<div className="referral-stats">
|
||||||
|
Приглашено: <strong>{user.referralsCount || 0}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="referral-link-section">
|
||||||
|
<div className="referral-link">
|
||||||
|
<code>{`https://t.me/${import.meta.env.VITE_BOT_USERNAME || 'NakamaSpaceBot'}?startapp=ref_${user.referralCode}`}</code>
|
||||||
|
</div>
|
||||||
|
<button className="referral-copy-btn" onClick={handleCopyReferral}>
|
||||||
|
<Copy size={16} />
|
||||||
|
Скопировать ссылку
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
<div className="donation-card card">
|
<div className="donation-card card">
|
||||||
<div className="donation-content">
|
<div className="donation-content">
|
||||||
<div className="donation-icon">
|
<div className="donation-icon">
|
||||||
|
|
@ -334,6 +397,26 @@ export default function Profile({ user, setUser }) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Модалка подписчиков */}
|
||||||
|
{showFollowers && user && user.followers && (
|
||||||
|
<FollowListModal
|
||||||
|
users={user.followers}
|
||||||
|
title="Подписчики"
|
||||||
|
currentUser={user}
|
||||||
|
onClose={() => setShowFollowers(false)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Модалка подписок */}
|
||||||
|
{showFollowing && user && user.following && (
|
||||||
|
<FollowListModal
|
||||||
|
users={user.following}
|
||||||
|
title="Подписки"
|
||||||
|
currentUser={user}
|
||||||
|
onClose={() => setShowFollowing(false)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue