'use client' import { useEffect, useState } from 'react' import { getNewsFeed, formatPublishedDate, type NewsItem } from '@/lib/newsApi' import { SentimentalityBar } from './SentimentalityBar' interface NewsHeadlinesProps { keyword?: string // Symbol or topic to fetch news for onAverageSentiment?: (avg: number | null) => void // Callback with average sentiment score } export function NewsHeadlines({ keyword, onAverageSentiment }: NewsHeadlinesProps) { const [items, setItems] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { if (!keyword) { setLoading(false) setError(null) setItems([]) onAverageSentiment?.(null) return } setLoading(true) setError(null) setItems([]) getNewsFeed(keyword) .then((newsItems) => { setItems(newsItems) if (newsItems.length > 0) { const avg = newsItems.reduce((sum, item) => sum + item.score, 0) / newsItems.length onAverageSentiment?.(Math.round(avg)) } else { onAverageSentiment?.(null) } }) .catch((err) => { setError(err.message) onAverageSentiment?.(null) }) .finally(() => setLoading(false)) }, [keyword, onAverageSentiment]) if (!keyword) { return (
No keyword selected
) } if (loading) { return (
Loading news...
) } if (error) { return (
{error}
) } if (!items || items.length === 0) { return (
No news found for "{keyword}"
) } return (
{items.map((item, idx) => (
{item.title}
{item.publisher} • {formatPublishedDate(item.publishedAt)}
))}
) }