diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 9d01031..f17fb27 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,5 +1,4 @@ import { Link, Route, Routes, useLocation } from "react-router-dom"; -import CategoryList from "./components/CategoryList"; import EpisodeDetail from "./components/EpisodeDetail"; import EpisodeList from "./components/EpisodeList"; import FeedDetail from "./components/FeedDetail"; @@ -12,7 +11,6 @@ function App() { const isMainPage = [ "/", "/feeds", - "/categories", "/feed-requests", "/rss-endpoints", ].includes(location.pathname); @@ -41,12 +39,6 @@ function App() { > フィード一覧 - - カテゴリ一覧 - } /> } /> - } /> } /> } /> } /> diff --git a/frontend/src/components/CategoryList.tsx b/frontend/src/components/CategoryList.tsx deleted file mode 100644 index b6b5e8a..0000000 --- a/frontend/src/components/CategoryList.tsx +++ /dev/null @@ -1,392 +0,0 @@ -import { useEffect, useState } from "react"; -import { Link } from "react-router-dom"; - -interface Feed { - id: string; - url: string; - title?: string; - description?: string; - category?: string; - lastUpdated?: string; - createdAt: string; - active: boolean; -} - -interface CategoryGroup { - [category: string]: Feed[]; -} - -function CategoryList() { - const [groupedFeeds, setGroupedFeeds] = useState({}); - const [selectedCategory, setSelectedCategory] = useState(null); - const [filteredFeeds, setFilteredFeeds] = useState([]); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - fetchCategoriesAndFeeds(); - }, []); - - useEffect(() => { - if (selectedCategory && groupedFeeds[selectedCategory]) { - setFilteredFeeds(groupedFeeds[selectedCategory]); - } else { - setFilteredFeeds([]); - } - }, [selectedCategory, groupedFeeds]); - - const fetchCategoriesAndFeeds = async () => { - try { - setLoading(true); - setError(null); - - // Fetch grouped feeds - const [groupedResponse, categoriesResponse] = await Promise.all([ - fetch("/api/feeds/grouped-by-category"), - fetch("/api/categories"), - ]); - - if (!groupedResponse.ok || !categoriesResponse.ok) { - throw new Error("カテゴリデータの取得に失敗しました"); - } - - const groupedData = await groupedResponse.json(); - await categoriesResponse.json(); - - setGroupedFeeds(groupedData.groupedFeeds || {}); - } catch (err) { - console.error("Category fetch error:", err); - setError(err instanceof Error ? err.message : "エラーが発生しました"); - } finally { - setLoading(false); - } - }; - - const formatDate = (dateString: string) => { - return new Date(dateString).toLocaleString("ja-JP"); - }; - - const getFeedCount = (category: string) => { - return groupedFeeds[category]?.length || 0; - }; - - if (loading) { - return 読み込み中...; - } - - if (error) { - return {error}; - } - - const availableCategories = Object.keys(groupedFeeds).filter( - (category) => groupedFeeds[category] && groupedFeeds[category].length > 0, - ); - - if (availableCategories.length === 0) { - return ( - - カテゴリ別のフィードがありません - - フィードにカテゴリが設定されていないか、アクティブなフィードがない可能性があります - - - 再読み込み - - - ); - } - - return ( - - - カテゴリ一覧 ({availableCategories.length}件) - - 更新 - - - - {!selectedCategory ? ( - - {availableCategories.map((category) => ( - - - setSelectedCategory(category)} - > - {category} - - - - {getFeedCount(category)} フィード - - - - - - {groupedFeeds[category]?.slice(0, 3).map((feed) => ( - - - {feed.title || feed.url} - - - ))} - {getFeedCount(category) > 3 && ( - - 他 {getFeedCount(category) - 3} フィード... - - )} - - - - setSelectedCategory(category)} - > - 詳細を見る - - - - ))} - - ) : ( - - - setSelectedCategory(null)} - > - ← カテゴリ一覧に戻る - - カテゴリ: {selectedCategory} - {filteredFeeds.length} フィード - - - - {filteredFeeds.map((feed) => ( - - - - - {feed.title || feed.url} - - - - - {feed.url} - - - - - {feed.description && ( - {feed.description} - )} - - - 作成日: {formatDate(feed.createdAt)} - {feed.lastUpdated && ( - 最終更新: {formatDate(feed.lastUpdated)} - )} - - - - - エピソード一覧を見る - - - - ))} - - - )} - - - - ); -} - -export default CategoryList;
カテゴリ別のフィードがありません
- フィードにカテゴリが設定されていないか、アクティブなフィードがない可能性があります -
{filteredFeeds.length} フィード