From 6df5dfc123cf3febf72140c3c28f4764cd6a8af2 Mon Sep 17 00:00:00 2001 From: Jason Date: Sat, 13 Sep 2025 15:36:43 +0800 Subject: [PATCH] style: format codebase with Prettier\n\n- Apply Prettier across src to ensure consistent styling\n- No functional changes; whitespace and ordering only\n- Unblocks format:check for release pipeline --- src/App.tsx | 3 - src/components/ProviderForm.tsx | 139 +++++++++++------- src/components/ProviderForm/ApiKeyInput.tsx | 5 +- .../ProviderForm/CodexConfigEditor.tsx | 8 +- .../ProviderForm/KimiModelSelector.tsx | 13 +- .../ProviderForm/PresetSelector.tsx | 22 ++- src/components/ProviderList.tsx | 14 +- src/components/SettingsModal.tsx | 4 +- src/components/UpdateBadge.tsx | 4 +- src/config/providerPresets.ts | 3 +- src/contexts/UpdateContext.tsx | 31 ++-- src/hooks/useDarkMode.ts | 52 +++---- src/index.css | 4 +- src/lib/styles.ts | 59 +++++--- 14 files changed, 203 insertions(+), 158 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 901130e..ad32991 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -116,7 +116,6 @@ function App() { } }; - // 生成唯一ID const generateId = () => { return crypto.randomUUID(); @@ -204,7 +203,6 @@ function App() { } }; - return (
{/* Linear 风格的顶部导航 */} @@ -270,7 +268,6 @@ function App() { onDelete={handleDeleteProvider} onEdit={setEditingProviderId} /> -
diff --git a/src/components/ProviderForm.tsx b/src/components/ProviderForm.tsx index 6caefa1..855ff02 100644 --- a/src/components/ProviderForm.tsx +++ b/src/components/ProviderForm.tsx @@ -96,10 +96,15 @@ const ProviderForm: React.FC = ({ const [kimiAnthropicModel, setKimiAnthropicModel] = useState(""); const [kimiAnthropicSmallFastModel, setKimiAnthropicSmallFastModel] = useState(""); - + // 初始化自定义模式的默认配置 useEffect(() => { - if (showPresets && selectedPreset === -1 && !initialData && formData.settingsConfig === "") { + if ( + showPresets && + selectedPreset === -1 && + !initialData && + formData.settingsConfig === "" + ) { // 设置自定义模板 const customTemplate = { env: { @@ -108,10 +113,10 @@ const ProviderForm: React.FC = ({ // 可选配置 // ANTHROPIC_MODEL: "your-model-name", // ANTHROPIC_SMALL_FAST_MODEL: "your-fast-model-name" - } + }, }; - - setFormData(prev => ({ + + setFormData((prev) => ({ ...prev, settingsConfig: JSON.stringify(customTemplate, null, 2), })); @@ -138,7 +143,7 @@ const ProviderForm: React.FC = ({ setClaudeModel(config.env.ANTHROPIC_MODEL || ""); setClaudeSmallFastModel(config.env.ANTHROPIC_SMALL_FAST_MODEL || ""); setBaseUrl(config.env.ANTHROPIC_BASE_URL || ""); // 初始化基础 URL - + // 初始化 Kimi 模型选择 setKimiAnthropicModel(config.env.ANTHROPIC_MODEL || ""); setKimiAnthropicSmallFastModel( @@ -155,14 +160,18 @@ const ProviderForm: React.FC = ({ if (!isCodex) { if (selectedPreset !== null && selectedPreset >= 0) { const preset = providerPresets[selectedPreset]; - setCategory(preset?.category || (preset?.isOfficial ? "official" : undefined)); + setCategory( + preset?.category || (preset?.isOfficial ? "official" : undefined), + ); } else if (selectedPreset === -1) { setCategory("custom"); } } else { if (selectedCodexPreset !== null && selectedCodexPreset >= 0) { const preset = codexProviderPresets[selectedCodexPreset]; - setCategory(preset?.category || (preset?.isOfficial ? "official" : undefined)); + setCategory( + preset?.category || (preset?.isOfficial ? "official" : undefined), + ); } else if (selectedCodexPreset === -1) { setCategory("custom"); } @@ -288,7 +297,9 @@ const ProviderForm: React.FC = ({ websiteUrl: preset.websiteUrl, settingsConfig: configString, }); - setCategory(preset.category || (preset.isOfficial ? "official" : undefined)); + setCategory( + preset.category || (preset.isOfficial ? "official" : undefined), + ); // 设置选中的预设 setSelectedPreset(index); @@ -307,11 +318,13 @@ const ProviderForm: React.FC = ({ if (config.env) { setClaudeModel(config.env.ANTHROPIC_MODEL || ""); setClaudeSmallFastModel(config.env.ANTHROPIC_SMALL_FAST_MODEL || ""); - + // 如果是 Kimi 预设,同步 Kimi 模型选择 if (preset.name?.includes("Kimi")) { setKimiAnthropicModel(config.env.ANTHROPIC_MODEL || ""); - setKimiAnthropicSmallFastModel(config.env.ANTHROPIC_SMALL_FAST_MODEL || ""); + setKimiAnthropicSmallFastModel( + config.env.ANTHROPIC_SMALL_FAST_MODEL || "", + ); } } else { setClaudeModel(""); @@ -323,7 +336,7 @@ const ProviderForm: React.FC = ({ // 处理点击自定义按钮 const handleCustomClick = () => { setSelectedPreset(-1); - + // 设置自定义模板 const customTemplate = { env: { @@ -332,9 +345,9 @@ const ProviderForm: React.FC = ({ // 可选配置 // ANTHROPIC_MODEL: "your-model-name", // ANTHROPIC_SMALL_FAST_MODEL: "your-fast-model-name" - } + }, }; - + setFormData({ name: "", websiteUrl: "", @@ -366,7 +379,9 @@ const ProviderForm: React.FC = ({ })); setSelectedCodexPreset(index); - setCategory(preset.category || (preset.isOfficial ? "official" : undefined)); + setCategory( + preset.category || (preset.isOfficial ? "official" : undefined), + ); // 清空 API Key,让用户重新输入 setCodexApiKey(""); @@ -410,17 +425,17 @@ const ProviderForm: React.FC = ({ // 处理基础 URL 变化 const handleBaseUrlChange = (url: string) => { setBaseUrl(url); - + try { const config = JSON.parse(formData.settingsConfig || "{}"); if (!config.env) { config.env = {}; } config.env.ANTHROPIC_BASE_URL = url.trim(); - - setFormData(prev => ({ + + setFormData((prev) => ({ ...prev, - settingsConfig: JSON.stringify(config, null, 2) + settingsConfig: JSON.stringify(config, null, 2), })); } catch { // ignore @@ -442,7 +457,7 @@ const ProviderForm: React.FC = ({ // 根据当前配置决定是否展示 API Key 输入框 // 自定义模式(-1)也需要显示 API Key 输入框 const showApiKey = - (selectedPreset !== null) || + selectedPreset !== null || (!showPresets && hasApiKeyField(formData.settingsConfig)); // 判断当前选中的预设是否是官方 @@ -474,13 +489,18 @@ const ProviderForm: React.FC = ({ const showBaseUrlInput = selectedPreset === -1 && !isCodex; // 判断是否显示"获取 API Key"链接(国产官方、聚合站和第三方显示) - const shouldShowApiKeyLink = !isCodex && !isOfficialPreset && - (category === "cn_official" || category === "aggregator" || category === "third_party" || - (selectedPreset !== null && selectedPreset >= 0 && - (providerPresets[selectedPreset]?.category === "cn_official" || - providerPresets[selectedPreset]?.category === "aggregator" || - providerPresets[selectedPreset]?.category === "third_party"))); - + const shouldShowApiKeyLink = + !isCodex && + !isOfficialPreset && + (category === "cn_official" || + category === "aggregator" || + category === "third_party" || + (selectedPreset !== null && + selectedPreset >= 0 && + (providerPresets[selectedPreset]?.category === "cn_official" || + providerPresets[selectedPreset]?.category === "aggregator" || + providerPresets[selectedPreset]?.category === "third_party"))); + // 获取当前供应商的网址 const getCurrentWebsiteUrl = () => { if (selectedPreset !== null && selectedPreset >= 0) { @@ -522,16 +542,27 @@ const ProviderForm: React.FC = ({ category === "official"; // 判断是否显示 Codex 的"获取 API Key"链接 - const shouldShowCodexApiKeyLink = isCodex && !isCodexOfficialPreset && - (category === "cn_official" || category === "aggregator" || category === "third_party" || - (selectedCodexPreset !== null && selectedCodexPreset >= 0 && - (codexProviderPresets[selectedCodexPreset]?.category === "cn_official" || - codexProviderPresets[selectedCodexPreset]?.category === "aggregator" || - codexProviderPresets[selectedCodexPreset]?.category === "third_party"))); + const shouldShowCodexApiKeyLink = + isCodex && + !isCodexOfficialPreset && + (category === "cn_official" || + category === "aggregator" || + category === "third_party" || + (selectedCodexPreset !== null && + selectedCodexPreset >= 0 && + (codexProviderPresets[selectedCodexPreset]?.category === + "cn_official" || + codexProviderPresets[selectedCodexPreset]?.category === + "aggregator" || + codexProviderPresets[selectedCodexPreset]?.category === + "third_party"))); // 处理模型输入变化,自动更新 JSON 配置 - const handleModelChange = (field: 'ANTHROPIC_MODEL' | 'ANTHROPIC_SMALL_FAST_MODEL', value: string) => { - if (field === 'ANTHROPIC_MODEL') { + const handleModelChange = ( + field: "ANTHROPIC_MODEL" | "ANTHROPIC_SMALL_FAST_MODEL", + value: string, + ) => { + if (field === "ANTHROPIC_MODEL") { setClaudeModel(value); } else { setClaudeSmallFastModel(value); @@ -539,16 +570,18 @@ const ProviderForm: React.FC = ({ // 更新 JSON 配置 try { - const currentConfig = formData.settingsConfig ? JSON.parse(formData.settingsConfig) : { env: {} }; + const currentConfig = formData.settingsConfig + ? JSON.parse(formData.settingsConfig) + : { env: {} }; if (!currentConfig.env) currentConfig.env = {}; - + if (value.trim()) { currentConfig.env[field] = value.trim(); } else { delete currentConfig.env[field]; } - setFormData(prev => ({ + setFormData((prev) => ({ ...prev, settingsConfig: JSON.stringify(currentConfig, null, 2), })); @@ -619,9 +652,7 @@ const ProviderForm: React.FC = ({
{/* Header */}
-

- {title} -

+

{title}

- +

💡 留空将使用供应商的默认模型 @@ -877,7 +910,7 @@ const ProviderForm: React.FC = ({

)} - + diff --git a/src/components/ProviderForm/ApiKeyInput.tsx b/src/components/ProviderForm/ApiKeyInput.tsx index 72a5308..1967238 100644 --- a/src/components/ProviderForm/ApiKeyInput.tsx +++ b/src/components/ProviderForm/ApiKeyInput.tsx @@ -34,10 +34,7 @@ const ApiKeyInput: React.FC = ({ return (
-
); diff --git a/src/components/ProviderForm/KimiModelSelector.tsx b/src/components/ProviderForm/KimiModelSelector.tsx index e3d6fb7..91d1d62 100644 --- a/src/components/ProviderForm/KimiModelSelector.tsx +++ b/src/components/ProviderForm/KimiModelSelector.tsx @@ -98,9 +98,7 @@ const KimiModelSelector: React.FC = ({ onChange: (value: string) => void; }> = ({ label, value, onChange }) => (
- +