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)
|
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>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue