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