import { ChevronDown, ChevronRight, Plus, Trash2, Undo2 } from 'lucide-react'; import { getLanguage } from 'obsidian'; import React, { useEffect, useMemo, useState } from 'react'; import { PREVIEW_VIEW_TYPE } from '../../constants'; import { useApp } from '../../contexts/AppContext'; import { useDiffStrategy } from '../../contexts/DiffStrategyContext'; import { useRAG } from '../../contexts/RAGContext'; import { useSettings } from '../../contexts/SettingsContext'; import { CustomMode, GroupEntry, ToolGroup } from '../../database/json/custom-mode/types'; import { useCustomModes } from '../../hooks/use-custom-mode'; import { PreviewView, PreviewViewState } from '../../PreviewView'; import { modes as buildinModes } from '../../utils/modes'; import { openOrCreateMarkdownFile } from '../../utils/obsidian'; import { PromptGenerator, getFullLanguageName } from '../../utils/prompt-generator'; const CustomModeView = () => { const app = useApp() const { createCustomMode, deleteCustomMode, updateCustomMode, customModeList, customModePrompts } = useCustomModes() const { settings } = useSettings() const { getRAGEngine } = useRAG() const diffStrategy = useDiffStrategy() const promptGenerator = useMemo(() => { // @ts-expect-error return new PromptGenerator(getRAGEngine, app, settings, diffStrategy, customModePrompts, customModeList) }, [app, settings, diffStrategy, customModePrompts, customModeList]) // 当前选择的模式 const [selectedMode, setSelectedMode] = useState('ask') const [isBuiltinMode, setIsBuiltinMode] = useState(true) const [isAdvancedCollapsed, setIsAdvancedCollapsed] = useState(true); const isNewMode = React.useMemo(() => selectedMode === "add_new_mode", [selectedMode]) // new mode config const [newMode, setNewMode] = useState({ id: '', slug: '', name: '', roleDefinition: '', customInstructions: '', groups: [], source: 'global', updatedAt: 0, }) // custom mode id const [customModeId, setCustomModeId] = useState('') // 模型名称 const [modeName, setModeName] = useState('') // 角色定义 const [roleDefinition, setRoleDefinition] = useState('') // 选中的工具组 const [selectedTools, setSelectedTools] = useState([]) // 自定义指令 const [customInstructions, setCustomInstructions] = useState('') // 当模式变更时更新表单数据 useEffect(() => { // new mode if (isNewMode) { setIsBuiltinMode(false); setModeName(newMode.name); setRoleDefinition(newMode.roleDefinition); setCustomInstructions(newMode.customInstructions || ''); setSelectedTools(newMode.groups as GroupEntry[]); setCustomModeId(''); return; } const builtinMode = buildinModes.find(m => m.slug === selectedMode); if (builtinMode) { setIsBuiltinMode(true); setModeName(builtinMode.slug); setRoleDefinition(builtinMode.roleDefinition); setCustomInstructions(builtinMode.customInstructions || ''); setSelectedTools(builtinMode.groups as GroupEntry[]); setCustomModeId(''); // 内置模式没有自定义 ID } else { setIsBuiltinMode(false); const customMode = customModeList.find(m => m.slug === selectedMode); if (customMode) { setCustomModeId(customMode.id || ''); setModeName(customMode.name); setRoleDefinition(customMode.roleDefinition); setCustomInstructions(customMode.customInstructions || ''); setSelectedTools(customMode.groups); } else { console.log("error, custom mode not found") } } }, [selectedMode, customModeList]); // 处理工具组选择变更 const handleToolChange = React.useCallback((tool: ToolGroup) => { if (isNewMode) { setNewMode((prev) => ({ ...prev, groups: prev.groups.includes(tool) ? prev.groups.filter(t => t !== tool) : [...prev.groups, tool] })) } setSelectedTools(prev => { if (prev.includes(tool)) { return prev.filter(t => t !== tool); } else { return [...prev, tool]; } }); }, [isNewMode]) // 更新模式配置 const handleUpdateMode = React.useCallback(async () => { if (!isBuiltinMode) { await updateCustomMode( customModeId, modeName, roleDefinition, customInstructions, selectedTools ); } }, [isBuiltinMode, customModeId, modeName, roleDefinition, customInstructions, selectedTools]) // 创建新模式 const createNewMode = React.useCallback(async () => { if (!isNewMode) return; await createCustomMode( modeName, roleDefinition, customInstructions, selectedTools ); // reset setNewMode({ id: '', slug: '', name: '', roleDefinition: '', customInstructions: '', groups: [], source: 'global', updatedAt: 0, }) setSelectedMode("add_new_mode") }, [isNewMode, modeName, roleDefinition, customInstructions, selectedTools]) // 删除模式 const deleteMode = React.useCallback(async () => { if (isNewMode || isBuiltinMode) return; await deleteCustomMode(customModeId); setModeName('') setRoleDefinition('') setCustomInstructions('') setSelectedTools([]) setSelectedMode('add_new_mode') }, [isNewMode, isBuiltinMode, customModeId]) return (
{/* 模式配置标题和按钮 */}

模式配置

{/*
*/}
{/* 创建模式提示 */}
点击 + 创建模式,创建一个新模式。
{/* 模式选择区 */}
{[...buildinModes, ...customModeList].map(mode => ( ))}
{/* 模式名称 */}

模式名称

{!isBuiltinMode && !isNewMode && ( )}
{ if (isNewMode) { setNewMode((prev) => ({ ...prev, name: e.target.value })) } setModeName(e.target.value) }} className="infio-custom-modes-input" placeholder="输入模式名称..." disabled={isBuiltinMode} />
{/* 角色定义 */}

角色定义

{isBuiltinMode && ( )}

设定专业领域和应答风格