fix(network): allow manual proxy overrides when system proxy is detected

This commit is contained in:
lzt404 committed 2026-09-18 18:17:31 +08:00
1 parent 7cde8942d3
commit de01219cc8
10 files changed
+145 -31

No files matched your search

+3 -1
View File
@@ -688,7 +688,9 @@ export const jaOverrides = {
'config.network.listenHostHint': '例: 127.0.0.1、0.0.0.0、または LAN IP。変更すると実行中のコアが再起動します',
'config.network.proxyUrl': 'プロキシ URL',
'config.network.proxyPlaceholder': '例:socks5://127.0.0.1:7890',
'config.network.proxyHint': '手動入力できます。空欄の場合はシステムプロキシを使います。未検出なら空欄のままです。HTTP と SOCKS に対応しています。',
'config.network.proxyHint': '「システムに従う」をオフにすると編集できます。手動設定が空欄の場合は直接接続します。HTTP と SOCKS に対応しています。',
'config.network.systemProxy': 'システムに従う',
'config.network.systemProxyHint': 'オンの場合は検出したシステムプロキシを、オフの場合は下の手動設定を使用します',
'config.network.sessionAffinity': 'セッションアフィニティ',
'config.network.sessionAffinityHint': '同じセッションでは以前選択した認証情報を優先します',
'config.network.sessionTtl': 'セッションアフィニティ TTL',
+3 -1
View File
@@ -719,7 +719,9 @@ export const en: Record<MessageKey, string> = {
'config.network.listenHostHint': 'For example, 127.0.0.1, 0.0.0.0, or a LAN IP; changing it restarts a running core',
'config.network.proxyUrl': 'Proxy URL',
'config.network.proxyPlaceholder': 'For example, socks5://127.0.0.1:7890',
'config.network.proxyHint': 'You can enter a proxy URL. Leave it empty to use the system proxy, or none if none is detected. Supports HTTP and SOCKS.',
'config.network.proxyHint': 'Turn off “Follow system” to customize it. An empty manual value means a direct connection. Supports HTTP and SOCKS.',
'config.network.systemProxy': 'Follow system',
'config.network.systemProxyHint': 'Use the detected system proxy when enabled; use the manual value below when disabled',
'config.network.sessionAffinity': 'Session Affinity',
'config.network.sessionAffinityHint': 'Prefer the previously selected credential for the same session',
'config.network.sessionTtl': 'Session Affinity TTL',
+3 -1
View File
@@ -718,7 +718,9 @@ export const zhCN = {
'config.network.listenHostHint': '例如 127.0.0.1、0.0.0.0 或局域网 IP;修改后会重启运行中的内核',
'config.network.proxyUrl': '代理 URL',
'config.network.proxyPlaceholder': '例如 socks5://127.0.0.1:7890',
'config.network.proxyHint': '可手动填写;留空则自动读取系统代理,没有就不填。支持 HTTP 与 SOCKS。',
'config.network.proxyHint': '关闭“跟随系统”后可自定义;手动留空表示直连。支持 HTTP 与 SOCKS。',
'config.network.systemProxy': '跟随系统',
'config.network.systemProxyHint': '开启时自动使用系统代理;关闭后使用下方的手动配置',
'config.network.sessionAffinity': '会话粘性路由',
'config.network.sessionAffinityHint': '同一会话优先复用已选择的凭据',
'config.network.sessionTtl': '会话粘性 TTL',
+35 -9
View File
@@ -50,6 +50,7 @@ type CoreConfigSettings = {
allowLan: boolean;
routingStrategy: string;
proxyUrl: string;
proxyOverride: boolean;
routingSessionAffinity: boolean;
routingSessionAffinityTtl: string;
disableCooling: boolean;
@@ -83,6 +84,7 @@ type NetworkDraftField =
| 'port'
| 'host'
| 'proxyUrl'
| 'proxyOverride'
| 'sessionAffinity'
| 'sessionTtl'
| 'disableCooling'
@@ -118,6 +120,7 @@ const cleanNetworkDraft = (): NetworkDraftDirty => ({
port: false,
host: false,
proxyUrl: false,
proxyOverride: false,
sessionAffinity: false,
sessionTtl: false,
disableCooling: false,
@@ -190,6 +193,7 @@ export function ConfigPanelPage() {
const [portDraft, setPortDraft] = useState('8317');
const [hostDraft, setHostDraft] = useState('127.0.0.1');
const [proxyUrlDraft, setProxyUrlDraft] = useState('');
const [proxyOverrideDraft, setProxyOverrideDraft] = useState(false);
const [sessionAffinityDraft, setSessionAffinityDraft] = useState(false);
const [sessionTtlDraft, setSessionTtlDraft] = useState('');
const [disableCoolingDraft, setDisableCoolingDraft] = useState(false);
@@ -236,6 +240,7 @@ export function ConfigPanelPage() {
if (!dirty.port) setPortDraft(String(result.port));
if (!dirty.host) setHostDraft(result.host);
if (!dirty.proxyUrl) setProxyUrlDraft(result.proxyUrl);
if (!dirty.proxyOverride) setProxyOverrideDraft(result.proxyOverride);
if (!dirty.sessionAffinity) setSessionAffinityDraft(result.routingSessionAffinity);
if (!dirty.sessionTtl) setSessionTtlDraft(result.routingSessionAffinityTtl);
if (!dirty.disableCooling) setDisableCoolingDraft(result.disableCooling);
@@ -261,6 +266,7 @@ export function ConfigPanelPage() {
setPortDraft(String(result.port));
setHostDraft(result.host);
setProxyUrlDraft(result.proxyUrl);
setProxyOverrideDraft(result.proxyOverride);
setSessionAffinityDraft(result.routingSessionAffinity);
setSessionTtlDraft(result.routingSessionAffinityTtl);
setDisableCoolingDraft(result.disableCooling);
@@ -720,13 +726,14 @@ export function ConfigPanelPage() {
setBusyAction('network');
try {
const result = await invoke<CoreConfigSettings>('save_network_endpoint_settings', {
settings: networkDraftDirtyRef.current.proxyUrl
? { host, port, proxyUrl }
settings: networkDraftDirtyRef.current.proxyUrl || networkDraftDirtyRef.current.proxyOverride
? { host, port, proxyUrl, proxyOverride: proxyOverrideDraft }
: { host, port },
});
clearDraftDirty('host');
clearDraftDirty('port');
clearDraftDirty('proxyUrl');
clearDraftDirty('proxyOverride');
applySettings(result, 'preserve');
setLoadError('');
@@ -872,6 +879,7 @@ export function ConfigPanelPage() {
hostDraft.trim() !== settings?.host
|| portDraft !== String(settings?.port)
|| proxyUrlDraft.trim() !== settings?.proxyUrl
|| proxyOverrideDraft !== settings?.proxyOverride
);
const sessionRoutingDirty = Boolean(settings) && (
sessionAffinityDraft !== settings?.routingSessionAffinity
@@ -1502,16 +1510,34 @@ export function ConfigPanelPage() {
<small>{t('config.network.listenHostHint')}</small>
</label>
<label className="config-network-field">
<span className="config-network-label">
<Link2 size={15} aria-hidden="true" />
{t('config.network.proxyUrl')}
</span>
<div className="config-network-field config-proxy-field">
<div className="config-proxy-heading">
<label className="config-network-label" htmlFor="config-network-proxy-url">
<Link2 size={15} aria-hidden="true" />
{t('config.network.proxyUrl')}
</label>
<label className="config-proxy-system-toggle" title={t('config.network.systemProxyHint')}>
<span>{t('config.network.systemProxy')}</span>
<span className="switch-control">
<input
type="checkbox"
checked={!proxyOverrideDraft}
disabled={controlsDisabled}
onChange={(event) => {
markDraftDirty('proxyOverride');
setProxyOverrideDraft(!event.currentTarget.checked);
}}
/>
<span className="switch-track" />
</span>
</label>
</div>
<input
id="config-network-proxy-url"
className="config-network-input"
type="text"
value={proxyUrlDraft}
disabled={controlsDisabled}
disabled={controlsDisabled || !proxyOverrideDraft}
placeholder={t('config.network.proxyPlaceholder')}
onChange={(event) => {
markDraftDirty('proxyUrl');
@@ -1526,7 +1552,7 @@ export function ConfigPanelPage() {
}}
/>
<small>{t('config.network.proxyHint')}</small>
</label>
</div>
</div>
</section>