diff --git a/src-tauri/src/commands/misc.rs b/src-tauri/src/commands/misc.rs index 387f0b78..887bbd19 100644 --- a/src-tauri/src/commands/misc.rs +++ b/src-tauri/src/commands/misc.rs @@ -605,8 +605,7 @@ exec bash --norc --noprofile script_file = script_file.display() ); - std::fs::write(&script_file, &script_content) - .map_err(|e| format!("写入启动脚本失败: {e}"))?; + std::fs::write(&script_file, &script_content).map_err(|e| format!("写入启动脚本失败: {e}"))?; // Make script executable std::fs::set_permissions(&script_file, std::fs::Permissions::from_mode(0o755)) @@ -675,8 +674,7 @@ exec bash --norc --noprofile script_file = script_file.display() ); - std::fs::write(&script_file, &script_content) - .map_err(|e| format!("写入启动脚本失败: {e}"))?; + std::fs::write(&script_file, &script_content).map_err(|e| format!("写入启动脚本失败: {e}"))?; std::fs::set_permissions(&script_file, std::fs::Permissions::from_mode(0o755)) .map_err(|e| format!("设置脚本权限失败: {e}"))?; diff --git a/src-tauri/src/proxy/types.rs b/src-tauri/src/proxy/types.rs index 91943c54..cbb20f98 100644 --- a/src-tauri/src/proxy/types.rs +++ b/src-tauri/src/proxy/types.rs @@ -316,30 +316,48 @@ mod tests { #[test] fn test_log_config_to_level_filter() { - let mut config = LogConfig::default(); - - config.level = "error".to_string(); + let config = LogConfig { + level: "error".to_string(), + ..Default::default() + }; assert_eq!(config.to_level_filter(), log::LevelFilter::Error); - config.level = "warn".to_string(); + let config = LogConfig { + level: "warn".to_string(), + ..Default::default() + }; assert_eq!(config.to_level_filter(), log::LevelFilter::Warn); - config.level = "info".to_string(); + let config = LogConfig { + level: "info".to_string(), + ..Default::default() + }; assert_eq!(config.to_level_filter(), log::LevelFilter::Info); - config.level = "debug".to_string(); + let config = LogConfig { + level: "debug".to_string(), + ..Default::default() + }; assert_eq!(config.to_level_filter(), log::LevelFilter::Debug); - config.level = "trace".to_string(); + let config = LogConfig { + level: "trace".to_string(), + ..Default::default() + }; assert_eq!(config.to_level_filter(), log::LevelFilter::Trace); // 无效级别回退到 info - config.level = "invalid".to_string(); + let config = LogConfig { + level: "invalid".to_string(), + ..Default::default() + }; assert_eq!(config.to_level_filter(), log::LevelFilter::Info); // 禁用时返回 Off - config.enabled = false; - config.level = "debug".to_string(); + let config = LogConfig { + enabled: false, + level: "debug".to_string(), + }; assert_eq!(config.to_level_filter(), log::LevelFilter::Off); } diff --git a/src/App.tsx b/src/App.tsx index e857e152..29be74cb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -893,7 +893,10 @@ function App() { activeApp={activeApp} onSwitch={setActiveApp} visibleApps={visibleApps} - compact={isCurrentAppTakeoverActive && Object.values(visibleApps).filter(Boolean).length >= 3} + compact={ + isCurrentAppTakeoverActive && + Object.values(visibleApps).filter(Boolean).length >= 3 + } />
diff --git a/src/components/AppSwitcher.tsx b/src/components/AppSwitcher.tsx index 6ee8ce0a..bdb817b2 100644 --- a/src/components/AppSwitcher.tsx +++ b/src/components/AppSwitcher.tsx @@ -11,7 +11,12 @@ interface AppSwitcherProps { const ALL_APPS: AppId[] = ["claude", "codex", "gemini", "opencode"]; -export function AppSwitcher({ activeApp, onSwitch, visibleApps, compact }: AppSwitcherProps) { +export function AppSwitcher({ + activeApp, + onSwitch, + visibleApps, + compact, +}: AppSwitcherProps) { const handleSwitch = (app: AppId) => { if (app === activeApp) return; onSwitch(app); diff --git a/src/components/providers/forms/hooks/useModelState.ts b/src/components/providers/forms/hooks/useModelState.ts index b852a10c..5da7692f 100644 --- a/src/components/providers/forms/hooks/useModelState.ts +++ b/src/components/providers/forms/hooks/useModelState.ts @@ -31,15 +31,15 @@ export function useModelState({ if (lastConfigRef.current === settingsConfig) { return; } - + if (isUserEditingRef.current) { isUserEditingRef.current = false; lastConfigRef.current = settingsConfig; return; } - + lastConfigRef.current = settingsConfig; - + try { const cfg = settingsConfig ? JSON.parse(settingsConfig) : {}; const env = cfg?.env || {}; diff --git a/src/components/settings/AppVisibilitySettings.tsx b/src/components/settings/AppVisibilitySettings.tsx index a610c3a1..2c8fc41d 100644 --- a/src/components/settings/AppVisibilitySettings.tsx +++ b/src/components/settings/AppVisibilitySettings.tsx @@ -22,7 +22,10 @@ const APP_CONFIG: Array<{ { id: "opencode", icon: "opencode", nameKey: "apps.opencode" }, ]; -export function AppVisibilitySettings({ settings, onChange }: AppVisibilitySettingsProps) { +export function AppVisibilitySettings({ + settings, + onChange, +}: AppVisibilitySettingsProps) { const { t } = useTranslation(); const visibleApps: VisibleApps = settings.visibleApps ?? { @@ -51,7 +54,9 @@ export function AppVisibilitySettings({ settings, onChange }: AppVisibilitySetti return (
-

{t("settings.appVisibility.title")}

+

+ {t("settings.appVisibility.title")} +

{t("settings.appVisibility.description")}

diff --git a/tests/components/ProviderList.test.tsx b/tests/components/ProviderList.test.tsx index 5c8f6b3d..40f21ceb 100644 --- a/tests/components/ProviderList.test.tsx +++ b/tests/components/ProviderList.test.tsx @@ -1,5 +1,7 @@ import { render, screen, fireEvent } from "@testing-library/react"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { describe, it, expect, vi, beforeEach } from "vitest"; +import type { ReactElement } from "react"; import type { Provider } from "@/types"; import { ProviderList } from "@/components/providers/ProviderList"; @@ -108,6 +110,16 @@ function createProvider(overrides: Partial = {}): Provider { }; } +function renderWithQueryClient(ui: ReactElement) { + const queryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }); + + return render( + {ui}, + ); +} + beforeEach(() => { useDragSortMock.mockReset(); useSortableMock.mockReset(); @@ -131,7 +143,7 @@ beforeEach(() => { describe("ProviderList Component", () => { it("should render skeleton placeholders when loading", () => { - const { container } = render( + const { container } = renderWithQueryClient( { handleDragEnd: vi.fn(), }); - render( + renderWithQueryClient( { handleDragEnd: vi.fn(), }); - render( + renderWithQueryClient( { handleDragEnd: vi.fn(), }); - render( + renderWithQueryClient(