import type { ReactElement } from "react" import { getTranslations } from "next-intl/server" import { StudentGradesCard } from "@/modules/dashboard/components/student-dashboard/student-grades-card" import { StudentStatsGrid } from "@/modules/dashboard/components/student-dashboard/student-stats-grid" import { StudentTodayScheduleCard } from "@/modules/dashboard/components/student-dashboard/student-today-schedule-card" import { StudentUpcomingAssignmentsCard } from "@/modules/dashboard/components/student-dashboard/student-upcoming-assignments-card" import { getStudentClasses, getStudentSchedule } from "@/modules/classes/data-access" import { getStudentDashboardGrades, getStudentHomeworkAssignments } from "@/modules/homework/data-access" import { buildStudentOverviewData } from "@/modules/settings/lib/student-overview-data" import { Separator } from "@/shared/components/ui/separator" interface ProfileStudentOverviewProps { userId: string } /** * 学生概览区块(Server Component) * * 独立获取学生数据并渲染,可被 Suspense + ErrorBoundary 包裹实现流式渲染与局部容错。 */ export async function ProfileStudentOverview({ userId, }: ProfileStudentOverviewProps): Promise { const t = await getTranslations("settings.profilePage.studentOverview") const [classes, schedule, assignmentsAll, grades] = await Promise.all([ getStudentClasses(userId), getStudentSchedule(userId), getStudentHomeworkAssignments(userId), getStudentDashboardGrades(userId), ]) const data = buildStudentOverviewData({ classes, schedule, assignments: assignmentsAll, grades, }) return (

{t("title")}

{t("description")}
) } /** * 学生概览骨架屏 */ export function ProfileStudentOverviewSkeleton(): ReactElement { return (
{Array.from({ length: 4 }).map((_, i) => (
))}
) }