diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index e63c876..07dbe5a 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -380,7 +380,7 @@ interface LiveDataSource { channelNumber?: number; disabled?: boolean; from: 'config' | 'custom'; - proxyMode?: boolean; // 代理模式开关 + proxyMode?: 'full' | 'm3u8-only' | 'direct'; // 代理模式 } // 自定义分类数据类型 @@ -10937,12 +10937,15 @@ const LiveSourceConfig = ({ }); }; - const handleToggleProxyMode = (key: string) => { - withLoading(`toggleLiveProxyMode_${key}`, async () => { + const handleSetProxyMode = (key: string, mode: 'full' | 'm3u8-only' | 'direct') => { + withLoading(`setLiveProxyMode_${key}`, async () => { + // 保存旧值用于回滚 + const oldMode = liveSources.find((s) => s.key === key)?.proxyMode; + // 乐观更新本地状态 setLiveSources((prev) => prev.map((s) => - s.key === key ? { ...s, proxyMode: !s.proxyMode } : s + s.key === key ? { ...s, proxyMode: mode } : s ) ); @@ -10951,13 +10954,14 @@ const LiveSourceConfig = ({ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ - action: 'toggle_proxy_mode', + action: 'set_proxy_mode', key, + proxyMode: mode, }), }); if (!response.ok) { - throw new Error('切换代理模式失败'); + throw new Error('设置代理模式失败'); } // 成功后刷新配置 @@ -10966,17 +10970,17 @@ const LiveSourceConfig = ({ // 失败时回滚本地状态 setLiveSources((prev) => prev.map((s) => - s.key === key ? { ...s, proxyMode: !s.proxyMode } : s + s.key === key ? { ...s, proxyMode: oldMode } : s ) ); showError( - error instanceof Error ? error.message : '切换代理模式失败', + error instanceof Error ? error.message : '设置代理模式失败', showAlert ); throw error; } }).catch(() => { - console.error('操作失败', 'toggle_proxy_mode', key); + console.error('操作失败', 'set_proxy_mode', key); }); }; @@ -11157,28 +11161,22 @@ const LiveSourceConfig = ({ -