staff_data/apps/web/src/components/models/course/detail/CourseDetailLayout.tsx

57 lines
1.6 KiB
TypeScript
Raw Normal View History

2025-01-08 00:56:15 +08:00
import { motion } from "framer-motion";
import { useContext, useState } from "react";
import { CourseDetailContext } from "./CourseDetailContext";
2025-01-08 20:29:07 +08:00
import CourseDetailDisplayArea from "./CourseDetailDisplayArea";
import { CourseSyllabus } from "./CourseSyllabus/CourseSyllabus";
import CourseDetailHeader from "./CourseDetailHeader/CourseDetailHeader";
2025-02-21 16:11:02 +08:00
import { Button } from "antd";
2025-01-08 00:56:15 +08:00
export default function CourseDetailLayout() {
2025-02-21 16:11:02 +08:00
const {
course,
selectedLectureId,
lecture,
isLoading,
setSelectedLectureId,
} = useContext(CourseDetailContext);
2025-01-08 00:56:15 +08:00
const handleLectureClick = (lectureId: string) => {
setSelectedLectureId(lectureId);
};
const [isSyllabusOpen, setIsSyllabusOpen] = useState(false);
return (
<div className="relative">
2025-02-21 16:11:02 +08:00
<CourseDetailHeader />
2025-02-20 20:02:27 +08:00
{/* 添加 Header 组件 */}
2025-01-08 00:56:15 +08:00
{/* 主内容区域 */}
2025-01-08 20:29:07 +08:00
{/* 为了防止 Header 覆盖内容,添加上边距 */}
<div className="pt-16">
{" "}
{/* 添加这个包装 div */}
<motion.div
animate={{
width: isSyllabusOpen ? "75%" : "100%",
}}
transition={{ type: "spring", stiffness: 300, damping: 30 }}
className="relative">
<CourseDetailDisplayArea
2025-02-21 16:11:02 +08:00
// course={course}
// isLoading={isLoading}
2025-01-08 20:29:07 +08:00
videoSrc="https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8"
videoPoster="https://picsum.photos/800/450"
/>
</motion.div>
{/* 课程大纲侧边栏 */}
<CourseSyllabus
sections={course?.sections || []}
onLectureClick={handleLectureClick}
isOpen={isSyllabusOpen}
onToggle={() => setIsSyllabusOpen(!isSyllabusOpen)}
2025-01-08 00:56:15 +08:00
/>
2025-01-08 20:29:07 +08:00
</div>
2025-01-08 00:56:15 +08:00
</div>
);
}