import { inject, onBeforeUnmount, type Ref } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import axios from 'axios' import { ApiResponseError, getApiErrorDetails } from '@/shared/api/http' export type LeaveGuard = () => Promise export function useWorkDraft(dirty: Ref, pending: Ref) { const register = inject<((guard: LeaveGuard) => () => void) | undefined>('appointment-work-leave-guard', undefined) const canLeave: LeaveGuard = async () => { if (pending.value) { ElMessage.warning('本次保存结果待确认,请重试后再离开'); return false } if (!dirty.value) return true try { await ElMessageBox.confirm('未保存的内容将丢失,确认离开?', '保留编辑', { confirmButtonText: '离开', cancelButtonText: '继续编辑', customClass: 'admin-density-confirm' }); return true } catch { return false } } const unregister = register?.(canLeave) onBeforeUnmount(() => unregister?.()) return canLeave } export function rejectedCommand(cause: unknown) { const status = cause instanceof ApiResponseError ? cause.status : axios.isAxiosError(cause) ? cause.response?.status : undefined const code = getApiErrorDetails(cause).code || '' return [400, 403, 404, 409, 422].includes(status || 0) || /^(HTTP_|A0?)?(400|403|404|409|422)$/.test(code) }