import Link from "next/link" import { PenTool } from "lucide-react" import { getTranslations } from "next-intl/server" import { Badge } from "@/shared/components/ui/badge" import { Button } from "@/shared/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/shared/components/ui/card" import { EmptyState } from "@/shared/components/ui/empty-state" import { StatusBadge } from "@/shared/components/ui/status-badge" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/shared/components/ui/table" import { formatDate, cn } from "@/shared/lib/utils" import type { StudentHomeworkAssignmentListItem } from "@/modules/homework/types" import { STUDENT_HOMEWORK_PROGRESS_VARIANT, STUDENT_HOMEWORK_PROGRESS_LABEL, } from "@/modules/homework/types" const getActionLabelKey = (status: string): "action.review" | "action.view" | "action.continue" | "action.start" => { if (status === "graded") return "action.review" if (status === "submitted") return "action.view" if (status === "in_progress") return "action.continue" return "action.start" } const getActionVariant = (status: string): "default" | "secondary" | "outline" => { if (status === "graded" || status === "submitted") return "outline" return "default" } const getDueUrgency = (dueAt: string | null) => { if (!dueAt) return null const now = new Date() const due = new Date(dueAt) const diffHours = (due.getTime() - now.getTime()) / (1000 * 60 * 60) if (diffHours < 0) return "overdue" if (diffHours < 48) return "urgent" if (diffHours < 120) return "warning" return "normal" } export async function StudentUpcomingAssignmentsCard({ upcomingAssignments }: { upcomingAssignments: StudentHomeworkAssignmentListItem[] }) { const t = await getTranslations("dashboard") const hasAssignments = upcomingAssignments.length > 0 return ( {t("sections.upcomingAssignments")} {!hasAssignments ? ( ) : (
{t("table.title")} {t("table.status")} {t("table.due")} {t("table.score")} {t("table.action")} {upcomingAssignments.map((a) => { const urgency = getDueUrgency(a.dueAt) const isGraded = a.progressStatus === "graded" return (
{a.title} {!isGraded && urgency === "overdue" && ( {t("badge.late")} )}
{a.dueAt ? formatDate(a.dueAt) : "-"} {a.latestScore ?? "-"}
) })}
)}
) }