"use client"; import { TrendingUp, Download, Info, CheckCircle2, AlertTriangle, RefreshCw, } from "lucide-react"; import { useMemo } from "react"; import { useSearchParams } from "next/navigation"; import { useAuth } from "@/components/AuthProvider"; import { useD4Metrics } from "@/hooks/useD4Metrics"; import { toD4UserId } from "@/lib/d4Metrics"; import { buildRuntimeMetrics, getRuntimeMetric, type MetricDataState } from "@/lib/metricRuntime"; export default function MetricsContent({ metricId }: { metricId: string }) { const searchParams = useSearchParams(); const { user } = useAuth(); const normalizedMetricId = metricId.toUpperCase(); const isD4Metric = normalizedMetricId === "D4"; const selectedStudentId = searchParams.get("student") || (user?.role === "stu" ? user.id : null); const selectedD4UserId = toD4UserId(selectedStudentId); const d4Query = useMemo(() => (selectedD4UserId ? { userId: selectedD4UserId } : {}), [selectedD4UserId]); const d4Metrics = useD4Metrics(d4Query, { enabled: isD4Metric }); const runtimeMetrics = useMemo( () => buildRuntimeMetrics({ data: d4Metrics.data, error: d4Metrics.error, isLoading: d4Metrics.isLoading }), [d4Metrics.data, d4Metrics.error, d4Metrics.isLoading], ); const metricObj = getRuntimeMetric(runtimeMetrics, normalizedMetricId); if (!metricObj) { return (

未找到指标 {normalizedMetricId} 的详情

); } const getStateLabel = (state: MetricDataState, score: number | null) => { if (state === "loading") return { label: "加载中", class: "bg-primary/10 text-primary border-primary/30" }; if (state === "error") return { label: "接口异常", class: "bg-metric-low/10 text-metric-low border-metric-low/30" }; if (state === "unavailable") return { label: "未接入", class: "bg-surface-variant text-on-surface-variant border-outline-variant" }; if (score == null) return { label: "已同步", class: "bg-primary/10 text-primary border-primary/30" }; if (score >= 80) return { label: "良好", class: "bg-metric-high/10 text-metric-high border-metric-high/30" }; if (score >= 70) return { label: "一般", class: "bg-metric-warn/10 text-metric-warn border-metric-warn/30" }; return { label: "需改进", class: "bg-metric-low/10 text-metric-low border-metric-low/30" }; }; const scoreNum = metricObj.score; const chartScore = scoreNum ?? 0; const metricStatus = getStateLabel(metricObj.state, metricObj.score); return (

子指标分析

关于 {metricObj.id} 的详细数据维度拆解

{metricObj.subMetrics.map((sub) => { const subStatus = getStateLabel(sub.state, sub.score); const isWarn = sub.state === "error" || (sub.score != null && sub.score < 70); return (
{sub.id}

{sub.name}

{isWarn ? : }
{sub.values.map((val, idx) => { const valueStatus = getStateLabel(val.state, val.score); return (

{val.name}

{val.helperText && (

{val.helperText}

)}
{val.displayValue} {valueStatus.label}
{val.progress != null && (
)}
); })}
{subStatus.label}
); })}
); }