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 && (