import Link from "next/link" import { PenTool, TriangleAlert } from "lucide-react" import { Badge } from "@/shared/components/ui/badge" import { Card, CardContent, CardHeader, CardTitle } from "@/shared/components/ui/card" import { EmptyState } from "@/shared/components/ui/empty-state" import { cn, formatDate } from "@/shared/lib/utils" import type { StudentHomeworkProgressStatus } from "@/modules/homework/types" import type { ChildHomeworkSummaryData } from "@/modules/parent/types" const getStatusVariant = ( status: StudentHomeworkProgressStatus, ): "default" | "secondary" | "outline" => { switch (status) { case "graded": return "default" case "submitted": case "in_progress": return "secondary" case "not_started": return "outline" } } const getStatusLabel = (status: StudentHomeworkProgressStatus): string => { switch (status) { case "graded": return "Graded" case "submitted": return "Submitted" case "in_progress": return "In progress" case "not_started": return "Not started" } } type DueUrgency = "overdue" | "urgent" | "normal" const getDueUrgency = (dueAt: string | null, now: Date): DueUrgency | null => { if (!dueAt) return null const due = new Date(dueAt) const diffHours = (due.getTime() - now.getTime()) / (1000 * 60 * 60) if (diffHours < 0) return "overdue" if (diffHours < 48) return "urgent" return "normal" } export function ChildHomeworkSummary({ summary, childId, childName, }: { summary: ChildHomeworkSummaryData childId: string childName: string }) { const hasAssignments = summary.recentAssignments.length > 0 // hoist:在组件作用域计算一次 now,避免每次 map 迭代都 new Date() const now = new Date() return ( {childName}'s Homework
Pending
{summary.pendingCount}
Submitted
{summary.submittedCount}
Graded
{summary.gradedCount}
Overdue
0 && "text-destructive", )} > {summary.overdueCount}
{!hasAssignments ? ( ) : (
Recent Assignments
{summary.recentAssignments.map((a) => { const urgency = getDueUrgency(a.dueAt, now) const isGraded = a.progressStatus === "graded" return (
{a.title}
{getStatusLabel(a.progressStatus)} {a.dueAt ? ( Due {formatDate(a.dueAt)} ) : null}
{a.latestScore ?? "-"}
) })} View all
)}
) }