import React, { useState, useEffect } from 'react'; interface Feed { id: string; url: string; title?: string; description?: string; lastUpdated?: string; createdAt: string; active: boolean; } interface Stats { totalFeeds: number; activeFeeds: number; inactiveFeeds: number; totalEpisodes: number; lastUpdated: string; adminPort: number; authEnabled: boolean; } interface EnvVars { [key: string]: string | undefined; } function App() { const [feeds, setFeeds] = useState([]); const [stats, setStats] = useState(null); const [envVars, setEnvVars] = useState({}); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const [newFeedUrl, setNewFeedUrl] = useState(''); const [activeTab, setActiveTab] = useState<'dashboard' | 'feeds' | 'env'>('dashboard'); useEffect(() => { loadData(); }, []); const loadData = async () => { setLoading(true); try { const [feedsRes, statsRes, envRes] = await Promise.all([ fetch('/api/admin/feeds'), fetch('/api/admin/stats'), fetch('/api/admin/env') ]); if (!feedsRes.ok || !statsRes.ok || !envRes.ok) { throw new Error('Failed to load data'); } const [feedsData, statsData, envData] = await Promise.all([ feedsRes.json(), statsRes.json(), envRes.json() ]); setFeeds(feedsData); setStats(statsData); setEnvVars(envData); setError(null); } catch (err) { setError('データの読み込みに失敗しました'); console.error('Error loading data:', err); } finally { setLoading(false); } }; const addFeed = async (e: React.FormEvent) => { e.preventDefault(); if (!newFeedUrl.trim()) return; try { const res = await fetch('/api/admin/feeds', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ feedUrl: newFeedUrl }) }); const data = await res.json(); if (res.ok) { setSuccess(data.message); setNewFeedUrl(''); loadData(); } else { setError(data.error || 'フィード追加に失敗しました'); } } catch (err) { setError('フィード追加に失敗しました'); console.error('Error adding feed:', err); } }; const deleteFeed = async (feedId: string) => { if (!confirm('本当にこのフィードを削除しますか?関連するすべての記事とエピソードも削除されます。')) { return; } try { const res = await fetch(`/api/admin/feeds/${feedId}`, { method: 'DELETE' }); const data = await res.json(); if (res.ok) { setSuccess(data.message); loadData(); } else { setError(data.error || 'フィード削除に失敗しました'); } } catch (err) { setError('フィード削除に失敗しました'); console.error('Error deleting feed:', err); } }; const toggleFeed = async (feedId: string, active: boolean) => { try { const res = await fetch(`/api/admin/feeds/${feedId}/toggle`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ active }) }); const data = await res.json(); if (res.ok) { setSuccess(data.message); loadData(); } else { setError(data.error || 'フィードステータス変更に失敗しました'); } } catch (err) { setError('フィードステータス変更に失敗しました'); console.error('Error toggling feed:', err); } }; const triggerBatch = async () => { try { const res = await fetch('/api/admin/batch/trigger', { method: 'POST' }); const data = await res.json(); if (res.ok) { setSuccess(data.message); } else { setError(data.error || 'バッチ処理開始に失敗しました'); } } catch (err) { setError('バッチ処理開始に失敗しました'); console.error('Error triggering batch:', err); } }; if (loading) { return
読み込み中...
; } return (

管理者パネル

RSS Podcast Manager - 管理者用インターフェース

{error &&
{error}
} {success &&
{success}
}
{activeTab === 'dashboard' && ( <>
{stats?.totalFeeds || 0}
総フィード数
{stats?.activeFeeds || 0}
アクティブフィード
{stats?.inactiveFeeds || 0}
非アクティブフィード
{stats?.totalEpisodes || 0}
総エピソード数

管理者パネルポート: {stats?.adminPort}

認証: {stats?.authEnabled ? '有効' : '無効'}

最終更新: {stats?.lastUpdated ? new Date(stats.lastUpdated).toLocaleString('ja-JP') : '不明'}

)} {activeTab === 'feeds' && ( <>
setNewFeedUrl(e.target.value)} placeholder="https://example.com/feed.xml" required />

フィード一覧 ({feeds.length}件)

{feeds.length === 0 ? (

フィードが登録されていません

) : (
    {feeds.map((feed) => (
  • {feed.title || 'タイトル未設定'}

    {feed.url}
    {feed.active ? 'アクティブ' : '非アクティブ'}
  • ))}
)}
)} {activeTab === 'env' && ( <>

環境変数設定

現在の環境変数設定を表示しています。機密情報は***SET***と表示されます。

    {Object.entries(envVars).map(([key, value]) => (
  • {key}
    {value === undefined ? '未設定' : value}
  • ))}

環境変数の設定方法

環境変数を変更するには、.envファイルを編集するか、システムの環境変数を設定してください。 変更後はサーバーの再起動が必要です。

)}
); } export default App;