import { useState, useEffect } from 'react'; import type { Item } from '../types'; import './FeedItem.css'; interface FeedItemProps { item: Item; } export default function FeedItem({ item: initialItem }: FeedItemProps) { const [item, setItem] = useState(initialItem); const [loading, setLoading] = useState(false); useEffect(() => { setItem(initialItem); }, [initialItem]); const toggleStar = () => { updateItem({ ...item, starred: !item.starred }); }; const updateItem = (newItem: Item) => { setLoading(true); // Optimistic update const previousItem = item; setItem(newItem); fetch(`/api/item/${newItem._id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ _id: newItem._id, read: newItem.read, starred: newItem.starred, }), }) .then((res) => { if (!res.ok) { throw new Error('Failed to update item'); } return res.json(); }) .then(() => { // Confirm with server response if needed, but for now we trust the optimistic update // or we could setItem(updated) if the server returns the full object setLoading(false); }) .catch((err) => { console.error('Error updating item:', err); // Revert on error setItem(previousItem); setLoading(false); }); }; return (
  • {item.title || '(No Title)'}
    {new Date(item.publish_date).toLocaleDateString()} {item.feed_title && ` - ${item.feed_title}`}
    {item.description && (
    )}
  • ); }