staff_data/apps/web/src/app/main/courses/components/CourseCard.tsx

50 lines
1.7 KiB
TypeScript
Raw Normal View History

2025-02-06 16:32:31 +08:00
import { Card, Rate, Tag } from 'antd';
import { Course } from '../mockData';
import { UserOutlined, ClockCircleOutlined } from '@ant-design/icons';
2025-02-24 20:53:42 +08:00
import { CourseDto } from '@nice/common';
2025-02-06 16:32:31 +08:00
interface CourseCardProps {
2025-02-24 20:53:42 +08:00
course: CourseDto;
2025-02-06 16:32:31 +08:00
}
export default function CourseCard({ course }: CourseCardProps) {
return (
<Card
hoverable
className="w-full h-full transition-all duration-300 hover:shadow-lg"
cover={
<img
alt={course.title}
2025-02-24 20:53:42 +08:00
src={course?.meta?.thumbnail}
2025-02-06 16:32:31 +08:00
className="object-cover w-full h-40"
/>
}
>
<div className="space-y-3">
<h3 className="text-lg font-semibold line-clamp-2 hover:text-blue-600 transition-colors">
{course.title}
</h3>
2025-02-24 20:53:42 +08:00
<p className="text-gray-500 text-sm">{course.subTitle}</p>
2025-02-06 16:32:31 +08:00
<div className="flex items-center space-x-2">
<Rate disabled defaultValue={course.rating} className="text-sm" />
<span className="text-gray-500 text-sm">{course.rating}</span>
</div>
<div className="flex items-center justify-between text-sm text-gray-500">
<div className="flex items-center space-x-1">
<UserOutlined className="text-gray-400" />
2025-02-24 20:53:42 +08:00
<span>{course.enrollments?.length} </span>
2025-02-06 16:32:31 +08:00
</div>
<div className="flex items-center space-x-1">
<ClockCircleOutlined className="text-gray-400" />
<span>{course.duration}</span>
</div>
</div>
<div className="flex flex-wrap gap-2 pt-2">
2025-02-24 20:53:42 +08:00
<Tag color="blue" className="rounded-full px-3">{course.terms[0].name}</Tag>
<Tag color="green" className="rounded-full px-3">{course.terms[1].name}</Tag>
2025-02-06 16:32:31 +08:00
</div>
</div>
</Card>
);
}