import { useState, useEffect } from 'react' import { useSearchParams, useNavigate } from 'react-router-dom' import { getPosts, getPost } from '../utils/api' import PostCard from '../components/PostCard' import CreatePostModal from '../components/CreatePostModal' import { Plus, Settings } from 'lucide-react' import { hapticFeedback } from '../utils/telegram' import './Feed.css' export default function Feed({ user }) { const [searchParams] = useSearchParams() const navigate = useNavigate() const [posts, setPosts] = useState([]) const [loading, setLoading] = useState(true) const [showCreateModal, setShowCreateModal] = useState(false) const [filter, setFilter] = useState('all') const [page, setPage] = useState(1) const [hasMore, setHasMore] = useState(true) const [highlightPostId, setHighlightPostId] = useState(null) useEffect(() => { // Проверить параметр post в URL const postId = searchParams.get('post') if (postId) { setHighlightPostId(postId) // Загрузить конкретный пост если его нет в списке loadSpecificPost(postId) } else { loadPosts() } // eslint-disable-next-line react-hooks/exhaustive-deps }, [filter, searchParams]) const loadSpecificPost = async (postId) => { try { // Сначала проверить, есть ли пост уже в загруженных const existingPost = posts.find(p => p._id === postId) if (existingPost) { // Если пост уже загружен, просто прокрутить к нему setTimeout(() => { const element = document.getElementById(`post-${postId}`) if (element) { element.scrollIntoView({ behavior: 'smooth', block: 'center' }) } }, 100) return } // Попытаться загрузить конкретный пост по ID try { const foundPost = await getPost(postId) if (foundPost) { // Если пост найден, добавить его в начало списка setPosts(prev => { const filtered = prev.filter(p => p._id !== postId) return [foundPost, ...filtered] }) // Прокрутить к посту после загрузки setTimeout(() => { const element = document.getElementById(`post-${postId}`) if (element) { element.scrollIntoView({ behavior: 'smooth', block: 'center' }) } }, 100) return } } catch (postError) { console.error('Ошибка загрузки конкретного поста:', postError) // Если не удалось загрузить конкретный пост, попробуем найти в ленте } // Если пост не найден напрямую, загрузить ленту и попытаться найти там const data = await getPosts({ filter, page: 1 }) const foundInFeed = data.posts.find(p => p._id === postId) if (foundInFeed) { setPosts(prev => { const filtered = prev.filter(p => p._id !== postId) return [foundInFeed, ...filtered] }) setTimeout(() => { const element = document.getElementById(`post-${postId}`) if (element) { element.scrollIntoView({ behavior: 'smooth', block: 'center' }) } }, 100) } else { // Если пост не найден, загрузить все посты await loadPosts() } } catch (error) { console.error('Ошибка загрузки поста:', error) await loadPosts() } } const loadPosts = async (pageNum = 1) => { try { setLoading(true) const params = { filter: filter, // 'all', 'interests', 'following' page: pageNum } const data = await getPosts(params) // Фильтруем посты без автора (защита от ошибок) const validPosts = data.posts.filter(post => post.author) if (pageNum === 1) { setPosts(validPosts) } else { setPosts(prev => [...prev, ...validPosts]) } setHasMore(pageNum < data.totalPages) setPage(pageNum) } catch (error) { console.error('Ошибка загрузки постов:', error) } finally { setLoading(false) } } const handleCreatePost = () => { hapticFeedback('light') setShowCreateModal(true) } const handlePostCreated = (newPost) => { setPosts(prev => [newPost, ...prev]) setShowCreateModal(false) } const handleLoadMore = () => { if (!loading && hasMore) { loadPosts(page + 1) } } return (
{/* Хедер */}

Nakama

{/* Фильтры */}
{/* Посты */}
{loading && posts.length === 0 ? (
) : posts.length === 0 ? (
{filter === 'interests' ? ( <>

Нет постов по вашим интересам

Проверьте выбранные теги в настройках профиля

) : filter === 'following' ? ( <>

Нет постов от подписок

Подпишитесь на пользователей, чтобы видеть их посты здесь

) : ( <>

Пока нет постов

)}
) : ( <> {posts.map(post => (
))} {hasMore && ( )} )}
{/* Модальное окно создания поста */} {showCreateModal && ( setShowCreateModal(false)} onPostCreated={handlePostCreated} /> )}
) }