Update files

This commit is contained in:
glpshchn 2025-12-05 00:36:49 +03:00
parent 430d585871
commit 458c7fadc8
1 changed files with 39 additions and 27 deletions

View File

@ -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 {
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,6 +174,7 @@ export default function CommentsModal({ post, onClose, onUpdate }) {
</div>
) : (
<div className="post-preview">
{displayPost.author && (
<div className="preview-author">
<img
src={displayPost.author?.photoUrl || '/default-avatar.png'}
@ -179,6 +190,7 @@ export default function CommentsModal({ post, onClose, onUpdate }) {
<div className="preview-username">@{displayPost.author?.username || displayPost.author?.firstName || 'user'}</div>
</div>
</div>
)}
{displayPost.content && (
<div className="preview-content">{decodeHtmlEntities(displayPost.content)}</div>