diff --git a/Changelog.md b/Changelog.md index 563cbc13d..742d404d1 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,7 @@
🐞 修复问题 +- 修复端口设置混淆保存值与运行值、输入无效时缺少提示的问题 - 修复从开始菜单再次打开应用后,窗口反复弹出并提示启动失败的问题 - 修复多个代理集合包含同名节点时,代理组中的节点变灰并显示 ambiguous、无法选择的问题 diff --git a/src/components/setting/mods/clash-port-viewer.tsx b/src/components/setting/mods/clash-port-viewer.tsx index d45d7ff9a..19a452ad9 100644 --- a/src/components/setting/mods/clash-port-viewer.tsx +++ b/src/components/setting/mods/clash-port-viewer.tsx @@ -13,6 +13,7 @@ import { forwardRef, useImperativeHandle, useState } from 'react' import { useTranslation } from 'react-i18next' import { BaseDialog, Switch } from '@/components/base' +import { useClashInfo } from '@/hooks/use-clash' import { useDisplayedMixedPort } from '@/hooks/use-displayed-mixed-port' import { useVerge } from '@/hooks/use-verge' import { saveProxyPorts } from '@/services/cmds' @@ -32,11 +33,14 @@ const generateRandomPort = () => export const ClashPortViewer = forwardRef((_, ref) => { const { t } = useTranslation() const { verge } = useVerge() + const { clashInfo } = useClashInfo() + const configuredMixedPort = + verge?.verge_mixed_port ?? clashInfo?.mixed_port ?? 7897 const displayedMixedPort = useDisplayedMixedPort() const [open, setOpen] = useState(false) // Mixed Port - const [mixedPort, setMixedPort] = useState(displayedMixedPort) + const [mixedPort, setMixedPort] = useState(configuredMixedPort) // 其他端口状态 const [socksPort, setSocksPort] = useState(verge?.verge_socks_port ?? 7898) @@ -76,7 +80,7 @@ export const ClashPortViewer = forwardRef((_, ref) => { useImperativeHandle(ref, () => ({ open: () => { - setMixedPort(displayedMixedPort) + setMixedPort(configuredMixedPort) setSocksPort(verge?.verge_socks_port ?? 7898) setSocksEnabled(verge?.verge_socks_enabled ?? false) setHttpPort(verge?.verge_port ?? 7899) @@ -92,6 +96,14 @@ export const ClashPortViewer = forwardRef((_, ref) => { // TODO 减少代码复杂度,性能开支 const onSave = useLockFn(async () => { + // The backend also rejects out-of-range ports on disabled listeners. + const isValidPort = (port: number) => port >= 1 && port <= 65535 + const allPorts = [mixedPort, socksPort, httpPort, redirPort, tproxyPort] + if (!allPorts.every(isValidPort)) { + showNotice.error('settings.modals.clashPort.messages.invalidPort') + return + } + // 端口冲突检测 const portList = [ mixedPort, @@ -102,20 +114,7 @@ export const ClashPortViewer = forwardRef((_, ref) => { ].filter((p) => p !== -1) if (new Set(portList).size !== portList.length) { - return - } - - // 验证端口范围 - const isValidPort = (port: number) => port >= 1 && port <= 65535 - const allPortsValid = [ - mixedPort, - socksEnabled ? socksPort : 0, - httpEnabled ? httpPort : 0, - redirEnabled ? redirPort : 0, - tproxyEnabled ? tproxyPort : 0, - ].every((port) => port === 0 || isValidPort(port)) - - if (!allPortsValid) { + showNotice.error('settings.modals.clashPort.messages.duplicatePort') return } @@ -154,7 +153,17 @@ export const ClashPortViewer = forwardRef((_, ref) => {