import {useEffect, useState} from 'react'; import {useTranslation} from 'react-i18next'; import {Loader2} from 'lucide-react'; import {Card, CardContent, CardHeader, CardTitle} from '@/components/ui/card'; import NewsEntry from '../components/NewsEntry.jsx'; import PageContainer from '../components/PageContainer.jsx'; import {fetchNews, markNewsSeen} from '../utils/news.js'; /** * Every news entry, newest first. Opening the page marks them seen. */ export default function WhatsNewPage() { const {t} = useTranslation(); const [entries, setEntries] = useState([]); const [status, setStatus] = useState('loading'); useEffect(() => { (async () => { try { const response = await fetchNews(); if (response.status === 401) return; if (!response.ok) { setStatus('error'); return; } setEntries((await response.json()).results); setStatus('ready'); // A failed mark is silent: the dashboard dialog shows the entries again. markNewsSeen().catch(() => undefined); } catch (err) { console.error('News error:', err); setStatus('error'); } })(); }, []); return ( {t('NEWS.TITLE')} {status === 'loading' && } {status === 'error' &&

{t('NEWS.LOAD_ERROR')}

} {status === 'ready' && entries.length === 0 &&

{t('NEWS.EMPTY')}

} {status === 'ready' && entries.length > 0 && (
    {entries.map((entry) =>
  • )}
)}
); }