"use client"; import { useEffect, useState } from "react"; import {Sparkles } from "lucide-react"; import { listAARs, generateAAR } from "@/lib/api-v2"; import { PageContainer, Card} from "@/components/shared/PageContainer"; import { LoadingSpinner } from "@/components/shared/LoadingSpinner"; import { EmptyState } from "@/components/shared/EmptyState"; import { toast } from "sonner"; /** AAR 复盘记录项。 */ interface AARItem { trigger_event: string; gap_analysis?: string; lessons?: string[]; } export default function AARsPage() { const [items, setItems] = useState([]); const [isLoading, setIsLoading] = useState(true); const [triggerEvent, setTriggerEvent] = useState(""); const [originalPlan, setOriginalPlan] = useState(""); const [actualResult, setActualResult] = useState(""); useEffect(() => { listAARs() .then((resp) => setItems((resp.data as AARItem[]) ?? [])) .catch(() => setItems([])) .finally(() => setIsLoading(false)); }, []); const handleGenerate = async () => { if (!triggerEvent.trim()) { toast.error("请输入触发事件"); return; } try { const resp = await generateAAR(triggerEvent, originalPlan, actualResult); setItems([resp.data as AARItem, ...items]); toast.success("AAR 复盘已生成"); } catch { toast.error("生成失败"); } }; return (

生成 AAR 复盘

setTriggerEvent(e.target.value)} placeholder="触发事件" className="mt-2 w-full rounded-md border border-gray-300 px-3 py-1.5 text-sm" /> setOriginalPlan(e.target.value)} placeholder="原计划" className="mt-2 w-full rounded-md border border-gray-300 px-3 py-1.5 text-sm" /> setActualResult(e.target.value)} placeholder="实际结果" className="mt-2 w-full rounded-md border border-gray-300 px-3 py-1.5 text-sm" />
{isLoading ? ( ) : items.length === 0 ? ( ) : (
{items.map((item, i) => (

{item.trigger_event}

{item.gap_analysis &&

{item.gap_analysis}

} {Array.isArray(item.lessons) && (
{item.lessons.map((lesson, li) => (

• {lesson}

))}
)}
))}
)}
); }