From e06c6176d9d183eadbfb91faf154f94567ce4f1f Mon Sep 17 00:00:00 2001 From: Jason Date: Fri, 16 Jan 2026 21:03:33 +0800 Subject: [PATCH] fix(opencode): hide common config snippet UI and prevent auto-merge - Add `enabled` parameter to useCommonConfigSnippet hook - Skip all loading and auto-merge logic when enabled=false - Replace CommonConfigEditor with simplified JsonEditor for OpenCode - Prevent Claude's common config snippet from being injected into OpenCode --- .../providers/forms/ProviderForm.tsx | 35 +++++++++++-------- .../forms/hooks/useCommonConfigSnippet.ts | 20 ++++++++--- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/components/providers/forms/ProviderForm.tsx b/src/components/providers/forms/ProviderForm.tsx index d144731a9..2da87ac65 100644 --- a/src/components/providers/forms/ProviderForm.tsx +++ b/src/components/providers/forms/ProviderForm.tsx @@ -33,6 +33,8 @@ import { getCodexCustomTemplate } from "@/config/codexTemplates"; import CodexConfigEditor from "./CodexConfigEditor"; import { CommonConfigEditor } from "./CommonConfigEditor"; import GeminiConfigEditor from "./GeminiConfigEditor"; +import JsonEditor from "@/components/JsonEditor"; +import { Label } from "@/components/ui/label"; import { ProviderPresetSelector } from "./ProviderPresetSelector"; import { BasicFormFields } from "./BasicFormFields"; import { ClaudeFormFields } from "./ClaudeFormFields"; @@ -389,6 +391,7 @@ export function ProviderForm({ onConfigChange: (config) => form.setValue("settingsConfig", config), initialData: appId === "claude" ? initialData : undefined, selectedPresetId: selectedPresetId ?? undefined, + enabled: appId === "claude", }); // 使用 Codex 通用配置片段 hook (仅 Codex 模式) @@ -1145,20 +1148,24 @@ export function ProviderForm({ ) : appId === "opencode" ? ( <> - form.setValue("settingsConfig", config)} - useCommonConfig={false} - onCommonConfigToggle={() => {}} - commonConfigSnippet="" - onCommonConfigSnippetChange={() => {}} - commonConfigError="" - onEditClick={() => {}} - isModalOpen={false} - onModalClose={() => {}} - onExtract={() => Promise.resolve()} - isExtracting={false} - /> +
+ + form.setValue("settingsConfig", config)} + placeholder={`{ + "npm": "@ai-sdk/openai-compatible", + "options": { + "baseURL": "https://your-api-endpoint.com", + "apiKey": "your-api-key-here" + }, + "models": {} +}`} + rows={14} + showValidation={true} + language="json" + /> +
; }; selectedPresetId?: string; + /** When false, the hook skips all logic and returns disabled state. Default: true */ + enabled?: boolean; } /** @@ -30,6 +32,7 @@ export function useCommonConfigSnippet({ onConfigChange, initialData, selectedPresetId, + enabled = true, }: UseCommonConfigSnippetProps) { const { t } = useTranslation(); const [useCommonConfig, setUseCommonConfig] = useState(false); @@ -47,11 +50,16 @@ export function useCommonConfigSnippet({ // 当预设变化时,重置初始化标记,使新预设能够重新触发初始化逻辑 useEffect(() => { + if (!enabled) return; hasInitializedNewMode.current = false; - }, [selectedPresetId]); + }, [selectedPresetId, enabled]); // 初始化:从 config.json 加载,支持从 localStorage 迁移 useEffect(() => { + if (!enabled) { + setIsLoading(false); + return; + } let mounted = true; const loadSnippet = async () => { @@ -100,10 +108,11 @@ export function useCommonConfigSnippet({ return () => { mounted = false; }; - }, []); + }, [enabled]); // 初始化时检查通用配置片段(编辑模式) useEffect(() => { + if (!enabled) return; if (initialData && !isLoading) { const configString = JSON.stringify(initialData.settingsConfig, null, 2); const hasCommon = hasCommonConfigSnippet( @@ -112,10 +121,11 @@ export function useCommonConfigSnippet({ ); setUseCommonConfig(hasCommon); } - }, [initialData, commonConfigSnippet, isLoading]); + }, [enabled, initialData, commonConfigSnippet, isLoading]); // 新建模式:如果通用配置片段存在且有效,默认启用 useEffect(() => { + if (!enabled) return; // 仅新建模式、加载完成、尚未初始化过 if (!initialData && !isLoading && !hasInitializedNewMode.current) { hasInitializedNewMode.current = true; @@ -145,6 +155,7 @@ export function useCommonConfigSnippet({ } } }, [ + enabled, initialData, commonConfigSnippet, isLoading, @@ -259,6 +270,7 @@ export function useCommonConfigSnippet({ // 当配置变化时检查是否包含通用配置(但避免在通过通用配置更新时检查) useEffect(() => { + if (!enabled) return; if (isUpdatingFromCommonConfig.current || isLoading) { return; } @@ -267,7 +279,7 @@ export function useCommonConfigSnippet({ commonConfigSnippet, ); setUseCommonConfig(hasCommon); - }, [settingsConfig, commonConfigSnippet, isLoading]); + }, [enabled, settingsConfig, commonConfigSnippet, isLoading]); // 从编辑器当前内容提取通用配置片段 const handleExtract = useCallback(async () => {