import { useEffect, useState } from "react"; import { BarChart3, TrendingUp, Users, CheckCircle2 } from "lucide-react"; import { motion } from "motion/react"; import { getDashboardHome, type DashboardActivity, type DashboardHome, type DashboardStat, type DashboardTodo } from "@/lib/auth"; const DASHBOARD_PREVIEW_COUNT = 5; const baseStats = [ { name: "本月新增商机", metricKey: "monthlyOpportunities", icon: TrendingUp, color: "text-emerald-600 dark:text-emerald-400", bg: "bg-emerald-100 dark:bg-emerald-500/20" }, { name: "跟进中客户", metricKey: "followingCustomers", icon: Users, color: "text-blue-600 dark:text-blue-400", bg: "bg-blue-100 dark:bg-blue-500/20" }, { name: "已成单项目", metricKey: "wonProjects", icon: CheckCircle2, color: "text-violet-600 dark:text-violet-400", bg: "bg-violet-100 dark:bg-violet-500/20" }, { name: "本月打卡天数", metricKey: "monthlyCheckins", icon: BarChart3, color: "text-amber-600 dark:text-amber-400", bg: "bg-amber-100 dark:bg-amber-500/20" }, ] as const; export default function Dashboard() { const [home, setHome] = useState({}); const [showAllTodos, setShowAllTodos] = useState(false); const [showAllActivities, setShowAllActivities] = useState(false); useEffect(() => { let cancelled = false; async function loadDashboard() { try { const data = await getDashboardHome(); if (!cancelled) { setHome(data ?? {}); } } catch { if (!cancelled) { setHome({}); } } } void loadDashboard(); return () => { cancelled = true; }; }, []); useEffect(() => { setShowAllTodos(false); setShowAllActivities(false); }, [home.todos, home.activities]); const statMap = new Map((home.stats ?? []).map((item: DashboardStat) => [item.metricKey, item.value])); const stats = baseStats.map((stat) => ({ ...stat, value: statMap.get(stat.metricKey), })); const todos = (home.todos?.length ? home.todos : [{ id: 0, title: "无" }]) as DashboardTodo[]; const activities = (home.activities?.length ? home.activities : [{ id: 0, title: "无", content: "无", timeText: "无" }]) as DashboardActivity[]; const visibleTodos = showAllTodos ? todos : todos.slice(0, DASHBOARD_PREVIEW_COUNT); const visibleActivities = showAllActivities ? activities : activities.slice(0, DASHBOARD_PREVIEW_COUNT); const hasMoreTodos = todos.length > DASHBOARD_PREVIEW_COUNT && todos[0]?.id !== 0; const hasMoreActivities = activities.length > DASHBOARD_PREVIEW_COUNT && activities[0]?.id !== 0; return (

工作台

欢迎回来,{home.realName || "无"}。今天是你入职的第 {home.onboardingDays ?? 0} 天。

{stats.map((stat, i) => (

{stat.name}

{stat.value ?? 0}

))}

待办事项

    {visibleTodos.map((task: DashboardTodo, i: number) => (
  • {task.title || "无"}
  • ))}
{hasMoreTodos && !showAllTodos ? ( ) : null}

最新动态

{visibleActivities.map((news: DashboardActivity, i: number) => (

{news.title || "无"}

{news.content || "无"}

{news.timeText || "无"}

))}
{hasMoreActivities && !showAllActivities ? ( ) : null}
); }