import { useState, useCallback, useEffect } from 'react'; import { PromptGroup, Prompt, DslFile } from '../types'; import useLocalStorage from './useLocalStorage'; /** * 自定义钩子,用于管理提示词组数据 */ function usePromptGroups() { // 从本地存储获取提示词组数据 const [savedPromptGroups, setSavedPromptGroups, clearSavedPromptGroups] = useLocalStorage('promptGroups', []); // 状态管理当前提示词组数据 const [promptGroups, setPromptGroups] = useState(processSavedPromptGroups(savedPromptGroups)); // 处理保存的提示词组数据,将日期字符串转换为Date对象 function processSavedPromptGroups(groups: PromptGroup[]): PromptGroup[] { return groups.map(group => ({ ...group, // 不要将字符串转换为 Date 对象 createdAt: group.createdAt, updatedAt: group.updatedAt, prompts: group.prompts.map(prompt => ({ ...prompt, createdAt: prompt.createdAt, updatedAt: prompt.updatedAt, })), dslFiles: group.dslFiles.map(file => ({ ...file, uploadedAt: file.uploadedAt, })), })); } // 当本地存储数据变化时更新状态 useEffect(() => { setPromptGroups(processSavedPromptGroups(savedPromptGroups)); }, [savedPromptGroups]); // 生成唯一ID const generateId = useCallback(() => { return Date.now().toString(36) + Math.random().toString(36).substr(2); }, []); // 添加提示词组 const addPromptGroup = useCallback((promptGroup: Omit) => { const now = new Date().toISOString(); const newPromptGroup: PromptGroup = { ...promptGroup, _id: generateId(), createdAt: now, updatedAt: now, prompts: [], workflows: [], dslFiles: [] }; setSavedPromptGroups(prev => [...prev, newPromptGroup]); return newPromptGroup; }, [generateId, setSavedPromptGroups]); // 更新提示词组 const updatePromptGroup = useCallback((id: string, promptGroup: Omit) => { const now = new Date().toISOString(); setSavedPromptGroups(prev => prev.map(group => group._id === id ? { ...group, name: promptGroup.name, description: promptGroup.description, category: promptGroup.category, updatedAt: now } : group ) ); }, [setSavedPromptGroups]); // 删除提示词组 const deletePromptGroup = useCallback((id: string) => { setSavedPromptGroups(prev => prev.filter(group => group._id !== id)); }, [setSavedPromptGroups]); // 添加提示词 const addPrompt = useCallback((groupId: string, prompt: Omit) => { const now = new Date().toISOString(); const newPrompt: Prompt = { ...prompt, _id: generateId(), createdAt: now, updatedAt: now }; setSavedPromptGroups(prev => prev.map(group => { if (group._id === groupId) { return { ...group, prompts: [...group.prompts, newPrompt], updatedAt: now }; } return group; }) ); return newPrompt; }, [generateId, setSavedPromptGroups]); // 更新提示词 // 更新提示词方法 const updatePrompt = useCallback((groupId: string, promptId: string, promptData: { title: string; content: string; tags: string[] }) => { const now = new Date().toISOString(); setSavedPromptGroups(prev => prev.map(group => { if (group._id === groupId) { return { ...group, prompts: group.prompts.map(p => p._id === promptId ? { ...p, title: promptData.title, content: promptData.content, tags: promptData.tags, updatedAt: now } : p ), updatedAt: now }; } return group; }) ); }, [setSavedPromptGroups]); // 删除提示词 const deletePrompt = useCallback((groupId: string, promptId: string) => { const now = new Date().toISOString(); setSavedPromptGroups(prev => prev.map(group => { if (group._id === groupId) { return { ...group, prompts: group.prompts.filter(p => p._id !== promptId), updatedAt: now }; } return group; }) ); }, [setSavedPromptGroups]); // 添加工作流 const addWorkflow = useCallback((groupId: string, workflow: string) => { const now = new Date().toISOString(); setSavedPromptGroups(prev => prev.map(group => { if (group._id === groupId) { return { ...group, workflows: [...group.workflows, workflow], updatedAt: now }; } return group; }) ); }, [setSavedPromptGroups]); // 删除工作流 const deleteWorkflow = useCallback((groupId: string, workflowIndex: number) => { const now = new Date().toISOString(); setSavedPromptGroups(prev => prev.map(group => { if (group._id === groupId) { const newWorkflows = [...group.workflows]; newWorkflows.splice(workflowIndex, 1); return { ...group, workflows: newWorkflows, updatedAt: now }; } return group; }) ); }, [setSavedPromptGroups]); // 添加DSL文件 const addDslFile = useCallback((groupId: string, dslFile: Omit) => { const now = new Date().toISOString(); const newDslFile: DslFile = { ...dslFile, _id: generateId(), uploadedAt: now }; setSavedPromptGroups(prev => prev.map(group => { if (group._id === groupId) { return { ...group, dslFiles: [...group.dslFiles, newDslFile], updatedAt: now }; } return group; }) ); return newDslFile; }, [generateId, setSavedPromptGroups]); // 删除DSL文件 const deleteDslFile = useCallback((groupId: string, fileId: string) => { const now = new Date().toISOString(); setSavedPromptGroups(prev => prev.map(group => { if (group._id === groupId) { return { ...group, dslFiles: group.dslFiles.filter(file => file._id !== fileId), updatedAt: now }; } return group; }) ); }, [setSavedPromptGroups]); // 清除所有提示词组数据 const clearAllData = useCallback(() => { clearSavedPromptGroups(); }, [clearSavedPromptGroups]); return { promptGroups, addPromptGroup, updatePromptGroup, deletePromptGroup, addPrompt, updatePrompt, deletePrompt, addWorkflow, deleteWorkflow, addDslFile, deleteDslFile, clearAllData }; } export default usePromptGroups;