From 52cefa39d326c674de3fa0205eaab984b4ba920b Mon Sep 17 00:00:00 2001 From: Memory <134070804+Memory2314@users.noreply.github.com> Date: Sat, 10 Jan 2026 14:55:10 +0800 Subject: [PATCH] feat: add option to hide unavailable proxies in proxy list --- src/renderer/src/locales/en-US.json | 2 ++ src/renderer/src/locales/fa-IR.json | 2 ++ src/renderer/src/locales/ru-RU.json | 2 ++ src/renderer/src/locales/zh-CN.json | 2 ++ src/renderer/src/locales/zh-TW.json | 2 ++ src/renderer/src/pages/proxies.tsx | 54 ++++++++++++++++++++++++++--- src/shared/types.d.ts | 1 + 7 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/renderer/src/locales/en-US.json b/src/renderer/src/locales/en-US.json index 09203c5..5163c53 100644 --- a/src/renderer/src/locales/en-US.json +++ b/src/renderer/src/locales/en-US.json @@ -342,6 +342,8 @@ "actions.version.title": "App Version", "theme.editor.title": "Edit Theme", "proxies.title": "Proxy Groups & Nodes", + "proxies.hideUnavailable.enabled": "Show Unavailable Proxies", + "proxies.hideUnavailable.disabled": "Hide Unavailable Proxies", "proxies.card.title": "ProxyGrp", "proxies.delay.test": "Test", "proxies.delay.timeout": "Timeout", diff --git a/src/renderer/src/locales/fa-IR.json b/src/renderer/src/locales/fa-IR.json index 279754a..8255cf4 100644 --- a/src/renderer/src/locales/fa-IR.json +++ b/src/renderer/src/locales/fa-IR.json @@ -318,6 +318,8 @@ "actions.version.title": "نسخه برنامه", "theme.editor.title": "ویرایش پوسته", "proxies.title": "گروه‌های پراکسی و گره‌ها", + "proxies.hideUnavailable.enabled": "نمایش گره‌های غیرفعال", + "proxies.hideUnavailable.disabled": "پنهان کردن گره‌های غیرفعال", "proxies.card.title": "گروه‌پراکسی", "proxies.delay.test": "تست", "proxies.delay.timeout": "وقفه", diff --git a/src/renderer/src/locales/ru-RU.json b/src/renderer/src/locales/ru-RU.json index 059223f..f0a4f57 100644 --- a/src/renderer/src/locales/ru-RU.json +++ b/src/renderer/src/locales/ru-RU.json @@ -318,6 +318,8 @@ "actions.version.title": "Версия приложения", "theme.editor.title": "Редактор темы", "proxies.title": "Прокси группы и узлы", + "proxies.hideUnavailable.enabled": "Показать недоступные узлы", + "proxies.hideUnavailable.disabled": "Скрыть недоступные узлы", "proxies.card.title": "Прокси группы", "proxies.delay.test": "Тест", "proxies.delay.timeout": "Таймаут", diff --git a/src/renderer/src/locales/zh-CN.json b/src/renderer/src/locales/zh-CN.json index acd2f45..bb70e6b 100644 --- a/src/renderer/src/locales/zh-CN.json +++ b/src/renderer/src/locales/zh-CN.json @@ -342,6 +342,8 @@ "actions.version.title": "应用版本", "theme.editor.title": "编辑主题", "proxies.title": "代理组与节点", + "proxies.hideUnavailable.enabled": "显示不可用节点", + "proxies.hideUnavailable.disabled": "隐藏不可用节点", "proxies.card.title": "代理组", "proxies.delay.test": "测试", "proxies.delay.timeout": "超时", diff --git a/src/renderer/src/locales/zh-TW.json b/src/renderer/src/locales/zh-TW.json index 1b722de..3185eb8 100644 --- a/src/renderer/src/locales/zh-TW.json +++ b/src/renderer/src/locales/zh-TW.json @@ -342,6 +342,8 @@ "actions.version.title": "應用程式版本", "theme.editor.title": "編輯主題", "proxies.title": "代理組與節點", + "proxies.hideUnavailable.enabled": "顯示不可用節點", + "proxies.hideUnavailable.disabled": "隱藏不可用節點", "proxies.card.title": "代理組", "proxies.delay.test": "測試", "proxies.delay.timeout": "逾時", diff --git a/src/renderer/src/pages/proxies.tsx b/src/renderer/src/pages/proxies.tsx index cfaf644..44c723b 100644 --- a/src/renderer/src/pages/proxies.tsx +++ b/src/renderer/src/pages/proxies.tsx @@ -11,11 +11,11 @@ import { CgDetailsLess, CgDetailsMore } from 'react-icons/cg' import { TbCircleLetterD } from 'react-icons/tb' import { FaLocationCrosshairs } from 'react-icons/fa6' import { RxLetterCaseCapitalize } from 'react-icons/rx' +import { MdVisibilityOff, MdDoubleArrow, MdOutlineSpeed } from 'react-icons/md' import { useEffect, useMemo, useRef, useState, useCallback } from 'react' import { GroupedVirtuoso, GroupedVirtuosoHandle } from 'react-virtuoso' import ProxyItem from '@renderer/components/proxies/proxy-item' import { IoIosArrowBack } from 'react-icons/io' -import { MdDoubleArrow, MdOutlineSpeed } from 'react-icons/md' import { useGroups } from '@renderer/hooks/use-groups' import CollapseInput from '@renderer/components/base/collapse-input' import { includesIgnoreCase } from '@renderer/utils/includes' @@ -160,9 +160,25 @@ const Proxies: React.FC = () => { groups.forEach((group, index) => { if (isOpen[index]) { - const filtered = group.all.filter( - (proxy) => proxy && includesIgnoreCase(proxy.name, searchValue[index]) - ) + const filtered = group.all.filter((proxy) => { + if (!includesIgnoreCase(proxy.name, searchValue[index])) { + return false + } + if (appConfig?.hideUnavailableProxies) { + const isGroup = 'all' in proxy + if (isGroup) { + return true + } + if (!proxy.history || proxy.history.length === 0) { + return true + } + const lastDelay = proxy.history[proxy.history.length - 1].delay + if (lastDelay === 0) { + return false + } + } + return true + }) const sorted = sortProxies(filtered, proxyDisplayOrder) const count = Math.ceil(sorted.length / cols) groupCounts.push(count) @@ -173,7 +189,15 @@ const Proxies: React.FC = () => { } }) return { groupCounts, allProxies } - }, [groups, isOpen, proxyDisplayOrder, cols, searchValue, sortProxies]) + }, [ + groups, + isOpen, + proxyDisplayOrder, + cols, + searchValue, + sortProxies, + appConfig?.hideUnavailableProxies + ]) const onChangeProxy = useCallback( async (group: string, proxy: string): Promise => { @@ -509,6 +533,26 @@ const Proxies: React.FC = () => { title={t('proxies.title')} header={ <> +