import React, { useEffect, useMemo, useState } from 'react'; import { App, Button, Card, Checkbox, Col, Drawer, Empty, Row, Segmented, Space, Tag, Tabs, Typography, } from 'antd'; import { ArrowDownOutlined, ArrowUpOutlined, EyeOutlined, ReloadOutlined, SaveOutlined, StarFilled, } from '@ant-design/icons'; import apiClient from '../utils/apiClient'; import { API_ENDPOINTS, buildApiUrl } from '../config/api'; import PromptManagementPage from './PromptManagementPage'; import MarkdownRenderer from '../components/MarkdownRenderer'; import ActionButton from '../components/ActionButton'; const { Title, Text, Paragraph } = Typography; const TASK_TYPES = [ { label: '总结模版', value: 'MEETING_TASK' }, { label: '知识库模版', value: 'KNOWLEDGE_TASK' }, ]; const TASK_TYPE_OPTIONS = TASK_TYPES.map((item) => ({ label: item.label, value: item.value })); const PromptConfigPage = ({ user }) => { const { message } = App.useApp(); const [taskType, setTaskType] = useState('MEETING_TASK'); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); const [availablePrompts, setAvailablePrompts] = useState([]); const [selectedPromptIds, setSelectedPromptIds] = useState([]); const [viewingPrompt, setViewingPrompt] = useState(null); const loadConfig = async () => { setLoading(true); try { const res = await apiClient.get(buildApiUrl(API_ENDPOINTS.PROMPTS.CONFIG(taskType))); setAvailablePrompts(res.data.available_prompts || []); setSelectedPromptIds(res.data.selected_prompt_ids || []); } catch { message.error('加载提示词配置失败'); } finally { setLoading(false); } }; useEffect(() => { loadConfig(); }, [taskType]); const selectedPromptCards = useMemo(() => { const map = new Map(availablePrompts.map((item) => [item.id, item])); return selectedPromptIds.map((id) => map.get(id)).filter(Boolean); }, [availablePrompts, selectedPromptIds]); const togglePromptSelected = (promptId, checked) => { setSelectedPromptIds((prev) => { if (checked) { if (prev.includes(promptId)) return prev; return [...prev, promptId]; } return prev.filter((id) => id !== promptId); }); }; const moveSelectedPrompt = (promptId, direction) => { setSelectedPromptIds((prev) => { const index = prev.findIndex((id) => id === promptId); if (index === -1) return prev; const target = direction === 'up' ? index - 1 : index + 1; if (target < 0 || target >= prev.length) return prev; const next = [...prev]; [next[index], next[target]] = [next[target], next[index]]; return next; }); }; const saveConfig = async () => { setSaving(true); try { const items = selectedPromptIds.map((promptId, index) => ({ prompt_id: promptId, is_enabled: true, sort_order: index + 1, })); await apiClient.put(buildApiUrl(API_ENDPOINTS.PROMPTS.CONFIG(taskType)), { items }); message.success('提示词配置已保存'); loadConfig(); } catch (error) { message.error(error?.response?.data?.detail || '保存失败'); } finally { setSaving(false); } }; return (