import React, { useState, useMemo, useEffect } from 'react'; import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import { Button, Card, Typography, Tag, Progress, Spin } from 'antd'; import { PlayCircleOutlined, UserOutlined, ClockCircleOutlined, TeamOutlined, StarOutlined, ArrowRightOutlined, EyeOutlined, } from '@ant-design/icons'; import { TaxonomySlug, TermDto } from '@nice/common'; import { api } from '@nice/client'; // const {courseId} = useParams(); interface GetTaxonomyProps { categories: string[]; isLoading: boolean; } function useGetTaxonomy({ type }): GetTaxonomyProps { const { data, isLoading }: { data: TermDto[], isLoading: boolean } = api.term.findMany.useQuery({ where: { taxonomy: { //TaxonomySlug.CATEGORY slug: type } }, include: { children: true }, take: 10, // 只取前10个 orderBy: { createdAt: 'desc', // 按创建时间降序排列 }, }) const categories = useMemo(() => { const allCategories = isLoading ? [] : data?.map((course) => course.name); return [...Array.from(new Set(allCategories))]; }, [data]); return { categories, isLoading } } const { Title, Text } = Typography; interface Course { id: number; title: string; instructor: string; students: number; rating: number; level: string; duration: string; category: string; progress: number; thumbnail: string; } interface CoursesSectionProps { title: string; description: string; courses: Course[]; isLoading:boolean initialVisibleCoursesCount?: number; } const CoursesSection: React.FC = ({ title, description, courses, isLoading, initialVisibleCoursesCount = 8, }) => { const navigate = useNavigate(); const [selectedCategory, setSelectedCategory] = useState('全部'); const [visibleCourses, setVisibleCourses] = useState(initialVisibleCoursesCount); const gateGory: GetTaxonomyProps = useGetTaxonomy({ type: TaxonomySlug.CATEGORY, }) // const { data } = api.post.findMany.useQuery({ // where: {}, // 必选参数 // include: { // 关联查询 // instructors: true // }, // orderBy: { // 排序规则 // createdAt: 'desc' // }, // take: 8 // }) // useEffect(() => { // // 添加空值保护 // if (data && data.length > 0) { // console.log('有效数据:', data) // // 执行后续操作 // } else { // console.log('无数据或加载中') // } // }, [data]) // const formatted = data?.map(course => ({ // id: course.id, // title: course.title // })); const handleClick = (course: Course) => { navigate(`/course?courseId=${course.id}/detail`); } const filteredCourses = useMemo(() => { return selectedCategory === '全部' ? courses : courses.filter((course) => course.category === selectedCategory); }, [selectedCategory, courses]); const displayedCourses = isLoading ? [] : filteredCourses.slice(0, visibleCourses); return (
{title} {description}
{gateGory.isLoading ? : ( <> setSelectedCategory("全部")} className={`px-6 py-2 text-base cursor-pointer rounded-full transition-all duration-300 ${selectedCategory === "全部" ? 'bg-blue-600 text-white shadow-lg' : 'bg-white text-gray-600 hover:bg-gray-100' }`} >全部 { gateGory.categories.map((category) => ( setSelectedCategory(category)} className={`px-6 py-2 text-base cursor-pointer rounded-full transition-all duration-300 ${selectedCategory === category ? 'bg-blue-600 text-white shadow-lg' : 'bg-white text-gray-600 hover:bg-gray-100' }`} > {category} )) } ) }
{displayedCourses.map((course) => ( handleClick(course)} key={course.id} hoverable className="group overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-xl hover:shadow-2xl transition-all duration-300 transform hover:-translate-y-2" cover={
{course.progress > 0 && (
{/* */}
)}
} >
{course.category} {course.level}
<button > {course.title}</button>
{course.instructor}
观看次数{course.progress}次
))}
{filteredCourses?.length >= visibleCourses && (
)}
); }; export default CoursesSection;