diff --git a/src/components/ProxySwitch/index.css b/src/components/ProxySwitch/index.css index 0f75cb0..0a79d45 100644 --- a/src/components/ProxySwitch/index.css +++ b/src/components/ProxySwitch/index.css @@ -361,9 +361,9 @@ body { } .active-item { - background-color: #F28B44 !important; + background-color: var(--yakit-primary) !important; color: white !important; - font-weight: 500; + font-weight: bold; transition: background-color 0.2s ease-in-out !important; } diff --git a/src/components/ProxySwitch/index.tsx b/src/components/ProxySwitch/index.tsx index 5d520d4..29b596c 100644 --- a/src/components/ProxySwitch/index.tsx +++ b/src/components/ProxySwitch/index.tsx @@ -1,43 +1,48 @@ -import React, {useEffect, useState} from 'react'; -import {Menu} from 'antd'; -import {DisconnectOutlined, SettingOutlined, PlusOutlined, CheckOutlined} from '@ant-design/icons'; -import {browser,} from 'wxt/browser'; -import type {MenuProps} from 'antd'; -import type {ProxyConfig} from '@/types/proxy'; -import {ContentActionType, ProxyActionType} from '@/types/action'; -import { getAllProxyConfigs, getCurrentProxy } from '@/utils/storage'; +import React, {useEffect, useState} from "react"; +import {Menu} from "antd"; +import { + DisconnectOutlined, + SettingOutlined, + PlusOutlined, + CheckOutlined, +} from "@ant-design/icons"; +import {browser} from "wxt/browser"; +import type {MenuProps} from "antd"; +import type {ProxyConfig} from "@/types/proxy"; +import {ContentActionType, ProxyActionType} from "@/types/action"; +import {getAllProxyConfigs, getCurrentProxy} from "@/utils/storage"; -import './index.css'; +import "./index.css"; // YAK 图标 URL -const YAK_ICON_URL = browser.runtime.getURL('/yak.svg'); +const YAK_ICON_URL = browser.runtime.getURL("/yak.svg"); // 固定的代理模式 const FIXED_MODES = [ { - key: 'direct', - name: '[直接连接]', + key: "direct", + name: "[直接连接]", icon: , - color: '#666', + color: "#666", config: { - id: 'direct', - name: '[直接连接]', - proxyType: 'direct', - enabled: false - } + id: "direct", + name: "[直接连接]", + proxyType: "direct", + enabled: false, + }, }, { - key: 'system', - name: '[系统代理]', + key: "system", + name: "[系统代理]", icon: , - color: '#666', + color: "#666", config: { - id: 'system', - name: '[系统代理]', - proxyType: 'system', - enabled: false - } - } + id: "system", + name: "[系统代理]", + proxyType: "system", + enabled: false, + }, + }, ]; interface CustomProxy { @@ -50,14 +55,19 @@ interface CustomProxy { export const ProxySwitch: React.FC = () => { const [initialized, setInitialized] = useState(false); - const [currentMode, setCurrentMode] = useState(''); + const [currentMode, setCurrentMode] = useState(""); const [customProxies, setCustomProxies] = useState([]); const [isLoading, setIsLoading] = useState(false); // 监听存储变化 useEffect(() => { const handleMessage = (message: any) => { - if (message.action === ContentActionType.PROXY_CONFIGS_UPDATED && message.source !== 'proxy_switch') { + if ( + message.action === ContentActionType.PROXY_CONFIGS_UPDATED && + message.source !== "proxy_switch" + ) { + console.log("proxy_switch 收到代理配置更新消息", message); + loadCustomProxies(); loadProxyStatus(); } @@ -84,8 +94,9 @@ export const ProxySwitch: React.FC = () => { try { // 先尝试从后台脚本获取当前代理状态 const response = await browser.runtime.sendMessage({ - action: ProxyActionType.GET_PROXY_STATUS + action: ProxyActionType.GET_PROXY_STATUS, }); + console.log("proxy_switch 获取当前代理状态", response); if (response && response.success) { const activeMode = response.data.mode; @@ -98,11 +109,11 @@ export const ProxySwitch: React.FC = () => { if (currentProxy) { setCurrentMode(currentProxy.id); } else { - setCurrentMode('direct'); + setCurrentMode("direct"); } } catch (error) { - console.error('Error loading proxy status:', error); - setCurrentMode('direct'); + console.error("Error loading proxy status:", error); + setCurrentMode("direct"); } }; @@ -114,60 +125,65 @@ export const ProxySwitch: React.FC = () => { // 处理代理配置 const proxies = configs - .filter((proxy: ProxyConfig) => !['direct', 'system'].includes(proxy.id)) - .map((proxy: ProxyConfig): CustomProxy => ({ - key: proxy.id, - name: proxy.name, - color: '#1890ff', - config: proxy, - enabled: proxy.enabled - })); + .filter( + (proxy: ProxyConfig) => !["direct", "system"].includes(proxy.id) + ) + .map( + (proxy: ProxyConfig): CustomProxy => ({ + key: proxy.id, + name: proxy.name, + color: "#1890ff", + config: proxy, + enabled: proxy.enabled, + }) + ); setCustomProxies(proxies); - + console.log("proxy_switch proxies", proxies); // 查找并设置已启用的代理 const enabledProxy = configs.find((proxy: ProxyConfig) => proxy.enabled); if (enabledProxy) { + console.log("proxy_switch enabledProxy", enabledProxy); setCurrentMode(enabledProxy.id); } } catch (error) { - console.error('Error loading custom proxies:', error); + console.error("Error loading custom proxies:", error); setCustomProxies([]); } }; // 处理代理模式变更 const handleModeChange = async (mode: string) => { - if (mode === 'setting') { + if (mode === "setting") { // 打开设置页面 await browser.runtime.openOptionsPage?.(); return; } - if (mode === 'add') { + if (mode === "add") { // 打开添加代理表单 try { const [activeTab] = await browser.tabs.query({ active: true, - currentWindow: true + currentWindow: true, }); - const optionsUrl = browser.runtime.getURL('/options.html'); + const optionsUrl = browser.runtime.getURL("/options.html"); if (activeTab?.url === optionsUrl) { browser.tabs.sendMessage(activeTab.id!, { - action: ContentActionType.TRIGGER_ADD_PROXY + action: ContentActionType.TRIGGER_ADD_PROXY, }); } else { await browser.tabs.create({ - url: optionsUrl + url: optionsUrl, }); } } catch (error) { - console.error('Failed to get current tab:', error); + console.error("Failed to get current tab:", error); } return; } - + console.log("proxy_switch 处理代理模式变更", mode); // 如果当前已经是选中的模式,不做任何操作 if (mode === currentMode) return; @@ -180,16 +196,20 @@ export const ProxySwitch: React.FC = () => { // 发送切换代理请求 const response = await browser.runtime.sendMessage({ action: ProxyActionType.SWITCH_PROXY, - mode + mode, + source: "proxy_switch", }); if (!response || !response.success) { // 如果失败,恢复原状态 - console.error('Failed to switch proxy mode'); + console.error("Failed to switch proxy mode"); await loadProxyStatus(); // 重新加载正确的状态 } else { - // 成功时刷新代理列表状态 - await loadCustomProxies(); + setTimeout(() => { + setCurrentMode((preMode) => { + return mode === preMode ? preMode : mode; + }); + }, 20); } } catch (error) { console.error(`Error switching to proxy mode ${mode}:`, error); @@ -201,64 +221,76 @@ export const ProxySwitch: React.FC = () => { // 构建菜单项 const buildMenuItems = () => { - const items: MenuProps['items'] = [ - ...FIXED_MODES.map(mode => ({ + const items: MenuProps["items"] = [ + ...FIXED_MODES.map((mode) => ({ key: mode.key, label: mode.name, icon: mode.icon, - className: `${currentMode === mode.key ? 'active-item' : ''} menu-id-${mode.key}`, + className: `${currentMode === mode.key ? "active-item" : ""} menu-id-${ + mode.key + }`, })), - {type: 'divider'} + {type: "divider"}, ]; // 添加自定义代理 if (customProxies.length > 0) { items.push( - ...customProxies.map(proxy => { + ...customProxies.map((proxy) => { // 构建提示信息:显示代理协议、主机和端口 - const tooltipText = proxy.config.proxyType === 'fixed_servers' && proxy.config.host && proxy.config.port - ? `${proxy.config.scheme || 'http'}://${proxy.config.host}:${proxy.config.port}` - : proxy.config.proxyType === 'pac_script' - ? 'PAC脚本代理' - : proxy.config.proxyType === 'auto_detect' - ? '自动检测代理' - : ''; - + const tooltipText = + proxy.config.proxyType === "fixed_servers" && + proxy.config.host && + proxy.config.port + ? `${proxy.config.scheme || "http"}://${proxy.config.host}:${ + proxy.config.port + }` + : proxy.config.proxyType === "pac_script" + ? "PAC脚本代理" + : proxy.config.proxyType === "auto_detect" + ? "自动检测代理" + : ""; + + // Firefox 兼容性:确保 active-item 类始终应用正确 + const isActive = currentMode === proxy.key; + return { key: proxy.key, label: proxy.name, - icon: YAK, - className: `${currentMode === proxy.key ? 'active-item' : ''} menu-id-${proxy.key}`, + /> + ), + className: `${isActive ? "active-item" : ""} menu-id-${proxy.key}`, title: tooltipText, // 添加悬停提示 }; }) ); - items.push({type: 'divider'}); + items.push({type: "divider"}); } // 添加设置选项 items.push({ - key: 'setting', - label: '代理设置', - icon: , - className: 'menu-id-setting', + key: "setting", + label: "代理设置", + icon: , + className: "menu-id-setting", }); // 添加新建代理选项 items.push({ - key: 'add', - label: '添加代理', - icon: , - className: 'menu-id-add', + key: "add", + label: "添加代理", + icon: , + className: "menu-id-add", }); return items; @@ -271,8 +303,9 @@ export const ProxySwitch: React.FC = () => { selectedKeys={[currentMode]} items={buildMenuItems()} onClick={({key}) => handleModeChange(key)} + key={`proxy-menu-${currentMode}`} /> {isLoading &&
切换中...
} ); -}; \ No newline at end of file +};