diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx index e2a1c0c..7a1306d 100644 --- a/src/components/ConfirmDialog.tsx +++ b/src/components/ConfirmDialog.tsx @@ -1,5 +1,6 @@ import React from "react"; import { AlertTriangle, X } from "lucide-react"; +import { isLinux } from "../lib/platform"; interface ConfirmDialogProps { isOpen: boolean; @@ -26,7 +27,7 @@ export const ConfirmDialog: React.FC = ({
{/* Backdrop */}
diff --git a/src/components/ProviderForm.tsx b/src/components/ProviderForm.tsx index 9045e78..58fdef9 100644 --- a/src/components/ProviderForm.tsx +++ b/src/components/ProviderForm.tsx @@ -19,6 +19,7 @@ import ClaudeConfigEditor from "./ProviderForm/ClaudeConfigEditor"; import CodexConfigEditor from "./ProviderForm/CodexConfigEditor"; import KimiModelSelector from "./ProviderForm/KimiModelSelector"; import { X, AlertCircle, Save } from "lucide-react"; +import { isLinux } from "../lib/platform"; // 分类仅用于控制少量交互(如官方禁用 API Key),不显示介绍组件 const COMMON_CONFIG_STORAGE_KEY = "cc-switch:common-config-snippet"; @@ -966,7 +967,11 @@ const ProviderForm: React.FC = ({ }} > {/* Backdrop */} -
+
{/* Modal */}
diff --git a/src/components/ProviderForm/ClaudeConfigEditor.tsx b/src/components/ProviderForm/ClaudeConfigEditor.tsx index 03aa98b..b7ecaa1 100644 --- a/src/components/ProviderForm/ClaudeConfigEditor.tsx +++ b/src/components/ProviderForm/ClaudeConfigEditor.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; import JsonEditor from "../JsonEditor"; import { X, Save } from "lucide-react"; +import { isLinux } from "../../lib/platform"; interface ClaudeConfigEditorProps { value: string; @@ -133,7 +134,11 @@ const ClaudeConfigEditor: React.FC = ({ }} > {/* Backdrop - 统一背景样式 */} -
+
{/* Modal - 统一窗口样式 */}
diff --git a/src/components/ProviderForm/CodexConfigEditor.tsx b/src/components/ProviderForm/CodexConfigEditor.tsx index 69b0ed9..415a7d5 100644 --- a/src/components/ProviderForm/CodexConfigEditor.tsx +++ b/src/components/ProviderForm/CodexConfigEditor.tsx @@ -1,5 +1,6 @@ import React, { useState, useEffect } from "react"; import { X, Save } from "lucide-react"; +import { isLinux } from "../../lib/platform"; interface CodexConfigEditorProps { authValue: string; @@ -166,7 +167,11 @@ const CodexConfigEditor: React.FC = ({ }} > {/* Backdrop - 统一背景样式 */} -
+
{/* Modal - 统一窗口样式 */}
diff --git a/src/components/SettingsModal.tsx b/src/components/SettingsModal.tsx index e4f5b42..2ed48e6 100644 --- a/src/components/SettingsModal.tsx +++ b/src/components/SettingsModal.tsx @@ -12,6 +12,7 @@ import "../lib/tauri-api"; import { relaunchApp } from "../lib/updater"; import { useUpdate } from "../contexts/UpdateContext"; import type { Settings } from "../types"; +import { isLinux } from "../lib/platform"; interface SettingsModalProps { onClose: () => void; @@ -163,7 +164,11 @@ export default function SettingsModal({ onClose }: SettingsModalProps) { if (e.target === e.currentTarget) onClose(); }} > -
+
{/* 标题栏 */}
diff --git a/src/lib/platform.ts b/src/lib/platform.ts new file mode 100644 index 0000000..adcc402 --- /dev/null +++ b/src/lib/platform.ts @@ -0,0 +1,30 @@ +// 轻量平台检测,避免在 SSR 或无 navigator 的环境报错 +export const isMac = (): boolean => { + try { + const ua = navigator.userAgent || ""; + const plat = (navigator.platform || "").toLowerCase(); + return /mac/i.test(ua) || plat.includes("mac"); + } catch { + return false; + } +}; + +export const isWindows = (): boolean => { + try { + const ua = navigator.userAgent || ""; + return /windows|win32|win64/i.test(ua); + } catch { + return false; + } +}; + +export const isLinux = (): boolean => { + try { + const ua = navigator.userAgent || ""; + // WebKitGTK/Chromium 在 Linux/Wayland/X11 下 UA 通常包含 Linux 或 X11 + return /linux|x11/i.test(ua) && !/android/i.test(ua) && !isMac() && !isWindows(); + } catch { + return false; + } +}; +