diff --git a/web-react/src/pages/NewsFeed.jsx b/web-react/src/pages/NewsFeed.jsx index 57ffdc0..d59af4d 100644 --- a/web-react/src/pages/NewsFeed.jsx +++ b/web-react/src/pages/NewsFeed.jsx @@ -1,4 +1,5 @@ import React, { useState, useEffect, useCallback, useRef } from 'react' +import { useSearchParams } from 'react-router-dom' import { useTheme } from '../hooks/useTheme' import { getNews, getCategories, getTags, getArticle } from '../api/index' import NewsCard from '../components/NewsCard' @@ -19,6 +20,7 @@ function presetToDateFrom(preset) { export default function NewsFeed() { const { dark, toggle } = useTheme() + const [searchParams, setSearchParams] = useSearchParams() const [articles, setArticles] = useState([]) const [total, setTotal] = useState(0) const [categories, setCategories] = useState([]) @@ -26,15 +28,20 @@ export default function NewsFeed() { const [loading, setLoading] = useState(true) const [loadingMore, setLoadingMore] = useState(false) const [hasMore, setHasMore] = useState(false) - const [filters, setFilters] = useState({ category: [], tag: null, datePreset: '' }) + // Начальное состояние фильтров читаем из URL — ссылка открывает ленту с этими колледжами + const [filters, setFilters] = useState(() => ({ + category: (searchParams.get('category') || '').split(',').filter(Boolean), + tag: searchParams.get('tag') || null, + datePreset: searchParams.get('period') || '', + })) const offsetRef = useRef(0) const busyRef = useRef(false) const sentinelRef = useRef(null) - // Поиск с debounce - const [searchInput, setSearchInput] = useState('') - const [searchQuery, setSearchQuery] = useState('') + // Поиск с debounce (тоже инициализируется из URL) + const [searchInput, setSearchInput] = useState(() => searchParams.get('q') || '') + const [searchQuery, setSearchQuery] = useState(() => searchParams.get('q') || '') const debounceRef = useRef(null) const handleSearch = e => { @@ -68,6 +75,16 @@ export default function NewsFeed() { return params }, [filters, searchQuery]) + // Синхронизируем фильтры/поиск в URL, чтобы адрес можно было скопировать и расшарить + useEffect(() => { + const p = {} + if (filters.category.length) p.category = filters.category.join(',') + if (filters.tag) p.tag = filters.tag + if (filters.datePreset) p.period = filters.datePreset + if (searchQuery) p.q = searchQuery + setSearchParams(p, { replace: true }) + }, [filters, searchQuery, setSearchParams]) + // Сброс и первая загрузка при смене фильтров/поиска useEffect(() => { let cancelled = false