import React, { useEffect, useState } from 'react'; import type { Feed } from '../types'; import './Settings.css'; export default function Settings() { const [feeds, setFeeds] = useState([]); const [newFeedUrl, setNewFeedUrl] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { fetchFeeds(); }, []); const fetchFeeds = () => { setLoading(true); fetch('/api/feed/') .then((res) => { if (!res.ok) throw new Error('Failed to fetch feeds'); return res.json(); }) .then((data) => { setFeeds(data); setLoading(false); }) .catch((err) => { setError(err.message); setLoading(false); }); }; const handleAddFeed = (e: React.FormEvent) => { e.preventDefault(); if (!newFeedUrl) return; setLoading(true); fetch('/api/feed/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url: newFeedUrl }), }) .then((res) => { if (!res.ok) throw new Error('Failed to add feed'); return res.json(); }) .then(() => { setNewFeedUrl(''); fetchFeeds(); // Refresh list (or we could append if server returns full feed object) }) .catch((err) => { setError(err.message); setLoading(false); }); }; const handleDeleteFeed = (id: number) => { if (!globalThis.confirm('Are you sure you want to delete this feed?')) return; setLoading(true); fetch(`/api/feed/${id}`, { method: 'DELETE', }) .then((res) => { if (!res.ok) throw new Error('Failed to delete feed'); setFeeds(feeds.filter((f) => f._id !== id)); setLoading(false); }) .catch((err) => { setError(err.message); setLoading(false); }); }; return (

Settings

Add New Feed

setNewFeedUrl(e.target.value)} placeholder="https://example.com/feed.xml" required className="feed-input" disabled={loading} />
{error &&

{error}

}

Manage Feeds

{loading &&

Loading...

}
    {feeds.map((feed) => (
  • {feed.title || '(No Title)'} {feed.url}
  • ))}
); }