import { useEffect, useMemo, useState, useRef } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { Image, Video, type VideoAnchor, type VideoRef, LetterToLuxun, StudyGuideModal, } from "@/components"; import { getBackgroundImage, getPublicPath, getStaticImage } from "@/lib/utils"; import { SuccessAlert } from "@/components/layout"; import { MultipleChoiceQuizPanel, SingleChoiceQuizPanel, } from "@/components/layout/quiz"; import { GuideSteps, GuideStepsItem } from "@/components"; type QuizOption = { value: string; label: string; isCorrect?: boolean; explanation?: string; }; type QuizAnchor = { id: string; time: number; title: string; prompt: string; type: "single" | "multiple"; options: QuizOption[]; explanation?: string; }; const starName = "luxun"; // 锚点数据:根据视频时长调整 time const QUIZ_ANCHORS: QuizAnchor[] = [ { id: "quiz-1", time: 155, // 2:35 title: "题目1", prompt: "以下属于鲁迅先生作品的是( )。", type: "multiple", options: [ { value: "A", label: "孔乙己", isCorrect: true }, { value: "B", label: "药", isCorrect: true }, { value: "C", label: "狂人日记", isCorrect: true }, { value: "D", label: "阿Q正传", isCorrect: true }, ], }, { id: "quiz-2", time: 355, // 5:55 title: "题目2", prompt: "对于鼓励和培养青年一代,鲁迅先生的做法是( )。", type: "multiple", options: [ { value: "A", label: "组织文学社团", isCorrect: true }, { value: "B", label: "木刻运动", isCorrect: true }, { value: "C", label: "写纪念烈士文章", isCorrect: true }, { value: "D", label: "让青年都去参军", }, ], explanation: "虽然鲁迅热爱革命,但他主要通过文学社团、木刻艺术和纪念文章来教育和启发青年,而不是通过参军来培养青年。", }, { id: "quiz-3", time: 420, // 7:00 title: "题目3", prompt: "以下那句诗出自鲁迅的作品( )。", type: "single", options: [ { value: "A", label: "寄意寒星荃不察,我以我血荐轩辕", isCorrect: true }, { value: "B", label: "我自横刀向天笑,去留肝胆两昆仑", explanation: "出自谭嗣同《狱中题壁》", }, { value: "C", label: "此去泉台招旧部,旌旗十万斩阎罗", explanation: "出自陈毅《梅岭三章》", }, { value: "D", label: "雄关漫道真如铁,而今迈步从头越", explanation: "出自毛泽东《忆秦娥·娄山关》", }, ], }, ]; const LuxunInternalization = () => { const navigate = useNavigate(); const { moduleName } = useParams<{ moduleName: string }>(); const [activeSuccess, setActiveSuccess] = useState(null); const [successContent, setSuccessContent] = useState(""); const [resumeCallback, setResumeCallback] = useState<(() => void) | null>( null ); const [visible, setVisible] = useState(false); const [showVideo, setShowVideo] = useState(false); const [postGuideVisible, setPostGuideVisible] = useState(false); const [showLetter, setShowLetter] = useState(false); const [showStudyGuide, setShowStudyGuide] = useState(false); const videoRef = useRef(null); useEffect(() => { setVisible(true); }, []); const handleVideoCanPlay = () => { if (showVideo && videoRef.current) { videoRef.current.play().catch((error) => { console.warn("视频播放失败:", error); }); } }; const anchors: VideoAnchor[] = useMemo( () => QUIZ_ANCHORS.map((item) => { const correctAnswers = item.options .filter((opt) => opt.isCorrect) .map((opt) => opt.value); // 单选题处理 if (item.type === "single") { return { id: item.id, time: item.time, once: true, afterResume: "remove", render: ({ resume }) => ( <> ({ value: opt.value, label: `${opt.value}. ${opt.label}`, }))} correctAnswer={correctAnswers[0]} errorMessage="再思考一下,选择正确答案。" onSubmit={(value: string, isCorrect: boolean) => { if (isCorrect) { setActiveSuccess(item.id); setSuccessContent("回答正确,请继续探索。"); setResumeCallback(() => resume); } }} /> { setActiveSuccess(null); setSuccessContent(""); const cb = resumeCallback; setResumeCallback(null); cb?.(); }} /> ), }; } // 多选题处理 if (item.type === "multiple") { return { id: item.id, time: item.time, once: true, afterResume: "remove", render: ({ resume }) => ( <> ({ value: opt.value, label: `${opt.value}. ${opt.label}`, }))} correctAnswer={correctAnswers} errorMessage={ item.explanation || "再思考一下,注意选择所有正确答案。" } onSubmit={(values: string[], isCorrect: boolean) => { if (isCorrect) { setActiveSuccess(item.id); setSuccessContent("回答正确,请继续探索。"); setResumeCallback(() => resume); } }} /> { setActiveSuccess(null); setSuccessContent(""); const cb = resumeCallback; setResumeCallback(null); cb?.(); }} /> ), }; } return { id: item.id, time: item.time, once: true, afterResume: "remove", render: () => null, }; }), [activeSuccess, resumeCallback, successContent] ); if (!moduleName) return null; return (
{/* 离开按钮 */} navigate(`/${moduleName}/${starName}/home`)} /> {showVideo && (
); }; export default LuxunInternalization;