mirror of
https://github.com/laoxong/nofx.git
synced 2026-06-04 09:58:22 +08:00
fix: replace toast.promise with await to ensure state refresh after API calls
sonner's toast.promise() returns a toast ID (not a Promise), so await resolves immediately and subsequent data refresh fetches stale data. Users had to manually reload to see changes. Fixed across AITradersPage, SettingsPage, and TraderConfigModal.
This commit is contained in:
@@ -211,11 +211,8 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
|
||||
return
|
||||
}
|
||||
|
||||
await toast.promise(api.createTrader(data), {
|
||||
loading: t('aiTradersToast.creating', language),
|
||||
success: t('aiTradersToast.created', language),
|
||||
error: t('aiTradersToast.createFailed', language),
|
||||
})
|
||||
await api.createTrader(data)
|
||||
toast.success(t('aiTradersToast.created', language))
|
||||
setShowCreateModal(false)
|
||||
await mutateTraders()
|
||||
} catch (error) {
|
||||
@@ -268,11 +265,8 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
|
||||
console.log('🔥 handleSaveEditTrader - data.strategy_id:', data.strategy_id)
|
||||
console.log('🔥 handleSaveEditTrader - request:', request)
|
||||
|
||||
await toast.promise(api.updateTrader(editingTrader.trader_id, request), {
|
||||
loading: t('aiTradersToast.saving', language),
|
||||
success: t('aiTradersToast.saved', language),
|
||||
error: t('aiTradersToast.saveFailed', language),
|
||||
})
|
||||
await api.updateTrader(editingTrader.trader_id, request)
|
||||
toast.success(t('aiTradersToast.saved', language))
|
||||
setShowEditModal(false)
|
||||
setEditingTrader(null)
|
||||
await mutateTraders()
|
||||
@@ -289,11 +283,8 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
|
||||
}
|
||||
|
||||
try {
|
||||
await toast.promise(api.deleteTrader(traderId), {
|
||||
loading: t('aiTradersToast.deleting', language),
|
||||
success: t('aiTradersToast.deleted', language),
|
||||
error: t('aiTradersToast.deleteFailed', language),
|
||||
})
|
||||
await api.deleteTrader(traderId)
|
||||
toast.success(t('aiTradersToast.deleted', language))
|
||||
|
||||
await mutateTraders()
|
||||
} catch (error) {
|
||||
@@ -305,17 +296,11 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
|
||||
const handleToggleTrader = async (traderId: string, running: boolean) => {
|
||||
try {
|
||||
if (running) {
|
||||
await toast.promise(api.stopTrader(traderId), {
|
||||
loading: t('aiTradersToast.stopping', language),
|
||||
success: t('aiTradersToast.stopped', language),
|
||||
error: t('aiTradersToast.stopFailed', language),
|
||||
})
|
||||
await api.stopTrader(traderId)
|
||||
toast.success(t('aiTradersToast.stopped', language))
|
||||
} else {
|
||||
await toast.promise(api.startTrader(traderId), {
|
||||
loading: t('aiTradersToast.starting', language),
|
||||
success: t('aiTradersToast.started', language),
|
||||
error: t('aiTradersToast.startFailed', language),
|
||||
})
|
||||
await api.startTrader(traderId)
|
||||
toast.success(t('aiTradersToast.started', language))
|
||||
}
|
||||
|
||||
await mutateTraders()
|
||||
@@ -328,11 +313,8 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
|
||||
const handleToggleCompetition = async (traderId: string, currentShowInCompetition: boolean) => {
|
||||
try {
|
||||
const newValue = !currentShowInCompetition
|
||||
await toast.promise(api.toggleCompetition(traderId, newValue), {
|
||||
loading: t('aiTradersToast.updating', language),
|
||||
success: newValue ? t('aiTradersToast.showInCompetition', language) : t('aiTradersToast.hideInCompetition', language),
|
||||
error: t('aiTradersToast.updateFailed', language),
|
||||
})
|
||||
await api.toggleCompetition(traderId, newValue)
|
||||
toast.success(newValue ? t('aiTradersToast.showInCompetition', language) : t('aiTradersToast.hideInCompetition', language))
|
||||
|
||||
await mutateTraders()
|
||||
} catch (error) {
|
||||
@@ -392,11 +374,8 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
|
||||
) || []
|
||||
|
||||
const request = config.buildRequest(updatedItems)
|
||||
await toast.promise(config.updateApi(request), {
|
||||
loading: t('aiTradersToast.updatingConfig', language),
|
||||
success: t('aiTradersToast.configUpdated', language),
|
||||
error: t('aiTradersToast.configUpdateFailed', language),
|
||||
})
|
||||
await config.updateApi(request)
|
||||
toast.success(t('aiTradersToast.configUpdated', language))
|
||||
|
||||
const refreshedItems = await config.refreshApi()
|
||||
config.setItems(refreshedItems)
|
||||
@@ -505,11 +484,8 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
|
||||
),
|
||||
}
|
||||
|
||||
await toast.promise(api.updateModelConfigs(request), {
|
||||
loading: t('aiTradersToast.updatingModelConfig', language),
|
||||
success: t('aiTradersToast.modelConfigUpdated', language),
|
||||
error: t('aiTradersToast.modelConfigUpdateFailed', language),
|
||||
})
|
||||
await api.updateModelConfigs(request)
|
||||
toast.success(t('aiTradersToast.modelConfigUpdated', language))
|
||||
|
||||
const refreshedModels = await api.getModelConfigs()
|
||||
setAllModels(refreshedModels)
|
||||
@@ -535,11 +511,8 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
|
||||
if (!ok) return
|
||||
|
||||
try {
|
||||
await toast.promise(api.deleteExchange(exchangeId), {
|
||||
loading: t('aiTradersToast.deletingExchange', language),
|
||||
success: t('aiTradersToast.exchangeDeleted', language),
|
||||
error: t('aiTradersToast.exchangeDeleteFailed', language),
|
||||
})
|
||||
await api.deleteExchange(exchangeId)
|
||||
toast.success(t('aiTradersToast.exchangeDeleted', language))
|
||||
|
||||
const refreshedExchanges = await api.getExchangeConfigs()
|
||||
setAllExchanges(refreshedExchanges)
|
||||
@@ -597,11 +570,8 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
|
||||
},
|
||||
}
|
||||
|
||||
await toast.promise(api.updateExchangeConfigsEncrypted(request), {
|
||||
loading: t('aiTradersToast.updatingExchangeConfig', language),
|
||||
success: t('aiTradersToast.exchangeConfigUpdated', language),
|
||||
error: t('aiTradersToast.exchangeConfigUpdateFailed', language),
|
||||
})
|
||||
await api.updateExchangeConfigsEncrypted(request)
|
||||
toast.success(t('aiTradersToast.exchangeConfigUpdated', language))
|
||||
} else {
|
||||
const createRequest = {
|
||||
exchange_type: exchangeType,
|
||||
@@ -621,11 +591,8 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) {
|
||||
lighter_api_key_index: lighterApiKeyIndex || 0,
|
||||
}
|
||||
|
||||
await toast.promise(api.createExchangeEncrypted(createRequest), {
|
||||
loading: t('aiTradersToast.creatingExchange', language),
|
||||
success: t('aiTradersToast.exchangeCreated', language),
|
||||
error: t('aiTradersToast.exchangeCreateFailed', language),
|
||||
})
|
||||
await api.createExchangeEncrypted(createRequest)
|
||||
toast.success(t('aiTradersToast.exchangeCreated', language))
|
||||
}
|
||||
|
||||
const refreshedExchanges = await api.getExchangeConfigs()
|
||||
|
||||
@@ -174,11 +174,8 @@ export function TraderConfigModal({
|
||||
saveData.initial_balance = formData.initial_balance
|
||||
}
|
||||
|
||||
await toast.promise(onSave(saveData), {
|
||||
loading: t('saving', language),
|
||||
success: t('saveSuccess', language),
|
||||
error: t('saveFailed', language),
|
||||
})
|
||||
await onSave(saveData)
|
||||
toast.success(t('saveSuccess', language))
|
||||
onClose()
|
||||
} catch (error) {
|
||||
console.error(t('saveFailed', language) + ':', error)
|
||||
|
||||
@@ -120,11 +120,8 @@ export function SettingsPage() {
|
||||
}])
|
||||
),
|
||||
}
|
||||
await toast.promise(api.updateModelConfigs(request), {
|
||||
loading: 'Saving model config...',
|
||||
success: 'Model config saved',
|
||||
error: 'Failed to save model config',
|
||||
})
|
||||
await api.updateModelConfigs(request)
|
||||
toast.success('Model config saved')
|
||||
const refreshed = await api.getModelConfigs()
|
||||
setConfiguredModels(refreshed)
|
||||
setShowModelModal(false)
|
||||
@@ -198,11 +195,8 @@ export function SettingsPage() {
|
||||
},
|
||||
},
|
||||
}
|
||||
await toast.promise(api.updateExchangeConfigsEncrypted(request), {
|
||||
loading: 'Updating exchange config...',
|
||||
success: 'Exchange config updated',
|
||||
error: 'Failed to update exchange config',
|
||||
})
|
||||
await api.updateExchangeConfigsEncrypted(request)
|
||||
toast.success('Exchange config updated')
|
||||
} else {
|
||||
const createRequest = {
|
||||
exchange_type: exchangeType,
|
||||
@@ -221,11 +215,8 @@ export function SettingsPage() {
|
||||
lighter_api_key_private_key: lighterApiKeyPrivateKey || '',
|
||||
lighter_api_key_index: lighterApiKeyIndex || 0,
|
||||
}
|
||||
await toast.promise(api.createExchangeEncrypted(createRequest), {
|
||||
loading: 'Creating exchange account...',
|
||||
success: 'Exchange account created',
|
||||
error: 'Failed to create exchange account',
|
||||
})
|
||||
await api.createExchangeEncrypted(createRequest)
|
||||
toast.success('Exchange account created')
|
||||
}
|
||||
const refreshed = await api.getExchangeConfigs()
|
||||
setExchanges(refreshed)
|
||||
@@ -238,11 +229,8 @@ export function SettingsPage() {
|
||||
|
||||
const handleDeleteExchange = async (exchangeId: string) => {
|
||||
try {
|
||||
await toast.promise(api.deleteExchange(exchangeId), {
|
||||
loading: 'Deleting exchange account...',
|
||||
success: 'Exchange account deleted',
|
||||
error: 'Failed to delete exchange account',
|
||||
})
|
||||
await api.deleteExchange(exchangeId)
|
||||
toast.success('Exchange account deleted')
|
||||
const refreshed = await api.getExchangeConfigs()
|
||||
setExchanges(refreshed)
|
||||
setShowExchangeModal(false)
|
||||
|
||||
Reference in New Issue
Block a user