nakama/frontend/src/components/PostMenu.jsx

117 lines
3.6 KiB
React
Raw Normal View History

2025-11-03 20:35:01 +00:00
import { X, Trash2, AlertCircle, Flag } from 'lucide-react'
import { useState } from 'react'
import { reportPost } from '../utils/api'
import { hapticFeedback, showConfirm } from '../utils/telegram'
import './PostMenu.css'
export default function PostMenu({ post, currentUser, onClose, onDelete }) {
const [showReportModal, setShowReportModal] = useState(false)
const [reportReason, setReportReason] = useState('')
const [submitting, setSubmitting] = useState(false)
const isOwnPost = post.author._id === currentUser.id
const isModerator = currentUser.role === 'moderator' || currentUser.role === 'admin'
const handleReport = async () => {
if (!reportReason.trim()) {
alert('Укажите причину жалобы')
return
}
try {
setSubmitting(true)
hapticFeedback('light')
await reportPost(post._id, reportReason)
hapticFeedback('success')
alert('Жалоба отправлена')
onClose()
} catch (error) {
console.error('Ошибка отправки жалобы:', error)
hapticFeedback('error')
alert('Ошибка отправки жалобы')
} finally {
setSubmitting(false)
}
}
if (showReportModal) {
2025-11-03 22:41:34 +00:00
const handleReportOverlayClick = (e) => {
if (e.target === e.currentTarget) {
setShowReportModal(false)
}
}
2025-11-03 20:35:01 +00:00
return (
2025-11-03 22:41:34 +00:00
<div className="report-modal-overlay" onClick={handleReportOverlayClick}>
<div className="report-modal-header" onClick={(e) => e.stopPropagation()}>
2025-11-03 21:57:35 +00:00
<button className="menu-close-btn" onClick={onClose}>
<X size={24} />
</button>
<h2>Пожаловаться</h2>
<button
className="submit-btn"
onClick={handleReport}
disabled={submitting || !reportReason.trim()}
>
{submitting ? 'Отправка...' : 'Отправить'}
</button>
</div>
2025-11-03 20:35:01 +00:00
2025-11-03 22:41:34 +00:00
<div className="report-modal-body" onClick={(e) => e.stopPropagation()}>
2025-11-03 21:57:35 +00:00
<textarea
placeholder="Опишите причину жалобы..."
value={reportReason}
onChange={e => setReportReason(e.target.value)}
maxLength={500}
autoFocus
/>
2025-11-03 20:35:01 +00:00
</div>
</div>
)
}
2025-11-03 22:41:34 +00:00
const handleOverlayClick = (e) => {
// Закрывать только при клике на overlay, не на контент
if (e.target === e.currentTarget) {
onClose()
}
}
2025-11-03 20:35:01 +00:00
return (
2025-12-04 20:11:28 +00:00
<div
className="post-menu-overlay"
onMouseDown={(e) => e.stopPropagation()}
onTouchStart={(e) => e.stopPropagation()}
onClick={handleOverlayClick}
>
2025-11-03 22:41:34 +00:00
<div className="menu-header" onClick={(e) => e.stopPropagation()}>
2025-11-03 21:57:35 +00:00
<button className="menu-close-btn" onClick={onClose}>
<X size={24} />
</button>
<h2>Действия</h2>
<div style={{ width: 40 }} />
</div>
2025-11-03 22:41:34 +00:00
<div className="menu-items" onClick={(e) => e.stopPropagation()}>
2025-11-03 20:35:01 +00:00
{isOwnPost || isModerator ? (
<button className="menu-item danger" onClick={onDelete}>
<Trash2 size={20} />
<span>Удалить пост</span>
</button>
) : (
<button className="menu-item" onClick={() => setShowReportModal(true)}>
<Flag size={20} />
<span>Пожаловаться</span>
</button>
)}
<button className="menu-item" onClick={onClose}>
<X size={20} />
<span>Отмена</span>
</button>
</div>
</div>
)
}