"use client" import { useMemo, useState } from "react" import { BarChart3, CalendarDays, ClipboardList, GraduationCap, Mail, Stethoscope, } from "lucide-react" import { Button } from "@/shared/components/ui/button" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/shared/components/ui/tabs" import { cn } from "@/shared/lib/utils" import type { ChildDashboardData } from "@/modules/parent/types" import { ChildGradeDetail } from "./child-grade-detail" import { ChildGradeSummary } from "./child-grade-summary" import { ChildHomeworkDetail } from "./child-homework-detail" import { ChildHomeworkSummary } from "./child-homework-summary" import { ChildScheduleCard } from "./child-schedule-card" import { ChildExamDetail } from "./child-exam-detail" export type ChildDetailTab = "overview" | "homework" | "grades" | "exams" | "schedule" | "attendance" | "diagnostic" const VALID_TABS: ChildDetailTab[] = ["overview", "homework", "grades", "exams", "schedule", "attendance", "diagnostic"] const isTab = (v: string | undefined | null): v is ChildDetailTab => typeof v === "string" && (VALID_TABS as string[]).includes(v) const resolveTab = (v: string | undefined | null): ChildDetailTab => isTab(v) ? v : "overview" export function ChildDetailPanel({ child, initialTab, siblingSwitcher, }: { child: ChildDashboardData initialTab?: string siblingSwitcher?: React.ReactNode }) { const { basicInfo, todaySchedule, weeklySchedule, homeworkSummary, gradeTrend, examResults } = child const childName = basicInfo.name ?? "Child" const [tab, setTab] = useState(resolveTab(initialTab)) const tabs = useMemo( () => [ { id: "overview" as const, label: "Overview", icon: ClipboardList }, { id: "homework" as const, label: "Homework", icon: ClipboardList }, { id: "grades" as const, label: "Grades", icon: BarChart3 }, { id: "exams" as const, label: "Exams", icon: GraduationCap }, { id: "schedule" as const, label: "Schedule", icon: CalendarDays }, { id: "attendance" as const, label: "Attendance", icon: CalendarDays }, { id: "diagnostic" as const, label: "Diagnostic", icon: Stethoscope }, ], [], ) return (
{siblingSwitcher} setTab(v as ChildDetailTab)} className="w-full">
{tabs.map((t) => ( {t.label} ))}

Subject Analysis

Attendance details are available on the{" "} Attendance page .

Diagnostic reports will be available here once published by the school.

) } /** 紧凑的子女切换器(用于详情页头部)。 */ export function SiblingSwitcher({ current, siblings, }: { current: { id: string; name: string | null } siblings: Array<{ id: string; name: string | null }> }) { if (siblings.length <= 1) return null return (
Switch child
{siblings.map((s) => { const isActive = s.id === current.id const label = s.name ?? "Child" return ( {label} ) })}
) }