48 lines
1.2 KiB
JavaScript
48 lines
1.2 KiB
JavaScript
import { reactive } from 'vue'
|
|
|
|
// 后台共享的轻提示:所有视图的操作反馈(成功/失败/进度)从这里发,
|
|
// ToastStack.vue 负责渲染(挂在 AdminLayout 与 LoginView)。
|
|
// EditorView 的上传/转存也走它——原先那套局部实现已并入。
|
|
export const toasts = reactive([])
|
|
let seq = 0
|
|
|
|
export function toast(text, type = 'info', ttl = 2600) {
|
|
const id = ++seq
|
|
toasts.push({ id, text, type })
|
|
setTimeout(() => {
|
|
const i = toasts.findIndex((t) => t.id === id)
|
|
if (i >= 0) toasts.splice(i, 1)
|
|
}, ttl)
|
|
return id
|
|
}
|
|
|
|
export function toastOk(text) {
|
|
return toast(text, 'ok', 2200)
|
|
}
|
|
|
|
export function toastErr(text) {
|
|
return toast(text, 'err', 4200)
|
|
}
|
|
|
|
// 更新一条已存在的 toast(上传进度用)
|
|
export function toastUpdate(id, text, type = 'info') {
|
|
const t = toasts.find((x) => x.id === id)
|
|
if (t) {
|
|
t.text = text
|
|
t.type = type
|
|
}
|
|
}
|
|
|
|
// 标记成功并很快消失(进度条收尾)
|
|
export function toastDone(id, text) {
|
|
toastUpdate(id, text, 'ok')
|
|
const idx = toasts.findIndex((t) => t.id === id)
|
|
if (idx >= 0) {
|
|
const t = toasts[idx]
|
|
setTimeout(() => {
|
|
const i = toasts.indexOf(t)
|
|
if (i >= 0) toasts.splice(i, 1)
|
|
}, 1600)
|
|
}
|
|
}
|