"use client" import { useMemo, useState } from "react" import { BarChart3, CalendarDays, ClipboardList, GraduationCap, Mail, Stethoscope, } from "lucide-react" import { useTranslations } from "next-intl" 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.some((tab) => tab === 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 t = useTranslations("parent") const { basicInfo, todaySchedule, weeklySchedule, homeworkSummary, gradeTrend, examResults } = child const childName = basicInfo.name ?? t("childDetail.defaultName") const [tab, setTab] = useState(resolveTab(initialTab)) const tabs = useMemo( () => [ { id: "overview" as const, label: t("childDetail.tabs.overview"), icon: ClipboardList }, { id: "homework" as const, label: t("childDetail.tabs.homework"), icon: ClipboardList }, { id: "grades" as const, label: t("childDetail.tabs.grades"), icon: BarChart3 }, { id: "exams" as const, label: t("childDetail.tabs.exams"), icon: GraduationCap }, { id: "schedule" as const, label: t("childDetail.tabs.schedule"), icon: CalendarDays }, { id: "attendance" as const, label: t("childDetail.tabs.attendance"), icon: CalendarDays }, { id: "diagnostic" as const, label: t("childDetail.tabs.diagnostic"), icon: Stethoscope }, ], [t], ) return (
{siblingSwitcher} { if (isTab(v)) setTab(v) }} className="w-full" >
{tabs.map((tab) => ( {tab.label} ))}

{t("childDetail.subjectAnalysis")}

{t.rich("childDetail.attendanceHint", { link: (chunks) => ( {chunks} ), })}

{t("childDetail.diagnosticHint")}

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