Update files
This commit is contained in:
parent
430d585871
commit
458c7fadc8
|
|
@ -15,11 +15,13 @@ export default function CommentsModal({ post, onClose, onUpdate }) {
|
|||
const [loadingPost, setLoadingPost] = useState(false)
|
||||
|
||||
// Загрузить полные данные поста с комментариями
|
||||
// ВАЖНО: useEffect всегда вызывается, даже если post отсутствует
|
||||
useEffect(() => {
|
||||
// Если пост не передан, очищаем состояние и выходим
|
||||
if (!post || !post._id) {
|
||||
// Если пост не передан, очищаем состояние
|
||||
setFullPost(null)
|
||||
setComments([])
|
||||
setLoadingPost(false)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -31,6 +33,8 @@ export default function CommentsModal({ post, onClose, onUpdate }) {
|
|||
setComments(initialComments)
|
||||
|
||||
// Затем загрузим полные данные для обновления
|
||||
let cancelled = false
|
||||
|
||||
const loadFullPost = async () => {
|
||||
try {
|
||||
setLoadingPost(true)
|
||||
|
|
@ -40,6 +44,9 @@ export default function CommentsModal({ post, onClose, onUpdate }) {
|
|||
? await getPosts({ userId: authorId, limit: 100 })
|
||||
: await getPosts({ limit: 200 })
|
||||
|
||||
// Проверяем, что запрос не был отменен
|
||||
if (cancelled) return
|
||||
|
||||
const foundPost = response.posts?.find(p => p._id === post._id)
|
||||
if (foundPost) {
|
||||
// Проверяем, что комментарии populate'ены с авторами
|
||||
|
|
@ -53,28 +60,26 @@ export default function CommentsModal({ post, onClose, onUpdate }) {
|
|||
console.error('[CommentsModal] Ошибка загрузки поста:', error)
|
||||
// Оставляем переданные данные
|
||||
} finally {
|
||||
setLoadingPost(false)
|
||||
if (!cancelled) {
|
||||
setLoadingPost(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loadFullPost()
|
||||
}, [post?._id]) // Только ID поста в зависимостях
|
||||
|
||||
// Cleanup функция для отмены запроса при размонтировании
|
||||
return () => {
|
||||
cancelled = true
|
||||
}
|
||||
}, [post?._id || null]) // Только ID поста в зависимостях, используем null для стабильности
|
||||
|
||||
// Проверка на существование поста ПОСЛЕ хуков
|
||||
if (!post || !post._id) {
|
||||
return null
|
||||
}
|
||||
|
||||
const displayPost = fullPost || post
|
||||
|
||||
// Дополнительная проверка на наличие автора
|
||||
if (!displayPost.author) {
|
||||
console.warn('[CommentsModal] Пост без автора:', displayPost._id)
|
||||
return null
|
||||
}
|
||||
const hasValidPost = post && post._id && displayPost && displayPost.author
|
||||
|
||||
const handleSubmit = async () => {
|
||||
if (!comment.trim() || loading) return
|
||||
if (!comment.trim() || loading || !post || !post._id) return
|
||||
|
||||
try {
|
||||
setLoading(true)
|
||||
|
|
@ -137,6 +142,11 @@ export default function CommentsModal({ post, onClose, onUpdate }) {
|
|||
}
|
||||
}
|
||||
|
||||
// Если нет валидного поста, не рендерим модалку вообще
|
||||
if (!hasValidPost) {
|
||||
return null
|
||||
}
|
||||
|
||||
return createPortal(
|
||||
<div
|
||||
className="comments-modal-overlay"
|
||||
|
|
@ -164,21 +174,23 @@ export default function CommentsModal({ post, onClose, onUpdate }) {
|
|||
</div>
|
||||
) : (
|
||||
<div className="post-preview">
|
||||
<div className="preview-author">
|
||||
<img
|
||||
src={displayPost.author?.photoUrl || '/default-avatar.png'}
|
||||
alt={displayPost.author?.username || displayPost.author?.firstName || 'User'}
|
||||
className="preview-avatar"
|
||||
onError={(e) => { e.target.src = '/default-avatar.png' }}
|
||||
/>
|
||||
<div>
|
||||
<div className="preview-name">
|
||||
{displayPost.author?.firstName || ''} {displayPost.author?.lastName || ''}
|
||||
{!displayPost.author?.firstName && !displayPost.author?.lastName && 'Пользователь'}
|
||||
{displayPost.author && (
|
||||
<div className="preview-author">
|
||||
<img
|
||||
src={displayPost.author?.photoUrl || '/default-avatar.png'}
|
||||
alt={displayPost.author?.username || displayPost.author?.firstName || 'User'}
|
||||
className="preview-avatar"
|
||||
onError={(e) => { e.target.src = '/default-avatar.png' }}
|
||||
/>
|
||||
<div>
|
||||
<div className="preview-name">
|
||||
{displayPost.author?.firstName || ''} {displayPost.author?.lastName || ''}
|
||||
{!displayPost.author?.firstName && !displayPost.author?.lastName && 'Пользователь'}
|
||||
</div>
|
||||
<div className="preview-username">@{displayPost.author?.username || displayPost.author?.firstName || 'user'}</div>
|
||||
</div>
|
||||
<div className="preview-username">@{displayPost.author?.username || displayPost.author?.firstName || 'user'}</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{displayPost.content && (
|
||||
<div className="preview-content">{decodeHtmlEntities(displayPost.content)}</div>
|
||||
|
|
|
|||
Loading…
Reference in New Issue