import { useEffect, useState } from 'react'; import { Link, useNavigate, useSearchParams, useLocation, useParams } from 'react-router-dom'; import type { Feed, Category } from '../types'; import './FeedList.css'; export default function FeedList() { const [feeds, setFeeds] = useState([]); const [tags, setTags] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [searchQuery, setSearchQuery] = useState(''); const navigate = useNavigate(); const [searchParams] = useSearchParams(); const location = useLocation(); const { feedId, tagName } = useParams(); const currentFilter = searchParams.get('filter') || (location.pathname === '/' && !feedId && !tagName ? 'unread' : ''); const handleSearch = (e: React.FormEvent) => { e.preventDefault(); if (searchQuery.trim()) { navigate(`/?q=${encodeURIComponent(searchQuery.trim())}`); } }; useEffect(() => { Promise.all([ fetch('/api/feed/').then(res => { if (!res.ok) throw new Error('Failed to fetch feeds'); return res.json(); }), fetch('/api/tag').then(res => { if (!res.ok) throw new Error('Failed to fetch tags'); return res.json(); }) ]) .then(([feedsData, tagsData]) => { setFeeds(feedsData); setTags(tagsData); setLoading(false); }) .catch((err) => { setError(err.message); setLoading(false); }); }, []); if (loading) return
Loading feeds...
; if (error) return
Error: {error}
; return (
setSearchQuery(e.target.value)} className="search-input" />
  • Unread
  • All
  • Starred

Feeds

{feeds.length === 0 ? (

No feeds found.

) : (
    {feeds.map((feed) => (
  • {feed.title || feed.url} {feed.category && {feed.category}}
  • ))}
)}
{tags && tags.length > 0 && (

Tags

    {tags.map((tag) => (
  • {tag.title}
  • ))}
)}
); }