"use client"; import { useState, useEffect, useRef } from "react"; import type { ChangelogRelease } from "@/lib/changelog"; import { ChevronDown, Tag } from "lucide-react"; const PAGE_SIZE = 5; const sectionLabels: Record> = { added: { en: "New Features", cn: "新功能" }, improved: { en: "Improvements", cn: "改进" }, fixed: { en: "Bug Fixes", cn: "问题修复" }, changed: { en: "Changes", cn: "变更" }, removed: { en: "Removed", cn: "移除" }, }; function formatDate(dateStr: string, lang: string) { const d = new Date(dateStr); if (lang === "cn") { return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日`; } return d.toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" }); } function ReleaseCard({ release, lang }: { release: ChangelogRelease; lang: string }) { const t = lang === "cn" ? { publishedOn: "发布于", download: "下载", seeGitHub: "查看 GitHub Release 获取详情" } : { publishedOn: "Published on", download: "Download", seeGitHub: "See GitHub Release for details" }; return (
{/* Header */}
{release.tag.replace("v", "")} {t.publishedOn} {formatDate(release.date, lang)}
{t.download}
{/* Title */}

Release {release.tag}

{/* Sections */} {release.sections.map((section, si) => (
0 ? "mt-10" : ""}>

{sectionLabels[section.type]?.[lang] || section.title}

    {section.items.map((item, ii) => (
  • {item.desc ? ( <> {item.title},{item.desc} ) : ( item.title )}
  • ))}
))} {release.sections.length === 0 &&

{t.seeGitHub}

}
); } export function ChangelogList({ releases, lang }: { releases: ChangelogRelease[]; lang: string }) { const [count, setCount] = useState(PAGE_SIZE); const sentinelRef = useRef(null); useEffect(() => { const node = sentinelRef.current; if (!node) return; const observer = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { setCount((c) => Math.min(c + PAGE_SIZE, releases.length)); } }, { rootMargin: "200px" }, ); observer.observe(node); return () => observer.disconnect(); }, [releases.length]); const visible = releases.slice(0, count); const hasMore = count < releases.length; return ( <> {visible.map((release) => ( ))} {hasMore && (
{lang === "cn" ? "加载更多版本…" : "Loading more versions…"}
)} ); }