22 lines
1.3 KiB
TypeScript
22 lines
1.3 KiB
TypeScript
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<boolean>
|
|
export function useWorkDraft(dirty: Ref<boolean>, pending: Ref<boolean>) {
|
|
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)
|
|
}
|