import { useEffect, useMemo, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { LayoutTemplate } from "lucide-react"; import { taskBriefApi, type TaskBriefTemplate } from "@/api/taskBriefs"; import { ConfigSubpageHeader } from "@/components/ai-config/ConfigSubpageHeader"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; export default function TaskBriefTemplatePage() { const queryClient = useQueryClient(); const [selectedId, setSelectedId] = useState(""); const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [content, setContent] = useState(""); const templatesQuery = useQuery({ queryKey: ["task-brief-templates"], queryFn: () => taskBriefApi.listTemplates(), }); const templates = templatesQuery.data || []; const selectedTemplate = useMemo( () => templates.find((item) => item.id === selectedId) || null, [templates, selectedId] ); useEffect(() => { if (!selectedTemplate) return; setName(selectedTemplate.name || ""); setDescription(selectedTemplate.description || ""); setContent(selectedTemplate.content || ""); }, [selectedTemplate]); const createMutation = useMutation({ mutationFn: (payload: { name: string; description: string; content: string }) => taskBriefApi.createTemplate({ name: payload.name, description: payload.description || undefined, content: payload.content, }), onSuccess: (created: TaskBriefTemplate) => { queryClient.invalidateQueries({ queryKey: ["task-brief-templates"] }); setSelectedId(created.id); }, }); const updateMutation = useMutation({ mutationFn: (payload: { id: string; name: string; description: string; content: string }) => taskBriefApi.updateTemplate(payload.id, { name: payload.name, description: payload.description || undefined, content: payload.content, }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["task-brief-templates"] }); }, }); const templatesErrorText = templatesQuery.error instanceof Error ? templatesQuery.error.message : "请检查后端服务。"; return (
} tone="violet" meta={{templatesQuery.isError ? "模板读取失败" : `模板总数 ${templates.length}`}} />
模板编辑器 支持新建与覆盖更新。
setName(e.target.value)} placeholder="模板名称" /> setDescription(e.target.value)} placeholder="模板描述(可选)" />