2026-03-04 00:18:47 +08:00
|
|
|
import { ref } from 'vue'
|
|
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
|
|
|
|
|
|
|
import { humanizeError } from '../api'
|
2026-03-04 00:18:59 +08:00
|
|
|
import { announcePolite } from '../utils/liveRegion'
|
2026-03-04 00:18:47 +08:00
|
|
|
|
|
|
|
|
export function useAsyncAction() {
|
|
|
|
|
const loading = ref(false)
|
2026-03-04 00:18:59 +08:00
|
|
|
const errorMessage = ref('')
|
|
|
|
|
|
|
|
|
|
function clearError() {
|
|
|
|
|
errorMessage.value = ''
|
|
|
|
|
}
|
2026-03-04 00:18:47 +08:00
|
|
|
|
|
|
|
|
async function run(task, fallbackMessage) {
|
|
|
|
|
loading.value = true
|
2026-03-04 00:18:59 +08:00
|
|
|
clearError()
|
2026-03-04 00:18:47 +08:00
|
|
|
try {
|
|
|
|
|
return await task()
|
|
|
|
|
} catch (error) {
|
2026-03-04 00:18:59 +08:00
|
|
|
errorMessage.value = humanizeError(error, fallbackMessage)
|
|
|
|
|
announcePolite(errorMessage.value)
|
|
|
|
|
ElMessage.error(errorMessage.value)
|
2026-03-04 00:18:47 +08:00
|
|
|
throw error
|
|
|
|
|
} finally {
|
|
|
|
|
loading.value = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
2026-03-04 00:18:59 +08:00
|
|
|
clearError,
|
|
|
|
|
errorMessage,
|
2026-03-04 00:18:47 +08:00
|
|
|
loading,
|
|
|
|
|
run,
|
|
|
|
|
}
|
|
|
|
|
}
|