Update files
This commit is contained in:
parent
97f20486a1
commit
f7256b1dbb
|
|
@ -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 (
|
||||
<div className="profile-page">
|
||||
{/* Хедер */}
|
||||
|
|
@ -140,7 +158,7 @@ export default function Profile({ user, setUser }) {
|
|||
|
||||
{user.bio ? (
|
||||
<div className="profile-bio">
|
||||
<p>{user.bio}</p>
|
||||
<p>{decodeHtmlEntities(user.bio)}</p>
|
||||
<button className="edit-bio-btn" onClick={() => setShowEditBio(true)}>
|
||||
<Edit2 size={16} />
|
||||
</button>
|
||||
|
|
@ -154,18 +172,63 @@ export default function Profile({ user, setUser }) {
|
|||
</div>
|
||||
|
||||
<div className="profile-stats">
|
||||
<div className="stat-item">
|
||||
<span className="stat-value">{user.followersCount || 0}</span>
|
||||
<div
|
||||
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>
|
||||
</div>
|
||||
<div className="stat-divider" />
|
||||
<div className="stat-item">
|
||||
<span className="stat-value">{user.followingCount || 0}</span>
|
||||
<div
|
||||
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>
|
||||
</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-content">
|
||||
<div className="donation-icon">
|
||||
|
|
@ -334,6 +397,26 @@ export default function Profile({ user, setUser }) {
|
|||
</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>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue