import React, { useState, useEffect } from "react"; import { ConfigProvider, Layout, Typography, List, Button, Form, Input, Select, Space, Card, Divider, Modal, } from "antd"; import { PlusOutlined, DeleteOutlined } from "@ant-design/icons"; import { v4 as uuidv4 } from "uuid"; import { browser } from "wxt/browser"; import type { ProxyConfig } from "../../types/proxy"; import { getAllProxyConfigs, saveProxyConfig, deleteProxyConfig, enableProxyConfig, getCurrentProxy, } from "../../utils/storage"; import { ContentActionType, ProxyActionType } from "../../types/action"; import "./App.css"; const { Header, Content } = Layout; const { Title } = Typography; const { Option } = Select; export default function App() { const [proxies, setProxies] = useState([]); const [form] = Form.useForm(); const [loading, setLoading] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); useEffect(() => { loadProxies(); // 监听添加代理请求和代理配置更新 const handleMessage = (message: any) => { if (message.action === ContentActionType.TRIGGER_ADD_PROXY) { setIsModalOpen(true); } else if (message.action === ContentActionType.PROXY_CONFIGS_UPDATED) { // 当代理配置发生变化时重新加载代理列表 loadProxies(); } }; browser.runtime.onMessage.addListener(handleMessage); return () => { browser.runtime.onMessage.removeListener(handleMessage); }; }, []); const loadProxies = async () => { try { // 获取所有代理配置 const allConfigs = await getAllProxyConfigs(); // 获取当前启用的代理 const currentProxy = await getCurrentProxy(); const currentProxyId = currentProxy?.id || ""; // 检查当前是否为系统代理或直接连接 const isSystemOrDirect = currentProxyId === "system" || currentProxyId === "direct"; // 显示自定义代理服务器配置和PAC脚本配置 const customProxies = allConfigs.filter( (config) => config.proxyType === "fixed_servers" || config.proxyType === "pac_script" ); // 如果当前是系统代理或直接连接,则所有自定义代理显示为未启用 if (isSystemOrDirect) { console.log("系统代理或直接连接已启用,确保自定义代理状态正确"); // 确保UI状态与实际状态一致 setProxies( customProxies.map((proxy) => ({ ...proxy, enabled: false, })) ); } else { setProxies(customProxies); } } catch (error) { console.error("Error loading proxies:", error); } }; const handleSave = async (values: any) => { try { setLoading(true); const newProxy: Partial = { id: uuidv4(), name: values.name, enabled: false, }; if (values.proxyType === "fixed_servers") { newProxy.proxyType = "fixed_servers"; newProxy.scheme = values.scheme; newProxy.host = values.host; newProxy.port = Number(values.port); // 处理不经过代理的地址 if (values.bypassList) { newProxy.bypassList = values.bypassList .split("\n") .map((line: string) => line.trim()) .filter((line: string) => line.length > 0); } else { newProxy.bypassList = []; } } else if (values.proxyType === "pac_script") { newProxy.proxyType = "pac_script"; newProxy.mode = "pac_script"; // 处理PAC脚本匹配域名 if (values.matchList) { newProxy.matchList = values.matchList .split("\n") .map((line: string) => line.trim()) .filter((line: string) => line.length > 0); } // 解析选择的代理服务器 const [host, port] = values.proxyServer.split(":"); // 创建PAC脚本 newProxy.pacScript = { data: `function FindProxyForURL(url, host) { // Convert host to lowercase for case-insensitive matching host = host.toLowerCase(); // Define domain patterns var domains = ${JSON.stringify(newProxy.matchList || [])}; // Check each domain pattern for (var i = 0; i < domains.length; i++) { var pattern = domains[i].toLowerCase(); if (pattern.startsWith('*.')) { var suffix = pattern.substring(2); if (host === suffix || host.endsWith('.' + suffix)) { return 'PROXY ${host}:${port}'; } } else if (host === pattern) { return 'PROXY ${host}:${port}'; } } return 'DIRECT'; }`, mandatory: true, }; // 保存代理服务器信息 newProxy.host = host; newProxy.port = Number(port); } // 添加认证信息 if (values.username) newProxy.username = values.username; if (values.password) newProxy.password = values.password; await saveProxyConfig(newProxy as ProxyConfig); // 重新加载代理列表 await loadProxies(); // 重置表单 form.resetFields(); // 关闭模态框 setIsModalOpen(false); // 通知后台脚本 browser.runtime.sendMessage({ action: ContentActionType.PROXY_CONFIGS_UPDATED, source: "options", }); } catch (error) { console.error("Error saving proxy:", error); } finally { setLoading(false); } }; const handleDelete = async (id: string) => { try { await deleteProxyConfig(id); await loadProxies(); // 通知后台脚本 browser.runtime.sendMessage({ action: ContentActionType.PROXY_CONFIGS_UPDATED, source: "options", }); } catch (error) { console.error(`Error deleting proxy ${id}:`, error); } }; const handleActivate = async (id: string) => { try { // 启用代理 await enableProxyConfig(id); // 发送切换代理请求 await browser.runtime.sendMessage({ action: ProxyActionType.SWITCH_PROXY, mode: id, }); // 重新加载代理列表 await loadProxies(); // 通知后台脚本 browser.runtime.sendMessage({ action: ContentActionType.PROXY_CONFIGS_UPDATED, source: "options", }); } catch (error) { console.error(`Error activating proxy ${id}:`, error); } }; const showModal = () => { form.resetFields(); setIsModalOpen(true); }; const handleCancel = () => { setIsModalOpen(false); }; return (
Yaklang 代理管理设置
} onClick={showModal} size="small" style={{ backgroundColor: "#F28B44", borderColor: "#F28B44", borderRadius: "4px", fontSize: "13px", }} > 添加代理 } >
No data

还没有添加任何代理

), }} renderItem={(proxy) => ( handleActivate(proxy.id)} disabled={proxy.enabled} style={ proxy.enabled ? { backgroundColor: "#F28B44", color: "white", borderColor: "#F28B44", } : undefined } > {proxy.enabled ? "已启用" : "启用"} , , , ]} destroyOnClose >
名称} rules={[{ required: true, message: "请输入代理名称" }]} > 类型} initialValue="fixed_servers" rules={[{ required: true, message: "请选择代理类型" }]} > prevValues.proxyType !== currentValues.proxyType } > {({ getFieldValue }) => { const proxyType = getFieldValue("proxyType"); if (proxyType === "fixed_servers") { return ( <> 协议} initialValue="http" rules={[ { required: true, message: "请选择代理协议" }, ]} > 主机} rules={[ { required: true, message: "请输入主机地址" }, ]} > 端口} rules={[{ required: true, message: "请输入端口" }]} >
每行一个地址,支持通配符 *
); } else if (proxyType === "pac_script") { return ( <> 选择代理服务器 } rules={[ { required: true, message: "请选择代理服务器" }, ]} > ); } return null; }}
); }