You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.7 KiB
66 lines
1.7 KiB
import { ElMessage, type MessageHandler } from 'element-plus'
|
|
|
|
let downloadBusy = false
|
|
|
|
export function isDownloadBusy(): boolean {
|
|
return downloadBusy
|
|
}
|
|
|
|
export function formatDownloadSizeHint(size?: number | null): string {
|
|
if (size == null || !Number.isFinite(size) || size <= 0) return ''
|
|
if (size < 1024 * 1024) return `约 ${Math.max(1, Math.round(size / 1024))} KB`
|
|
return `约 ${(size / (1024 * 1024)).toFixed(1)} MB`
|
|
}
|
|
|
|
export type DownloadFeedbackHandle = {
|
|
setText: (text: string) => void
|
|
close: () => void
|
|
}
|
|
|
|
/**
|
|
* 下载过程中的轻量提示(非全屏);若已有下载进行中则提示并返回 null。
|
|
*/
|
|
export function beginDownloadFeedback(
|
|
fileName: string,
|
|
size?: number | null,
|
|
actionLabel = '下载',
|
|
): DownloadFeedbackHandle | null {
|
|
if (downloadBusy) {
|
|
ElMessage.warning(`附件正在${actionLabel}中,请勿重复点击`)
|
|
return null
|
|
}
|
|
downloadBusy = true
|
|
const name = fileName.trim() || '附件'
|
|
const sizeHint = formatDownloadSizeHint(size)
|
|
const text = sizeHint
|
|
? `正在准备${actionLabel}「${name}」(${sizeHint}),文件较大时请耐心等待…`
|
|
: `正在准备${actionLabel}「${name}」,请稍候…`
|
|
|
|
let handler: MessageHandler = ElMessage({
|
|
type: 'info',
|
|
message: text,
|
|
duration: 0,
|
|
showClose: true,
|
|
})
|
|
|
|
return {
|
|
setText: (next: string) => {
|
|
handler.close()
|
|
handler = ElMessage({
|
|
type: 'info',
|
|
message: next,
|
|
duration: 0,
|
|
showClose: true,
|
|
})
|
|
},
|
|
close: () => {
|
|
handler.close()
|
|
downloadBusy = false
|
|
},
|
|
}
|
|
}
|
|
|
|
export function notifyDownloadStarted(): void {
|
|
ElMessage.success('下载已开始,请查看浏览器下载进度')
|
|
}
|