import type React from "react"; import type { Colle } from "~/lib/api"; import { DateTime } from "luxon"; import { Link, useNavigate } from "react-router"; import { Card, CardContent, CardHeader, CardFooter, } from "~/components/ui/card"; import { User, UserCheck, Paperclip, Star, MapPinHouse } from "lucide-react"; import { Badge } from "~/components/ui/badge"; import { Button } from "~/components/ui/button"; import { titleCase } from "~/lib/utils"; // TODO: Preferences for subject colors const getSubjectColor = (_: string) => { // Mock placeholder function return "bg-blue-100 text-blue-800"; // Default color }; const getSubjectEmoji = (_: string) => { // Mock placeholder function return "📚"; // Default emoji }; type ColleCardProps = { colle: Colle; onToggleFavorite: (id: number, favorite: boolean) => void; beforeClick: () => void; isFavorite: boolean; }; export default function ColleCard({ colle, onToggleFavorite, beforeClick, isFavorite, }: ColleCardProps) { const navigate = useNavigate(); // TODO: Remove this if scroll restoration is not needed (test first) const handleCardClick = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); beforeClick(); setTimeout(() => navigate(`/colles/${colle.id}`), 100); }; // TODO: Favorites const handleToggleFavorite = (e: React.MouseEvent) => { e.stopPropagation(); // Prevent card click e.preventDefault(); const newValue = !isFavorite; onToggleFavorite(colle.id, newValue); }; const subjectColor = getSubjectColor(colle.subject.name); const subjectEmoji = getSubjectEmoji(colle.subject.name); return (
{formatDate(colle.date)}
{formatTime(colle.date)}
{colle.grade && (
{formatGrade(colle.grade)}/20
)}
{colle.student.fullName}
{colle.examiner.name}
{colle.room && (
{colle.room.name}
)}
{colle.subject.name + " " + subjectEmoji} {isFavorite && ( Favori )}
{/* TODO: Attachments */} {colle.attachmentsCount > 0 && (
{colle.attachmentsCount}
)}
); } const formatDate = (date: string) => { const dt = DateTime.fromISO(date).setLocale("fr"); const str = dt.toLocaleString({ weekday: "long", day: "numeric", month: "long", year: "numeric", }); return titleCase(str); }; const formatTime = (date: string) => { const dt = DateTime.fromISO(date).setLocale("fr"); return dt.toLocaleString({ hour: "2-digit", minute: "2-digit", }); }; const formatGrade = (grade?: number) => { if (grade === undefined || grade === null || grade < 0 || grade > 20) return "N/A"; const rounded = Math.round(grade * 10) / 10; const str = rounded % 1 === 0 ? rounded.toFixed(0) // no decimals if .0 : rounded.toFixed(1); // one decimal otherwise return str.replace(".", ",").padStart(2, "0"); // pad with zero if needed };