refactor: remove config file location display feature

Remove the config file location display from settings dialog to simplify
the user interface. Users who need to access the config file can still do
so through the advanced settings section.

Changes:
- Removed ConfigPathDisplay component and its usage
- Removed configPath and openConfigFolder from useSettings hook
- Removed configPath and openConfigFolder from useSettingsMetadata hook
- Removed related i18n keys: configFileLocation, openFolder
- Updated settings dialog to remove the config path display section

This simplifies the settings UI while maintaining access to config
directory management through the advanced settings tab.
This commit is contained in:
Jason
2025-10-17 23:46:44 +08:00
parent e6b66f425a
commit 5ebe23abc8
6 changed files with 1 additions and 90 deletions

View File

@@ -1,41 +0,0 @@
import { FolderOpen } from "lucide-react";
import { Button } from "@/components/ui/button";
import { useTranslation } from "react-i18next";
interface ConfigPathDisplayProps {
path: string;
onOpen: () => Promise<void> | void;
}
export function ConfigPathDisplay({ path, onOpen }: ConfigPathDisplayProps) {
const { t } = useTranslation();
return (
<section className="space-y-2">
<header className="space-y-1">
<h3 className="text-sm font-medium">
{t("settings.configFileLocation")}
</h3>
<p className="text-xs text-muted-foreground">
{t("settings.configFileLocationHint", {
defaultValue: "显示当前使用的配置文件路径。",
})}
</p>
</header>
<div className="flex items-center gap-2">
<span className="flex-1 truncate rounded-md border border-dashed border-border bg-muted/40 px-3 py-2 text-xs font-mono">
{path || t("common.loading")}
</span>
<Button
type="button"
variant="outline"
size="icon"
onClick={onOpen}
title={t("settings.openFolder")}
>
<FolderOpen className="h-4 w-4" />
</Button>
</div>
</section>
);
}

View File

