"use client"; import { useState } from "react"; import Link from "next/link"; import { cn } from "@/lib/utils"; import { addDays, dowOf, todayStr } from "@/lib/dates"; import { subjectMeta } from "@/lib/subjects"; import { PlayBtn } from "@/components/play-audio"; import { Button } from "@/components/ui/button"; import type { OverviewData } from "./dashboard"; // 学习概览:按孩子的月日历,展示每日 打卡/语法/周检测,点某天看当日具体任务 export function OverviewTab({ data }: { data: OverviewData }) { const [kidId, setKidId] = useState(data.kids[0]?.id); const [selected, setSelected] = useState(todayStr()); const kid = data.kids.find((k) => k.id === kidId) ?? data.kids[0]; if (!kid) return null; const today = todayStr(); const ym = today.slice(0, 7); const first = `${ym}-01`; const daysInMonth = new Date(Number(ym.slice(0, 4)), Number(ym.slice(5, 7)), 0).getDate(); const lead = (dowOf(first) + 6) % 7; // 周一开头的前导空位数 const dates = Array.from({ length: daysInMonth }, (_, i) => `${ym}-${String(i + 1).padStart(2, "0")}`); return (
{data.kids.map((k) => ( ))}

语法进度

{kid.grammar.done}/{kid.grammar.total}

待掌握错题

{kid.wrongOpen}

最近周测

{kid.weeklyLatest ? `${kid.weeklyLatest.score}分` : "—"}

{["一", "二", "三", "四", "五", "六", "日"].map((w) => (
周{w}
))}
{Array.from({ length: lead }).map((_, i) => (
))} {dates.map((d) => { const c = kid.days[d]; const isToday = d === today; const check = c && c.total > 0 ? (c.done >= c.total && c.done > 0 ? 2 : c.done > 0 ? 1 : 0) : 0; return (
setSelected(d)} title={`${d} 打卡${c?.done ?? 0}/${c?.total ?? 0}`} className={cn( "flex aspect-square cursor-pointer flex-col items-center justify-center rounded-lg border text-sm transition-colors", selected === d ? "border-indigo-400 ring-1 ring-indigo-300" : "border-slate-100 hover:border-indigo-300", "bg-white", )} > {Number(d.slice(8))} {check === 2 && } {check === 1 && } {(c?.grammar ?? 0) > 0 && } {c?.weekly != null && }
); })}

打卡完成 打卡部分 语法点亮 周检测

{selected} {selected === today ? "(今天)" : ""} 的学习详情

{(() => { const cell = kid.days[selected]; if (!cell) return

这一天暂无记录。

; return (

打卡任务

{cell.tasks.length === 0 ? (

无打卡任务

) : (
{cell.tasks.map((t, i) => { const sm = subjectMeta(t.subject); return (
{t.title} {t.status === "done" ? "已完成" : "未完成"}
); })}
)}

英语语法检测

{cell.gtests.length === 0 ? (

当天未做语法检测

) : (
{cell.gtests.map((g, i) => (

{g.title} · {g.score} 分 {g.passed ? "✅" : "❌"}

))}
)}

单词跟读录音

{cell.recs.length === 0 ? (

当天无跟读录音

) : (
{cell.recs.map((r, i) => (
{r.word}
))}
)}
); })()}
); }