import Link from "next/link" import { EmptyState } from "@/shared/components/ui/empty-state" 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 { formatDate } from "@/shared/lib/utils" import { getStudentHomeworkAssignments } from "@/modules/homework/data-access" import { getCurrentStudentUser } from "@/modules/users/data-access" import { Inbox, UserX } from "lucide-react" import type { StudentHomeworkAssignmentListItem, StudentHomeworkProgressStatus, } from "@/modules/homework/types" export const dynamic = "force-dynamic" const getStatusVariant = ( status: StudentHomeworkProgressStatus ): "default" | "secondary" | "outline" => { switch (status) { case "graded": return "default" case "submitted": return "secondary" case "in_progress": return "outline" default: return "outline" } } const getStatusLabel = (status: StudentHomeworkProgressStatus): string => { switch (status) { case "graded": return "Graded" case "submitted": return "Submitted" case "in_progress": return "In progress" default: return "Not started" } } const getActionLabel = (status: StudentHomeworkProgressStatus): string => { switch (status) { case "graded": return "Review" case "submitted": return "View" case "in_progress": return "Continue" default: return "Start" } } const getActionVariant = ( status: StudentHomeworkProgressStatus ): "default" | "secondary" | "outline" => { return status === "graded" || status === "submitted" ? "outline" : "default" } const isAnswered = (status: StudentHomeworkProgressStatus): boolean => status === "submitted" || status === "graded" function AssignmentCard({ assignment: a }: { assignment: StudentHomeworkAssignmentListItem }) { return (
{a.title} {getStatusLabel(a.progressStatus)}
Due {a.dueAt ? formatDate(a.dueAt) : "-"} Attempts {a.attemptsUsed}/{a.maxAttempts}
Score
{a.latestScore ?? "-"}
) } export default async function StudentAssignmentsPage() { const student = await getCurrentStudentUser() if (!student) { return ( ) } const assignments = await getStudentHomeworkAssignments(student.id) const hasAssignments = assignments.length > 0 const assignmentsBySubject = assignments.reduce((acc, assignment) => { const subject = assignment.subjectName?.trim() || "Other" const existing = acc.get(subject) if (existing) { existing.push(assignment) } else { acc.set(subject, [assignment]) } return acc }, new Map()) const subjectEntries = Array.from(assignmentsBySubject.entries()).sort((a, b) => a[0].localeCompare(b[0]) ) return ( <> {!hasAssignments ? ( ) : (
{subjectEntries.map(([subject, items]) => { // 单次遍历分桶,避免重复 filter(PERF-05) const answered: StudentHomeworkAssignmentListItem[] = [] const unanswered: StudentHomeworkAssignmentListItem[] = [] for (const a of items) { if (isAnswered(a.progressStatus)) { answered.push(a) } else { unanswered.push(a) } } return (
{subject}
{unanswered.length > 0 && (
Pending
{unanswered.map((a) => ( ))}
)} {answered.length > 0 && (
Completed
{answered.map((a) => ( ))}
)}
) })}
)} ) }