"use client"; import { useState, useEffect } from "react"; import Link from "next/link"; import { getTopicConfig, getTopicCurriculum } from "../config"; import { getLastWatched, getProgress } from "@/app/cloudphone/lib/learning"; import { ParticleBackground } from "@/app/cloudphone/components/ParticleBackground"; import { triggerPay } from "@/app/lib/triggerPay"; type TopicHeroProps = { topicId: string; }; export function TopicHero({ topicId }: TopicHeroProps) { const config = getTopicConfig(topicId); const curriculum = getTopicCurriculum(topicId); const [last, setLast] = useState>(null); const [progress, setProgress] = useState({ completed: 0, percent: 0 }); const totalLessons = curriculum?.modules.reduce((s, m) => s + m.lessons.length, 0) ?? 0; useEffect(() => { if (curriculum?.hasContent && totalLessons > 0) { setLast(getLastWatched()); setProgress(getProgress(totalLessons)); const onProgress = () => { setLast(getLastWatched()); setProgress(getProgress(totalLessons)); }; window.addEventListener("learning:progress", onProgress); return () => window.removeEventListener("learning:progress", onProgress); } }, [curriculum?.hasContent, totalLessons]); if (!config) return null; const isEnrollCta = !config.externalUrl && !last; return (

{config.icon} {config.title}

{config.subtitle}

{config.desc && (

{config.desc}

)}
{config.stats.map((s) => (
{s.value}
{s.label}
))}
{curriculum?.hasContent && (
{config.externalUrl ? ( 前往了解 → ) : isEnrollCta ? ( ) : ( 继续学习 → )}
)} {curriculum?.hasContent && progress.completed > 0 && (
学习进度 {progress.completed}/{totalLessons} 节
)}
); }