import React, { useState, useEffect } from 'react'; import usePresetStore from '../../../../Store/SideBarLeft/PresetSlice'; import useSideBarLeftStore from '../../../../Store/SideBarLeft/SideBarLeftSlice'; import './Presets.css'; const PresetPanel = () => { const { selectedPreset, parameters, presets, isLoadingPresets, promptComponents, setSelectedPreset, updateParameter, saveCurrentAsPreset, editPresetName: updatePresetName, isParametersExpanded, toggleParametersExpanded, fetchPresets, setPromptComponents, toggleComponentEnabled, updateComponent, addComponent, removeComponent, moveComponent } = usePresetStore(); const [showSaveDialog, setShowSaveDialog] = useState(false); const [showEditDialog, setShowEditDialog] = useState(false); const [showImportDialog, setShowImportDialog] = useState(false); const [showComponentEditDialog, setShowComponentEditDialog] = useState(false); const [newPresetName, setNewPresetName] = useState(''); const [editPresetId, setEditPresetId] = useState(''); const [editPresetName, setEditPresetName] = useState(''); const [importPresetData, setImportPresetData] = useState(''); const [tooltip, setTooltip] = useState({ visible: false, content: '', x: 0, y: 0 }); // 组件编辑状态 const [editingComponentIndex, setEditingComponentIndex] = useState(-1); const [editComponentContent, setEditComponentContent] = useState(''); const [isEditing, setIsEditing] = useState(false); // 拖拽状态 const [draggedItem, setDraggedItem] = useState(null); const [dragOverItem, setDragOverItem] = useState(null); // 获取当前激活的分页 const { activeTab } = useSideBarLeftStore(); // 记录上一次的分页状态 const prevActiveTabRef = React.useRef(activeTab); // 参数描述映射 const parameterDescriptions = { temperature: "生成温度,控制随机性(0-2)", frequency_penalty: "频率惩罚,降低重复token概率", presence_penalty: "存在惩罚,鼓励谈论新话题", top_p: "核采样,控制词汇选择范围", top_k: "随机采样范围,从概率最高的K个词中选择", max_context: "上下文窗口大小(Token上限)", max_tokens: "单次回复的最大长度", max_context_unlocked: "是否允许超出限制的上下文", stream_openai: "是否使用流式输出", seed: "随机种子(-1为随机)", n: "生成回复的数量" }; // 显示工具提示 const showTooltip = (event, content) => { setTooltip({ visible: true, content, x: event.clientX, y: event.clientY }); }; // 隐藏工具提示 const hideTooltip = () => { setTooltip({ ...tooltip, visible: false }); }; // 处理参数更新 const handleParameterChange = (name, value) => { let convertedValue = value; if (name === 'temperature' || name === 'frequency_penalty' || name === 'presence_penalty' || name === 'top_p') { convertedValue = parseFloat(value); } else if (name === 'top_k' || name === 'max_context' || name === 'max_tokens' || name === 'seed' || name === 'n') { convertedValue = parseInt(value, 10); } else if (name === 'max_context_unlocked' || name === 'stream_openai') { convertedValue = value; } updateParameter({ name, value: convertedValue }); }; // 加载预设列表 - 只在切换到预设分页时刷新 useEffect(() => { // 检测是否从其他分页切换到预设分页 if (activeTab === 'presets' && prevActiveTabRef.current !== 'presets') { fetchPresets(); } // 更新上一次的分页状态 prevActiveTabRef.current = activeTab; }, [activeTab, fetchPresets]); // 保存当前设置为预设 const handleSavePreset = async () => { if (newPresetName.trim()) { try { await saveCurrentAsPreset({ name: newPresetName }); setNewPresetName(''); setShowSaveDialog(false); // 重新加载预设列表 fetchPresets(); } catch (error) { console.error('保存预设失败:', error); alert('保存预设失败: ' + error.message); } } }; // 编辑预设名称 const handleEditPreset = async () => { if (editPresetId && editPresetName.trim()) { try { await updatePresetName(editPresetId, editPresetName); setEditPresetId(''); setEditPresetName(''); setShowEditDialog(false); // 重新加载预设列表 fetchPresets(); } catch (error) { console.error('编辑预设名称失败:', error); alert('编辑预设名称失败: ' + error.message); } } }; // 导入预设 const handleImportPreset = async () => { try { const importedPreset = JSON.parse(importPresetData); if (importedPreset.name && importedPreset.parameters) { await saveCurrentAsPreset({ name: importedPreset.name }); // 更新参数 Object.keys(importedPreset.parameters).forEach(key => { updateParameter({ name: key, value: importedPreset.parameters[key] }); }); // 更新组件列表 if (importedPreset.promptComponents) { setPromptComponents(importedPreset.promptComponents); } setImportPresetData(''); setShowImportDialog(false); // 重新加载预设列表 fetchPresets(); } } catch (error) { console.error('导入预设失败:', error); alert('导入预设失败: ' + error.message); } }; // 导出预设 const handleExportPreset = () => { if (selectedPreset) { const preset = presets.find(p => p.id === selectedPreset); if (preset) { const exportData = { ...preset, parameters, promptComponents }; const dataStr = JSON.stringify(exportData, null, 2); const dataBlob = new Blob([dataStr], { type: 'application/json' }); const url = URL.createObjectURL(dataBlob); const link = document.createElement('a'); link.href = url; link.download = `${preset.name}.json`; link.click(); URL.revokeObjectURL(url); } } }; // 添加新组件 const handleAddNewComponent = () => { const newComponent = { identifier: `component_${Date.now()}`, name: '新组件', content: '', role: 0, system_prompt: false, marker: false, enabled: true }; addComponent(newComponent); }; // 开始编辑组件 const handleStartEditComponent = (index) => { setEditingComponentIndex(index); setEditComponentContent(promptComponents[index].content); setIsEditing(true); setShowComponentEditDialog(true); }; // 查看组件内容 const handleViewComponent = (index) => { setEditingComponentIndex(index); setEditComponentContent(promptComponents[index].content); setIsEditing(false); setShowComponentEditDialog(true); }; // 保存组件编辑 const handleSaveComponentEdit = () => { if (editingComponentIndex >= 0 && isEditing) { updateComponent(editingComponentIndex, { content: editComponentContent }); } setEditingComponentIndex(-1); setEditComponentContent(''); setShowComponentEditDialog(false); }; // 取消组件编辑 const handleCancelComponentEdit = () => { setEditingComponentIndex(-1); setEditComponentContent(''); setShowComponentEditDialog(false); }; // 关闭组件查看对话框 const handleCloseComponentView = () => { setEditingComponentIndex(-1); setEditComponentContent(''); setShowComponentEditDialog(false); }; // 切换组件启用状态 const handleToggleComponentEnabled = (index) => { toggleComponentEnabled(index); }; // 删除组件 const handleDeleteComponent = (index) => { if (window.confirm('确定要删除这个组件吗?')) { removeComponent(index); } }; // 拖拽开始 const handleDragStart = (e, index) => { setDraggedItem(index); e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.setData('text/plain', index.toString()); setTimeout(() => { e.target.classList.add('dragging'); }, 0); }; // 拖拽结束 const handleDragEnd = (e) => { setDraggedItem(null); setDragOverItem(null); e.target.classList.remove('dragging'); }; // 拖拽经过 const handleDragOver = (e, index) => { e.preventDefault(); e.dataTransfer.dropEffect = 'move'; if (draggedItem === null || draggedItem === index) return; setDragOverItem(index); }; // 放置 const handleDrop = (e, index) => { e.preventDefault(); if (draggedItem === null || draggedItem === index) return; moveComponent(draggedItem, index); setDraggedItem(null); setDragOverItem(null); }; return (
{/* 工具提示 */} {tooltip.visible && (
{tooltip.content}
)} {/* 顶部:预设选择与操作 */}
{/* 预设选择下拉框 */}
{/* 操作按钮 */}
{/* 保存预设对话框 */} {showSaveDialog && (
setNewPresetName(e.target.value)} placeholder="预设名称" />
)} {/* 编辑预设对话框 */} {showEditDialog && (
setEditPresetName(e.target.value)} placeholder="预设名称" />
)} {/* 导入预设对话框 */} {showImportDialog && (