From 9336aced100a2f40f31f07ec93ce088361682e3e Mon Sep 17 00:00:00 2001 From: pompurin404 Date: Mon, 2 Sep 2024 23:05:59 +0800 Subject: [PATCH] support search proxies --- changelog.md | 5 +-- .../src/components/base/collapse-input.tsx | 42 +++++++++++++++++++ src/renderer/src/pages/proxies.tsx | 31 ++++++++++---- 3 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 src/renderer/src/components/base/collapse-input.tsx diff --git a/changelog.md b/changelog.md index 24c9869..125be84 100644 --- a/changelog.md +++ b/changelog.md @@ -2,7 +2,6 @@ - 1.2.x YAML覆写语法有所变动,请更新后参考文档进行修改 -### Bug Fixes +### New Features -- 修复某些MacOS DNS设置失败的问题 -- 修复Windows某些情况下无法启动的问题 +- 支持节点搜索 diff --git a/src/renderer/src/components/base/collapse-input.tsx b/src/renderer/src/components/base/collapse-input.tsx new file mode 100644 index 0000000..4085c9d --- /dev/null +++ b/src/renderer/src/components/base/collapse-input.tsx @@ -0,0 +1,42 @@ +import React, { useRef } from 'react' +import { Input, InputProps } from '@nextui-org/react' +import { FaSearch } from 'react-icons/fa' + +interface CollapseInputProps extends InputProps { + title: string +} + +const CollapseInput: React.FC = (props) => { + const { title, ...inputProps } = props + const inputRef = useRef(null) + return ( +
+ { + e.stopPropagation() + inputRef.current?.focus() + }} + /> + } + onClick={(e) => { + e.stopPropagation() + inputRef.current?.focus() + }} + /> +
+ ) +} + +export default CollapseInput diff --git a/src/renderer/src/pages/proxies.tsx b/src/renderer/src/pages/proxies.tsx index b79d21e..c737577 100644 --- a/src/renderer/src/pages/proxies.tsx +++ b/src/renderer/src/pages/proxies.tsx @@ -17,6 +17,7 @@ import ProxyItem from '@renderer/components/proxies/proxy-item' import { IoIosArrowBack } from 'react-icons/io' import { MdOutlineSpeed } from 'react-icons/md' import { useGroups } from '@renderer/hooks/use-groups' +import CollapseInput from '@renderer/components/base/collapse-input' const Proxies: React.FC = () => { const { groups = [], mutate } = useGroups() @@ -29,17 +30,18 @@ const Proxies: React.FC = () => { } = appConfig || {} const [cols, setCols] = useState(1) const [isOpen, setIsOpen] = useState(Array(groups.length).fill(false)) + const [searchValue, setSearchValue] = useState(Array(groups.length).fill('')) const virtuosoRef = useRef(null) const { groupCounts, allProxies } = useMemo(() => { - const groupCounts = groups.map((group, index) => { - if (!isOpen[index]) return 0 - const count = Math.floor(group.all.length / cols) - return group.all.length % cols === 0 ? count : count + 1 - }) + const groupCounts: number[] = [] const allProxies: (IMihomoProxy | IMihomoGroup)[][] = [] groups.forEach((group, index) => { if (isOpen[index]) { - let groupProxies = [...group.all] + let groupProxies = group.all.filter((proxy) => + proxy.name.toLowerCase().includes(searchValue[index].toLowerCase()) + ) + const count = Math.floor(groupProxies.length / cols) + groupCounts.push(groupProxies.length % cols === 0 ? count : count + 1) if (proxyDisplayOrder === 'delay') { groupProxies = groupProxies.sort((a, b) => { if (a.history.length === 0) return -1 @@ -54,12 +56,12 @@ const Proxies: React.FC = () => { } allProxies.push(groupProxies) } else { + groupCounts.push(0) allProxies.push([]) } }) - return { groupCounts, allProxies } - }, [groups, isOpen, proxyDisplayOrder, cols]) + }, [groups, isOpen, proxyDisplayOrder, cols, searchValue]) const onChangeProxy = async (group: string, proxy: string): Promise => { await mihomoChangeProxy(group, proxy) @@ -165,7 +167,7 @@ const Proxies: React.FC = () => { { + onClick={() => { setIsOpen((prev) => { const newOpen = [...prev] newOpen[index] = !prev[index] @@ -226,6 +228,17 @@ const Proxies: React.FC = () => { {groups[index].all.length} )} + { + setSearchValue((prev) => { + const newSearchValue = [...prev] + newSearchValue[index] = v + return newSearchValue + }) + }} + />