diff --git a/apps/frontend/src/composables/useAdminAction.ts b/apps/frontend/src/composables/useAdminAction.ts new file mode 100644 index 00000000..2bcb9321 --- /dev/null +++ b/apps/frontend/src/composables/useAdminAction.ts @@ -0,0 +1,42 @@ +import { ref } from 'vue' + +import { isFeedbackDismissed, showConfirm, showError, showSuccess } from '@/lib/feedback' + +export interface RunActionOptions { + id: number | string + action: () => Promise + successMessage: string + confirmText: string + onAfterAction?: () => Promise | void +} + +export function useAdminAction() { + const actionLoadingId = ref(null) + + async function runAction(options: RunActionOptions) { + try { + await showConfirm(options.confirmText, '确认操作', { + type: 'warning', + confirmButtonText: '继续执行', + cancelButtonText: '取消', + }) + } catch (error) { + if (isFeedbackDismissed(error)) return + throw error + } + + actionLoadingId.value = options.id + + try { + await options.action() + showSuccess(options.successMessage) + if (options.onAfterAction) await options.onAfterAction() + } catch (error) { + showError(error instanceof Error ? error.message : '操作失败') + } finally { + actionLoadingId.value = null + } + } + + return { actionLoadingId, runAction } +} diff --git a/apps/frontend/src/views/admin/audit-logs/AdminAuditLogsView.vue b/apps/frontend/src/views/admin/audit-logs/AdminAuditLogsView.vue index 53ddd73e..91d5eb06 100644 --- a/apps/frontend/src/views/admin/audit-logs/AdminAuditLogsView.vue +++ b/apps/frontend/src/views/admin/audit-logs/AdminAuditLogsView.vue @@ -1,62 +1,52 @@