import { useState, useEffect } from "react"; import { X, RefreshCw, FolderOpen, Download, ExternalLink, Check, } from "lucide-react"; import { getVersion } from "@tauri-apps/api/app"; 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; } export default function SettingsModal({ onClose }: SettingsModalProps) { const [settings, setSettings] = useState({ showInTray: true, }); const [configPath, setConfigPath] = useState(""); const [version, setVersion] = useState(""); const [isCheckingUpdate, setIsCheckingUpdate] = useState(false); const [isDownloading, setIsDownloading] = useState(false); const [showUpToDate, setShowUpToDate] = useState(false); const { hasUpdate, updateInfo, updateHandle, checkUpdate, resetDismiss } = useUpdate(); useEffect(() => { loadSettings(); loadConfigPath(); loadVersion(); }, []); const loadVersion = async () => { try { const appVersion = await getVersion(); setVersion(appVersion); } catch (error) { console.error("获取版本信息失败:", error); // 失败时不硬编码版本号,显示为未知 setVersion("未知"); } }; const loadSettings = async () => { try { const loadedSettings = await window.api.getSettings(); if ((loadedSettings as any)?.showInTray !== undefined) { setSettings({ showInTray: (loadedSettings as any).showInTray }); } else if ((loadedSettings as any)?.showInDock !== undefined) { // 向后兼容:若历史上有 showInDock,则映射为 showInTray setSettings({ showInTray: (loadedSettings as any).showInDock }); } } catch (error) { console.error("加载设置失败:", error); } }; const loadConfigPath = async () => { try { const path = await window.api.getAppConfigPath(); if (path) { setConfigPath(path); } } catch (error) { console.error("获取配置路径失败:", error); } }; const saveSettings = async () => { try { await window.api.saveSettings(settings); onClose(); } catch (error) { console.error("保存设置失败:", error); } }; const handleCheckUpdate = async () => { if (hasUpdate && updateHandle) { // 已检测到更新:直接复用 updateHandle 下载并安装,避免重复检查 setIsDownloading(true); try { resetDismiss(); await updateHandle.downloadAndInstall(); await relaunchApp(); } catch (error) { console.error("更新失败:", error); // 更新失败时回退到打开 Releases 页面 await window.api.checkForUpdates(); } finally { setIsDownloading(false); } } else { // 尚未检测到更新:先检查 setIsCheckingUpdate(true); setShowUpToDate(false); try { const hasNewUpdate = await checkUpdate(); // 检查完成后,如果没有更新,显示"已是最新" if (!hasNewUpdate) { setShowUpToDate(true); // 3秒后恢复按钮文字 setTimeout(() => { setShowUpToDate(false); }, 3000); } } catch (error) { console.error("检查更新失败:", error); // 在开发模式下,模拟已是最新版本的响应 if (import.meta.env.DEV) { setShowUpToDate(true); setTimeout(() => { setShowUpToDate(false); }, 3000); } else { // 生产环境下如果更新插件不可用,回退到打开 Releases 页面 await window.api.checkForUpdates(); } } finally { setIsCheckingUpdate(false); } } }; const handleOpenConfigFolder = async () => { try { await window.api.openAppConfigFolder(); } catch (error) { console.error("打开配置文件夹失败:", error); } }; const handleOpenReleaseNotes = async () => { try { const targetVersion = updateInfo?.availableVersion || version; // 如果未知或为空,回退到 releases 首页 if (!targetVersion || targetVersion === "未知") { await window.api.openExternal( "https://github.com/farion1231/cc-switch/releases", ); return; } const tag = targetVersion.startsWith("v") ? targetVersion : `v${targetVersion}`; await window.api.openExternal( `https://github.com/farion1231/cc-switch/releases/tag/${tag}`, ); } catch (error) { console.error("打开更新日志失败:", error); } }; return (
{ if (e.target === e.currentTarget) onClose(); }} >
{/* 标题栏 */}

设置

{/* 设置内容 */}
{/* 系统托盘设置(未实现) 说明:此开关用于控制是否在系统托盘/菜单栏显示应用图标。 */} {/*

显示设置(系统托盘)

*/} {/* VS Code 自动同步设置已移除 */} {/* 配置文件位置 */}

配置文件位置

{configPath || "加载中..."}
{/* 关于 */}

关于

CC Switch

版本 {version}

{/* 底部按钮 */}
); }