'use client'; import Link from 'next/link'; import { ArrowRight, CheckCircle2 } from 'lucide-react'; import { useEffect, useState } from 'react'; import { RevealSection } from '@/components/landing/RevealSection'; import { fetchChangelog, type ChangelogRelease } from '@/lib/changelog'; import { buildLandingLatestUpdates } from '@/lib/landingLatest'; import { fetchLatestReleaseInfo, type LatestReleaseInfo } from '@/lib/latestRelease'; type LandingLatestUpdatesProps = { lang: 'en' | 'cn'; fallbackVersion: string; initialRelease?: ChangelogRelease; initialLatestRelease?: LatestReleaseInfo | null; }; export function LandingLatestUpdates({ lang, fallbackVersion, initialRelease, initialLatestRelease }: LandingLatestUpdatesProps) { const [latest, setLatest] = useState(() => buildLandingLatestUpdates(lang, initialRelease, fallbackVersion, initialLatestRelease)); useEffect(() => { let active = true; setLatest(buildLandingLatestUpdates(lang, initialRelease, fallbackVersion, initialLatestRelease)); Promise.all([fetchLatestReleaseInfo(), fetchChangelog(lang)]).then(([releaseInfo, data]) => { if (!active) return; setLatest(buildLandingLatestUpdates(lang, data.releases[0] ?? initialRelease, fallbackVersion, releaseInfo ?? initialLatestRelease)); }); return () => { active = false; }; }, [lang, fallbackVersion, initialRelease, initialLatestRelease]); return (
{latest.version}

{latest.title}

{latest.desc}

{latest.link}
); }