/** * 오늘의 한 장 — 발행본. * * ★ '오늘'을 서버에서 고르지 않는다. 프리렌더는 굽는 날짜로만 알고, 그 HTML 은 며칠씩 산다 — * 구울 때의 '오늘'을 박으면 내일 틀린 날짜가 오늘로 걸린다. * 그래서 전부 펴서 굽고, 브라우저에서 오늘 자리에만 표시를 얹는다(useEffect: SSR 과 안 어긋난다). */ import {useEffect, useState} from 'react'; import type {DailyItem} from '@o2o/shared'; import {useSite} from '@/lib/site-context'; import {sectionItems, sectionName} from '@/lib/derive'; import {ITEM_ACCENT, ITEM_BORDER, ITEM_CARD, ItemSection, Rail, SourceLine, tally} from './common'; export function DailySection() { const payload = useSite(); const parsed = sectionItems(payload, 'daily'); const [today, setToday] = useState(); useEffect(() => { const now = new Date(); setToday(`${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`); }, []); if (parsed.items.length === 0) return null; const pages = [...parsed.items].sort((a, b) => a.monthDay.localeCompare(b.monthDay)); return ( {pages.map((page, index) => { const [month, day] = page.monthDay.split('-'); const isToday = today === page.monthDay; return (

{month}月

{String(Number(day) || day)}

{isToday &&

오늘

}
{page.category &&

{page.category}

}

{page.title}

{page.body &&

{page.body}

} {page.tags && page.tags.length > 0 && (

{page.tags.join(' ')}

)}
); })}
); }