diff --git a/frontend/src/components/CommentsModal.jsx b/frontend/src/components/CommentsModal.jsx index 377c93a..af0b5c0 100644 --- a/frontend/src/components/CommentsModal.jsx +++ b/frontend/src/components/CommentsModal.jsx @@ -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(
) : (
-
- {displayPost.author?.username { e.target.src = '/default-avatar.png' }} - /> -
-
- {displayPost.author?.firstName || ''} {displayPost.author?.lastName || ''} - {!displayPost.author?.firstName && !displayPost.author?.lastName && 'Пользователь'} + {displayPost.author && ( +
+ {displayPost.author?.username { e.target.src = '/default-avatar.png' }} + /> +
+
+ {displayPost.author?.firstName || ''} {displayPost.author?.lastName || ''} + {!displayPost.author?.firstName && !displayPost.author?.lastName && 'Пользователь'} +
+
@{displayPost.author?.username || displayPost.author?.firstName || 'user'}
-
@{displayPost.author?.username || displayPost.author?.firstName || 'user'}
-
+ )} {displayPost.content && (
{decodeHtmlEntities(displayPost.content)}