mirror of
https://github.com/kamranahmedse/developer-roadmap.git
synced 2025-10-02 03:46:42 +02:00
* Refactor ai courses * Refactor * Regenerate roadmap functionality * Title and difficulty to refresh also * Add course regeneration * Improve the non paid user headings * Update * Improve back button logic * Is paid user checks
74 lines
2.3 KiB
TypeScript
74 lines
2.3 KiB
TypeScript
import type { AICourseListItem } from '../../queries/ai-course';
|
|
import type { DifficultyLevel } from './AICourse';
|
|
import { BookOpen } from 'lucide-react';
|
|
|
|
type AICourseCardProps = {
|
|
course: AICourseListItem;
|
|
};
|
|
|
|
export function AICourseCard(props: AICourseCardProps) {
|
|
const { course } = props;
|
|
|
|
// Format date if available
|
|
const formattedDate = course.createdAt
|
|
? new Date(course.createdAt).toLocaleDateString('en-US', {
|
|
month: 'short',
|
|
day: 'numeric',
|
|
})
|
|
: null;
|
|
|
|
// Map difficulty to color
|
|
const difficultyColor =
|
|
{
|
|
beginner: 'text-green-700',
|
|
intermediate: 'text-blue-700',
|
|
advanced: 'text-purple-700',
|
|
}[course.difficulty as DifficultyLevel] || 'text-gray-700';
|
|
|
|
// Calculate progress percentage
|
|
const totalTopics = course.lessonCount || 0;
|
|
const completedTopics = course.done?.length || 0;
|
|
const progressPercentage =
|
|
totalTopics > 0 ? Math.round((completedTopics / totalTopics) * 100) : 0;
|
|
|
|
return (
|
|
<a
|
|
href={`/ai-tutor/${course.slug}`}
|
|
className="hover:border-gray-3 00 group relative flex w-full flex-col overflow-hidden rounded-lg border border-gray-200 bg-white p-4 text-left transition-all hover:bg-gray-50"
|
|
>
|
|
<div className="flex items-center justify-between">
|
|
<span
|
|
className={`rounded-full text-xs font-medium capitalize opacity-80 ${difficultyColor}`}
|
|
>
|
|
{course.difficulty}
|
|
</span>
|
|
</div>
|
|
|
|
<h3 className="my-2 text-base font-semibold text-gray-900">
|
|
{course.title}
|
|
</h3>
|
|
|
|
<div className="mt-auto flex items-center justify-between pt-2">
|
|
<div className="flex items-center text-xs text-gray-600">
|
|
<BookOpen className="mr-1 h-3.5 w-3.5" />
|
|
<span>{totalTopics} lessons</span>
|
|
</div>
|
|
|
|
{totalTopics > 0 && (
|
|
<div className="flex items-center">
|
|
<div className="mr-2 h-1.5 w-16 overflow-hidden rounded-full bg-gray-200">
|
|
<div
|
|
className="h-full rounded-full bg-blue-600"
|
|
style={{ width: `${progressPercentage}%` }}
|
|
/>
|
|
</div>
|
|
<span className="text-xs font-medium text-gray-700">
|
|
{progressPercentage}%
|
|
</span>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</a>
|
|
);
|
|
}
|