From 8767f9461f06e3195f7bab1b32d298eb9d0e69b2 Mon Sep 17 00:00:00 2001 From: Ember <15190419+0xEmberZz@users.noreply.github.com> Date: Thu, 6 Nov 2025 12:25:25 +0800 Subject: [PATCH] =?UTF-8?q?bugfix/=20fix=20delete=20AI=20Model=20issue=20?= =?UTF-8?q?=20(#594)=20*=20fix:=20=E4=BF=AE=E5=A4=8D=E5=88=A0=E9=99=A4AI?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B/=E4=BA=A4=E6=98=93=E6=89=80=E5=90=8EUI?= =?UTF-8?q?=E6=9C=AA=E5=88=B7=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98=20?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E6=8F=8F=E8=BF=B0=EF=BC=9A=20=E5=9C=A8?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=95=8C=E9=9D=A2=E5=88=A0=E9=99=A4AI?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=88=96=E4=BA=A4=E6=98=93=E6=89=80=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E8=99=BD=E7=84=B6=E5=90=8E=E7=AB=AF=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=B7=B2=E6=9B=B4=E6=96=B0=EF=BC=8C=E4=BD=86=E5=89=8D=E7=AB=AF?= =?UTF-8?q?UI=E4=BB=8D=E7=84=B6=E6=98=BE=E7=A4=BA=E5=B7=B2=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E7=9A=84=E9=85=8D=E7=BD=AE=E9=A1=B9=E3=80=82=20?= =?UTF-8?q?=E6=A0=B9=E6=9C=AC=E5=8E=9F=E5=9B=A0=EF=BC=9A=20React=E7=9A=84?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=9B=B4=E6=96=B0=E6=9C=BA=E5=88=B6=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E6=97=A0=E6=B3=95=E6=A3=80=E6=B5=8B=E5=88=B0=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=86=85=E5=AE=B9=E7=9A=84=E5=8F=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E7=89=B9=E5=88=AB=E6=98=AF=E5=BD=93API=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E4=B8=8E=E4=B9=8B=E5=89=8D=E7=9A=84?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E7=9B=B8=E5=90=8C=E6=97=B6=E3=80=82=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B9=E6=A1=88=EF=BC=9A=20=E5=9C=A8=20han?= =?UTF-8?q?dleDeleteModelConfig=20=E5=92=8C=20handleDeleteExchangeConfig?= =?UTF-8?q?=20=E4=B8=AD=E4=BD=BF=E7=94=A8=E6=95=B0=E7=BB=84=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E8=BF=90=E7=AE=97=E7=AC=A6=20[...items]=20=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=96=B0=E6=95=B0=E7=BB=84=EF=BC=8C=E7=A1=AE=E4=BF=9D?= =?UTF-8?q?React=E8=83=BD=E5=A4=9F=E6=A3=80=E6=B5=8B=E5=88=B0=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=8F=98=E5=8C=96=E5=B9=B6=E8=A7=A6=E5=8F=91=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E6=B8=B2=E6=9F=93=E3=80=82=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=9A=20-=20web/src/components/AITradersP?= =?UTF-8?q?age.tsx=20=E5=BD=B1=E5=93=8D=E8=8C=83=E5=9B=B4=EF=BC=9A=20-=20A?= =?UTF-8?q?I=E6=A8=A1=E5=9E=8B=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD=20-=20?= =?UTF-8?q?=E4=BA=A4=E6=98=93=E6=89=80=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20Fixes=20#591=20Co-Authored-By:=20tinkle-community=20=20*=20fix:=20=E5=88=A0=E9=99=A4=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E7=A1=AE=E8=AE=A4=E5=AF=B9=E8=AF=9D=E6=A1=86?= =?UTF-8?q?=20=E9=97=AE=E9=A2=98=E6=8F=8F=E8=BF=B0=EF=BC=9A=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4AI=E6=A8=A1=E5=9E=8B=E6=88=96=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E6=89=80=E6=97=B6=EF=BC=8C=E7=A1=AE=E8=AE=A4=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E6=A1=86=E4=BC=9A=E5=BC=B9=E5=87=BA=E4=B8=A4=E6=AC=A1=20?= =?UTF-8?q?=E6=A0=B9=E6=9C=AC=E5=8E=9F=E5=9B=A0=EF=BC=9A=201.=20ModelConfi?= =?UTF-8?q?gModal=20=E7=9A=84=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE=20onClic?= =?UTF-8?q?k=20=E4=B8=AD=E6=9C=89=E4=B8=80=E4=B8=AA=20confirm=202.=20handl?= =?UTF-8?q?eDeleteConfig=20=E5=87=BD=E6=95=B0=E5=86=85=E9=83=A8=E4=B9=9F?= =?UTF-8?q?=E6=9C=89=E4=B8=80=E4=B8=AA=20confirm=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=96=B9=E6=A1=88=EF=BC=9A=20=E7=A7=BB=E9=99=A4=20Modal=20?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E4=B8=AD=E7=9A=84=20confirm=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E7=95=99=20handleDeleteConfig=20=E5=86=85=E9=83=A8?= =?UTF-8?q?=E7=9A=84=E7=A1=AE=E8=AE=A4=E9=80=BB=E8=BE=91=EF=BC=8C=E5=9B=A0?= =?UTF-8?q?=E4=B8=BA=E5=AE=83=E5=8C=85=E5=90=AB=E4=BA=86=E6=9B=B4=E5=AE=8C?= =?UTF-8?q?=E6=95=B4=E7=9A=84=E4=BE=9D=E8=B5=96=E6=A3=80=E6=9F=A5=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20=E4=BF=AE=E6=94=B9=E5=86=85=E5=AE=B9=EF=BC=9A=20-?= =?UTF-8?q?=20=E7=A7=BB=E9=99=A4=20ModelConfigModal=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E4=B8=AD=E7=9A=84=20confirm=20-=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=20ExchangeConfigModal=20=E5=88=A0=E9=99=A4=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E4=B8=AD=E7=9A=84=20confirm=20-=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20title=20=E5=B1=9E=E6=80=A7=E4=B8=BA=E6=9B=B4=E5=90=88?= =?UTF-8?q?=E9=80=82=E7=9A=84=E7=BF=BB=E8=AF=91=E9=94=AE=20Co-Authored-By:?= =?UTF-8?q?=20tinkle-community=20=20---------=20Co-a?= =?UTF-8?q?uthored-by:=20tinkle-community=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/AITradersPage.tsx | 56 ++++++++++++++-------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/web/src/components/AITradersPage.tsx b/web/src/components/AITradersPage.tsx index 74a2e9b6..c69956c6 100644 --- a/web/src/components/AITradersPage.tsx +++ b/web/src/components/AITradersPage.tsx @@ -132,19 +132,21 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) { }, [user, token]) // 只显示已配置的模型和交易所(有API Key的才算配置过) - const configuredModels = allModels?.filter((m) => m.apiKey && m.apiKey.trim() !== '') || [] - const configuredExchanges = allExchanges?.filter((e) => { - // Aster 交易所检查特殊字段 - if (e.id === 'aster') { - return e.asterUser && e.asterUser.trim() !== '' - } - // Hyperliquid 只检查私钥 - if (e.id === 'hyperliquid') { + const configuredModels = + allModels?.filter((m) => m.apiKey && m.apiKey.trim() !== '') || [] + const configuredExchanges = + allExchanges?.filter((e) => { + // Aster 交易所检查特殊字段 + if (e.id === 'aster') { + return e.asterUser && e.asterUser.trim() !== '' + } + // Hyperliquid 只检查私钥 + if (e.id === 'hyperliquid') { + return e.apiKey && e.apiKey.trim() !== '' + } + // 其他交易所检查 apiKey return e.apiKey && e.apiKey.trim() !== '' - } - // 其他交易所检查 apiKey - return e.apiKey && e.apiKey.trim() !== '' - }) || [] + }) || [] // 只在创建交易员时使用已启用且配置完整的 const enabledModels = allModels?.filter((m) => m.enabled && m.apiKey) || [] @@ -185,9 +187,7 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) { // 检查交易所是否正在被运行中的交易员使用(用于UI禁用) const isExchangeInUse = (exchangeId: string) => { - return ( - traders?.some((t) => t.exchange_id === exchangeId && t.is_running) - ) + return traders?.some((t) => t.exchange_id === exchangeId && t.is_running) } // 检查模型是否被任何交易员使用(包括停止状态的) @@ -414,7 +414,10 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) { }), updateApi: api.updateModelConfigs, refreshApi: api.getModelConfigs, - setItems: setAllModels, + setItems: (items) => { + // 使用函数式更新确保状态正确更新 + setAllModels([...items]) + }, closeModal: () => { setShowModelModal(false) setEditingModel(null) @@ -526,7 +529,10 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) { }), updateApi: api.updateExchangeConfigs, refreshApi: api.getExchangeConfigs, - setItems: setAllExchanges, + setItems: (items) => { + // 使用函数式更新确保状态正确更新 + setAllExchanges([...items]) + }, closeModal: () => { setShowExchangeModal(false) setEditingExchange(null) @@ -1442,14 +1448,10 @@ function ModelConfigModal({ {editingModelId && ( @@ -1801,17 +1803,13 @@ function ExchangeConfigModal({ {editingExchangeId && (