diff --git a/.github/update.log b/.github/update.log index df828e09a1..e1e01de114 100644 --- a/.github/update.log +++ b/.github/update.log @@ -677,3 +677,4 @@ Update On Sat Jun 15 20:30:01 CEST 2024 Update On Sun Jun 16 20:31:07 CEST 2024 Update On Mon Jun 17 20:31:27 CEST 2024 Update On Tue Jun 18 20:32:23 CEST 2024 +Update On Wed Jun 19 20:31:46 CEST 2024 diff --git a/clash-meta/go.mod b/clash-meta/go.mod index 6030dd1e57..3361adf932 100644 --- a/clash-meta/go.mod +++ b/clash-meta/go.mod @@ -24,7 +24,7 @@ require ( github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 github.com/metacubex/sing-shadowsocks v0.2.6 github.com/metacubex/sing-shadowsocks2 v0.2.0 - github.com/metacubex/sing-tun v0.2.7-0.20240617013029-d05cf9df9cfe + github.com/metacubex/sing-tun v0.2.7-0.20240619023810-d442c40abab0 github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a github.com/metacubex/tfo-go v0.0.0-20240228025757-be1269474a66 diff --git a/clash-meta/go.sum b/clash-meta/go.sum index 7f2f105f23..95e0404f8b 100644 --- a/clash-meta/go.sum +++ b/clash-meta/go.sum @@ -116,8 +116,8 @@ github.com/metacubex/sing-shadowsocks v0.2.6 h1:6oEB3QcsFYnNiFeoevcXrCwJ3sAablwV github.com/metacubex/sing-shadowsocks v0.2.6/go.mod h1:zIkMeSnb8Mbf4hdqhw0pjzkn1d99YJ3JQm/VBg5WMTg= github.com/metacubex/sing-shadowsocks2 v0.2.0 h1:hqwT/AfI5d5UdPefIzR6onGHJfDXs5zgOM5QSgaM/9A= github.com/metacubex/sing-shadowsocks2 v0.2.0/go.mod h1:LCKF6j1P94zN8ZS+LXRK1gmYTVGB3squivBSXAFnOg8= -github.com/metacubex/sing-tun v0.2.7-0.20240617013029-d05cf9df9cfe h1:NrWjVEkRmEkdREVSpohMgEBoznS0PrRfJDr6iCV4348= -github.com/metacubex/sing-tun v0.2.7-0.20240617013029-d05cf9df9cfe/go.mod h1:WwJGbCx7bQcBzuQXiDOJvZH27R0kIjKNNlISIWsL6kM= +github.com/metacubex/sing-tun v0.2.7-0.20240619023810-d442c40abab0 h1:J7YWMrEaYM9WF4qG8ZaCCHGw/ylbZc8FvIHr4rdOzP8= +github.com/metacubex/sing-tun v0.2.7-0.20240619023810-d442c40abab0/go.mod h1:WwJGbCx7bQcBzuQXiDOJvZH27R0kIjKNNlISIWsL6kM= github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f h1:QjXrHKbTMBip/C+R79bvbfr42xH1gZl3uFb0RELdZiQ= github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY= github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a h1:NpSGclHJUYndUwBmyIpFBSoBVg8PoVX7QQKhYg0DjM0= diff --git a/clash-meta/listener/sing_tun/redirect_linux.go b/clash-meta/listener/sing_tun/redirect_linux.go new file mode 100644 index 0000000000..6ef6fc968a --- /dev/null +++ b/clash-meta/listener/sing_tun/redirect_linux.go @@ -0,0 +1,3 @@ +package sing_tun + +const supportRedirect = true diff --git a/clash-meta/listener/sing_tun/redirect_stub.go b/clash-meta/listener/sing_tun/redirect_stub.go new file mode 100644 index 0000000000..d711af3c70 --- /dev/null +++ b/clash-meta/listener/sing_tun/redirect_stub.go @@ -0,0 +1,5 @@ +//go:build !linux + +package sing_tun + +const supportRedirect = false diff --git a/clash-meta/listener/sing_tun/server.go b/clash-meta/listener/sing_tun/server.go index 53b885280a..e8c2ad286b 100644 --- a/clash-meta/listener/sing_tun/server.go +++ b/clash-meta/listener/sing_tun/server.go @@ -132,7 +132,7 @@ func New(options LC.Tun, tunnel C.Tunnel, additions ...inbound.Addition) (l *Lis if options.GSOMaxSize == 0 { options.GSOMaxSize = 65536 } - if runtime.GOOS != "linux" { + if !supportRedirect { options.AutoRedirect = false } tunName := options.Device @@ -453,12 +453,16 @@ func (l *Listener) ruleUpdateCallback(ruleProvider provider.RuleProvider) { } } +type toIpCidr interface { + ToIpCidr() *netipx.IPSet +} + func (l *Listener) updateRule(ruleProvider provider.RuleProvider, exclude bool, update bool) { l.ruleUpdateMutex.Lock() defer l.ruleUpdateMutex.Unlock() name := ruleProvider.Name() switch rp := ruleProvider.Strategy().(type) { - case interface{ ToIpCidr() *netipx.IPSet }: + case toIpCidr: if !exclude { ipCidr := rp.ToIpCidr() if ipCidr != nil { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/node-list.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/node-list.tsx index b5469417aa..85c3556d02 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/node-list.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/node-list.tsx @@ -2,16 +2,28 @@ import { Clash, useClashCore, useNyanpasu } from "@nyanpasu/interface"; import { useBreakpoint } from "@nyanpasu/ui"; import { useAtom, useAtomValue } from "jotai"; import { proxyGroupAtom, proxyGroupSortAtom } from "@/store"; -import { useCallback, useEffect, useState, useTransition } from "react"; +import { + forwardRef, + useCallback, + useEffect, + useImperativeHandle, + useRef, + useState, + useTransition, +} from "react"; import { classNames } from "@/utils"; -import { VList } from "virtua"; +import { VList, VListHandle } from "virtua"; import { AnimatePresence, motion } from "framer-motion"; import { filterDelay } from "./utils"; import NodeCard from "./node-card"; type RenderClashProxy = Clash.Proxy & { renderLayoutKey: string }; -export const NodeList = () => { +export interface NodeListRef { + scrollToCurrent: () => void; +} + +export const NodeList = forwardRef(function NodeList({}, ref) { const { data, setGroupProxy, setGlobalProxy, updateProxiesDelay } = useClashCore(); @@ -137,9 +149,25 @@ export const NodeList = () => { const disableMotion = nyanpasuConfig?.lighten_animation_effects; + const vListRef = useRef(null); + + useImperativeHandle(ref, () => ({ + scrollToCurrent: () => { + const index = renderList.findIndex((node) => + node.some((item) => item.name === group?.now), + ); + + vListRef.current?.scrollToIndex(index, { + align: "center", + smooth: true, + }); + }, + })); + return ( { ); -}; +}); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/scroll-current-node.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/scroll-current-node.tsx new file mode 100644 index 0000000000..a2662d15c8 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/scroll-current-node.tsx @@ -0,0 +1,26 @@ +import { Radar } from "@mui/icons-material"; +import { Button, Tooltip, alpha, useTheme } from "@mui/material"; +import { useTranslation } from "react-i18next"; + +export const ScrollCurrentNode = ({ onClick }: { onClick?: () => void }) => { + const { t } = useTranslation(); + + const { palette } = useTheme(); + + return ( + + + + ); +}; + +export default ScrollCurrentNode; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/sort-selector.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/sort-selector.tsx index 75484fbdb4..adfaf43ab3 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/sort-selector.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/sort-selector.tsx @@ -1,5 +1,5 @@ import { proxyGroupSortAtom } from "@/store"; -import { Button, Menu, MenuItem } from "@mui/material"; +import { Button, Menu, MenuItem, alpha, useTheme } from "@mui/material"; import { useAtom } from "jotai"; import { memo, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -7,6 +7,8 @@ import { useTranslation } from "react-i18next"; export const SortSelector = memo(function SortSelector() { const { t } = useTranslation(); + const { palette } = useTheme(); + const [proxyGroupSort, setProxyGroupSort] = useAtom(proxyGroupSortAtom); type SortType = typeof proxyGroupSort; @@ -28,8 +30,11 @@ export const SortSelector = memo(function SortSelector() { <>