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:
shinchan-zhai
2026-03-21 00:54:36 +08:00
parent 58236ba8b5
commit 53ac52562f
3 changed files with 32 additions and 80 deletions
+22 -55
View File
@@ -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)
+8 -20
View File
@@ -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)