import { AlertTriangle, ExternalLink, RefreshCw } from 'lucide-react'; import { type NewsItem } from '~main/types'; import { api } from '~renderer/utils/api'; import { useT } from '~renderer/i18n'; import useScrollHint from '~renderer/utils/useScrollHint'; import IconSpinner from '../styled/IconSpinner'; import TextButton from '../styled/TextButton'; const formatDate = (raw: string) => { const d = new Date(raw); if (Number.isNaN(d.getTime())) return raw; return d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' }); }; const NewsEntry = ({ item }: { item: NewsItem }) => { const t = useT(); const openLink = api.general.openLink.useMutation(); return (
{item.title}
{formatDate(item.date)}
{item.author && ( {t('misc.newsByAuthor', { author: item.author })} )}

{item.body}

{item.url && ( openLink.mutateAsync(item.url!)} > {t('misc.newsReadMore')} )}
); }; const NewsColumn = ({ forum, title }: { forum: number; title: string }) => { const t = useT(); const query = api.news.list.useQuery( { forum }, { staleTime: 5 * 60 * 1000, refetchOnWindowFocus: false, retry: 1 } ); const scrollRef = useScrollHint(); return (

{title}

query.refetch()} title={t('misc.refresh')} />

{query.isLoading ? (

{t('misc.newsLoading')}

) : query.isError ? (

{t('misc.newsError')}

query.refetch()} > {t('misc.tryAgain')}
) : !query.data?.length ? (

{t('misc.newsEmpty')}

) : ( query.data.map(item => ) )}
); }; const NewsTab = () => { const t = useT(); return (
); }; export default NewsTab;