import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; import useSWR from "swr"; import { DEV_MODE } from "../../env"; import { HydrationData } from "../../../../libs/types/hydration"; import { NewsItem } from "../../../../libs/types/document"; import { HOMEPAGE, HOMEPAGE_ITEMS } from "../../telemetry/constants"; import "./index.scss"; dayjs.extend(relativeTime); export function LatestNews(props: HydrationData) { const fallbackData = props.hyData ? props : undefined; const { data: { hyData } = {} } = useSWR( "./index.json", async (url) => { const response = await fetch(url); if (!response.ok) { const text = await response.text(); throw new Error(`${response.status} on ${url}: ${text}`); } return await response.json(); }, { fallbackData, revalidateOnFocus: DEV_MODE, revalidateOnMount: !fallbackData, } ); const newsItems: NewsItem[] = hyData?.latestNews?.items.slice(0, 3) ?? []; if (!newsItems.length) { return null; } function NewsItemTitle({ newsItem, ...attributes }: { newsItem: NewsItem }) { const ageInDays = dayjs().diff(newsItem.published_at, "day"); const isNew = ageInDays < 7; return ( <> {newsItem.title} {isNew && ( <> {" "} New )} ); } function NewsItemSource({ newsItem, ...attributes }: { newsItem: NewsItem }) { const { source } = newsItem; return ( {source.name} ); } function NewsItemDate({ newsItem }: { newsItem: NewsItem }) { const relativeTime = dayjs(newsItem.published_at).fromNow(); return <>{relativeTime}; } return (

Latest news

    {newsItems.map((newsItem, index) => (
  • ))}
); }