@@ -13,7 +13,6 @@ import { Button } from "@/components/ui/button";
import { settingsApi } from "@/lib/api"; import { settingsApi } from "@/lib/api";
import { LanguageSettings } from "@/components/settings/LanguageSettings"; import { LanguageSettings } from "@/components/settings/LanguageSettings";
import { WindowSettings } from "@/components/settings/WindowSettings"; import { WindowSettings } from "@/components/settings/WindowSettings";
import { ConfigPathDisplay } from "@/components/settings/ConfigPathDisplay";
import { DirectorySettings } from "@/components/settings/DirectorySettings"; import { DirectorySettings } from "@/components/settings/DirectorySettings";
import { ImportExportSection } from "@/components/settings/ImportExportSection"; import { ImportExportSection } from "@/components/settings/ImportExportSection";
import { AboutSection } from "@/components/settings/AboutSection"; import { AboutSection } from "@/components/settings/AboutSection";
@@ -38,7 +37,6 @@ export function SettingsDialog({
isLoading, isLoading,
isSaving, isSaving,
isPortable, isPortable,
configPath,
appConfigDir, appConfigDir,
resolvedDirs, resolvedDirs,
updateSettings, updateSettings,
@@ -48,7 +46,6 @@ export function SettingsDialog({
browseAppConfigDir, browseAppConfigDir,
resetDirectory, resetDirectory,
resetAppConfigDir, resetAppConfigDir,
openConfigFolder,
saveSettings, saveSettings,
resetSettings, resetSettings,
requiresRestart, requiresRestart,
@@ -208,10 +205,6 @@ export function SettingsDialog({
settings={settings} settings={settings}
onChange={updateSettings} onChange={updateSettings}
/> />
<ConfigPathDisplay
path={configPath}
onOpen={openConfigFolder}
/>
</> </>
) : null} ) : null}
</TabsContent> </TabsContent>

View File

@@ -25,7 +25,6 @@ export interface UseSettingsResult {
isLoading: boolean; isLoading: boolean;
isSaving: boolean; isSaving: boolean;
isPortable: boolean; isPortable: boolean;
configPath: string;
appConfigDir?: string; appConfigDir?: string;
resolvedDirs: ResolvedDirectories; resolvedDirs: ResolvedDirectories;
requiresRestart: boolean; requiresRestart: boolean;
@@ -36,7 +35,6 @@ export interface UseSettingsResult {
browseAppConfigDir: () => Promise<void>; browseAppConfigDir: () => Promise<void>;
resetDirectory: (app: AppType) => Promise<void>; resetDirectory: (app: AppType) => Promise<void>;
resetAppConfigDir: () => Promise<void>; resetAppConfigDir: () => Promise<void>;
openConfigFolder: () => Promise<void>;
saveSettings: () => Promise<SaveResult | null>; saveSettings: () => Promise<SaveResult | null>;
resetSettings: () => void; resetSettings: () => void;
acknowledgeRestart: () => void; acknowledgeRestart: () => void;
@@ -92,11 +90,9 @@ export function useSettings(): UseSettingsResult {
// 3⃣ 元数据管理 // 3⃣ 元数据管理
const { const {
configPath,
isPortable, isPortable,
requiresRestart, requiresRestart,
isLoading: isMetadataLoading, isLoading: isMetadataLoading,
openConfigFolder,
acknowledgeRestart, acknowledgeRestart,
setRequiresRestart, setRequiresRestart,
} = useSettingsMetadata(); } = useSettingsMetadata();
@@ -195,7 +191,6 @@ export function useSettings(): UseSettingsResult {
isLoading, isLoading,
isSaving: saveMutation.isPending, isSaving: saveMutation.isPending,
isPortable, isPortable,
configPath,
appConfigDir, appConfigDir,
resolvedDirs, resolvedDirs,
requiresRestart, requiresRestart,
@@ -206,7 +201,6 @@ export function useSettings(): UseSettingsResult {
browseAppConfigDir, browseAppConfigDir,
resetDirectory, resetDirectory,
resetAppConfigDir, resetAppConfigDir,
openConfigFolder,
saveSettings, saveSettings,
resetSettings, resetSettings,
acknowledgeRestart, acknowledgeRestart,

View File

@@ -1,14 +1,10 @@
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { toast } from "sonner";
import { settingsApi } from "@/lib/api"; import { settingsApi } from "@/lib/api";
export interface UseSettingsMetadataResult { export interface UseSettingsMetadataResult {
configPath: string;
isPortable: boolean; isPortable: boolean;
requiresRestart: boolean; requiresRestart: boolean;
isLoading: boolean; isLoading: boolean;
openConfigFolder: () => Promise<void>;
acknowledgeRestart: () => void; acknowledgeRestart: () => void;
setRequiresRestart: (value: boolean) => void; setRequiresRestart: (value: boolean) => void;
} }
@@ -16,15 +12,10 @@ export interface UseSettingsMetadataResult {
/** /**
* useSettingsMetadata - 元数据管理 * useSettingsMetadata - 元数据管理
* 负责: * 负责:
* - configPath配置文件路径
* - isPortable便携模式 * - isPortable便携模式
* - requiresRestart需要重启标志 * - requiresRestart需要重启标志
* - 打开配置文件夹
*/ */
export function useSettingsMetadata(): UseSettingsMetadataResult { export function useSettingsMetadata(): UseSettingsMetadataResult {
const { t } = useTranslation();
const [configPath, setConfigPath] = useState("");
const [isPortable, setIsPortable] = useState(false); const [isPortable, setIsPortable] = useState(false);
const [requiresRestart, setRequiresRestart] = useState(false); const [requiresRestart, setRequiresRestart] = useState(false);
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
@@ -36,14 +27,10 @@ export function useSettingsMetadata(): UseSettingsMetadataResult {
const load = async () => { const load = async () => {
try { try {
const [appConfigPath, portable] = await Promise.all([ const portable = await settingsApi.isPortable();
settingsApi.getAppConfigPath(),
settingsApi.isPortable(),
]);
if (!active) return; if (!active) return;
setConfigPath(appConfigPath || "");
setIsPortable(portable); setIsPortable(portable);
} catch (error) { } catch (error) {
console.error( console.error(
@@ -63,32 +50,14 @@ export function useSettingsMetadata(): UseSettingsMetadataResult {
}; };
}, []); }, []);
const openConfigFolder = useCallback(async () => {
try {
await settingsApi.openAppConfigFolder();
} catch (error) {
console.error(
"[useSettingsMetadata] Failed to open config folder",
error,
);
toast.error(
t("settings.openFolderFailed", {
defaultValue: "打开目录失败",
}),
);
}
}, [t]);
const acknowledgeRestart = useCallback(() => { const acknowledgeRestart = useCallback(() => {
setRequiresRestart(false); setRequiresRestart(false);
}, []); }, []);
return { return {
configPath,
isPortable, isPortable,
requiresRestart, requiresRestart,
isLoading, isLoading,
openConfigFolder,
acknowledgeRestart, acknowledgeRestart,
setRequiresRestart, setRequiresRestart,
}; };

View File

@@ -107,8 +107,6 @@
"minimizeToTrayDescription": "When checked, clicking the close button will hide to system tray, otherwise the app will exit directly.", "minimizeToTrayDescription": "When checked, clicking the close button will hide to system tray, otherwise the app will exit directly.",
"enableClaudePluginIntegration": "Apply to Claude Code extension", "enableClaudePluginIntegration": "Apply to Claude Code extension",
"enableClaudePluginIntegrationDescription": "When enabled, the VS Code Claude Code extension provider will switch with this app", "enableClaudePluginIntegrationDescription": "When enabled, the VS Code Claude Code extension provider will switch with this app",
"configFileLocation": "Configuration File Location",
"openFolder": "Open Folder",
"configDirectoryOverride": "Configuration Directory Override (Advanced)", "configDirectoryOverride": "Configuration Directory Override (Advanced)",
"configDirectoryDescription": "When using Claude Code or Codex in environments like WSL, you can manually specify the configuration directory in WSL to keep provider data consistent with the main environment.", "configDirectoryDescription": "When using Claude Code or Codex in environments like WSL, you can manually specify the configuration directory in WSL to keep provider data consistent with the main environment.",
"appConfigDir": "CC-Switch Configuration Directory", "appConfigDir": "CC-Switch Configuration Directory",

View File

@@ -107,8 +107,6 @@
"minimizeToTrayDescription": "勾选后点击关闭按钮会隐藏到系统托盘,取消则直接退出应用。", "minimizeToTrayDescription": "勾选后点击关闭按钮会隐藏到系统托盘,取消则直接退出应用。",
"enableClaudePluginIntegration": "应用到 Claude Code 插件", "enableClaudePluginIntegration": "应用到 Claude Code 插件",
"enableClaudePluginIntegrationDescription": "开启后 Vscode Claude Code 插件的供应商将随本软件切换", "enableClaudePluginIntegrationDescription": "开启后 Vscode Claude Code 插件的供应商将随本软件切换",
"configFileLocation": "配置文件位置",
"openFolder": "打开文件夹",
"configDirectoryOverride": "配置目录覆盖(高级)", "configDirectoryOverride": "配置目录覆盖(高级)",
"configDirectoryDescription": "在 WSL 等环境使用 Claude Code 或 Codex 的时候,可手动指定 WSL 里的配置目录,供应商数据与主环境保持一致。", "configDirectoryDescription": "在 WSL 等环境使用 Claude Code 或 Codex 的时候,可手动指定 WSL 里的配置目录,供应商数据与主环境保持一致。",
"appConfigDir": "CC-Switch 配置目录", "appConfigDir": "CC-Switch 配置目录",