"use client"; import { useEffect, useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { RefreshCw, Telescope } from "lucide-react"; import { useSession } from "next-auth/react"; import { formatDistance } from 'date-fns'; import { fr } from 'date-fns/locale'; interface NewsItem { id: number; title: string; date: string; source: string; description: string | null; category: string | null; url: string; } export function News() { const [news, setNews] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [refreshing, setRefreshing] = useState(false); const { status } = useSession(); const fetchNews = async (isRefresh = false) => { if (isRefresh) setRefreshing(true); if (!isRefresh) setLoading(true); try { const response = await fetch(isRefresh ? '/api/news?refresh=true' : '/api/news'); if (!response.ok) { throw new Error('Failed to fetch news'); } const data = await response.json(); setNews(data); setError(null); } catch (err) { setError('Failed to fetch news'); console.error('Error fetching news:', err); } finally { setLoading(false); setRefreshing(false); } }; useEffect(() => { if (status === 'authenticated') { fetchNews(); } }, [status]); const formatDate = (dateString: string) => { try { const date = new Date(dateString); return formatDistance(date, new Date(), { addSuffix: true, locale: fr }); } catch (err) { console.error('Error formatting date:', err); return dateString; } }; if (status === 'loading' || loading) { return ( Nouvelles
); } return ( Nouvelles {error ? (
{error}
) : (
{news.length === 0 ? (
No news available
) : ( news.map((item) => (
window.open(item.url, '_blank')} >
{formatDate(item.date)}

{item.title}

{item.description}

)) )}
)}
); }