import React, { useState } from 'react'; import { Newspaper, X, Star, Github } from 'lucide-react'; import { useI18n } from '../context/I18nContext'; import newsData from '../data/news.json'; interface NewsItem { id: string; date: string; title: string; body: string; tags: string[]; } export const NewsPage: React.FC = () => { const { t } = useI18n(); const [dismissedNews, setDismissedNews] = useState>(() => { try { const stored = localStorage.getItem('ace-dismissed-news'); return stored ? new Set(JSON.parse(stored)) : new Set(); } catch { return new Set(); } }); const allNews = newsData as NewsItem[]; const activeNews = allNews.filter(n => !dismissedNews.has(n.id)); const dismissed = allNews.filter(n => dismissedNews.has(n.id)); const dismissNewsItem = (id: string) => { setDismissedNews(prev => { const next = new Set(prev); next.add(id); localStorage.setItem('ace-dismissed-news', JSON.stringify([...next])); return next; }); }; const restoreNewsItem = (id: string) => { setDismissedNews(prev => { const next = new Set(prev); next.delete(id); localStorage.setItem('ace-dismissed-news', JSON.stringify([...next])); return next; }); }; const tagColor = (tag: string) => { switch (tag) { case 'experimental': return 'bg-amber-500/15 text-amber-600 dark:text-amber-400'; case 'backend': return 'bg-blue-500/15 text-blue-600 dark:text-blue-400'; case 'training': return 'bg-purple-500/15 text-purple-600 dark:text-purple-400'; case 'feature': return 'bg-green-500/15 text-green-600 dark:text-green-400'; case 'bugfix': return 'bg-red-500/15 text-red-600 dark:text-red-400'; default: return 'bg-zinc-200 dark:bg-white/10 text-zinc-500 dark:text-zinc-400'; } }; const renderCard = (item: NewsItem, isDismissed: boolean) => (
{/* Header */}

{item.title}

{item.date}

{!isDismissed ? ( ) : ( )}
{/* Body */}

{item.body}

{/* Tags */}
{item.tags.map(tag => ( {tag} ))}
); return (
{/* Header */}

{t('news')}

Updates and announcements

{/* Star Repo */}

fspecii/ace-step-ui

Star the repo to support the project

Star
{/* Active News */} {activeNews.length > 0 ? (
{activeNews.map(item => renderCard(item, false))}
) : (

No new updates

)} {/* Dismissed News */} {dismissed.length > 0 && (

Dismissed

{dismissed.map(item => renderCard(item, true))}
)}
); };