- 新增 useToast composable: 消除 AiChat/Settings/Projects 4处 toast 重复 统一默认3000ms(Projects原4000ms为操作类提示保留参数覆盖) - 新增 utils/json.ts parseJsonArray: 消除 parseStack/parseTags/ModuleNode 3处JSON字符串数组解析重复 - 新增 utils/html.ts escapeHtml: 消除 useMarkdown/FilePreview 2处重复 - ProjectDetail score-bar 内联三元改用 scoreTier(消除最后一处阈值硬编码) - ConversationSidebar 删除 formatTime 透传包装(直接用 formatRelative) - 清理死代码: parseTs/stringifyError/ErrorSink/_Unused 改私有或删除 wrapNakedDiff 改私有(无外部 import) - ModuleNode shortPath 改名 truncatedPath(与 useToolCard.shortPath 语义不同)
60 lines
1.5 KiB
TypeScript
60 lines
1.5 KiB
TypeScript
/**
|
|
* 轻量 toast 提示 composable — 消除 AiChat / Settings / Projects / TaskDetail 4 处重复。
|
|
*
|
|
* 原 4 处各自 reactive/ref + _toastTimer + showToast + onUnmounted 清理,
|
|
* 且 Projects 用 4000ms 其余 3000ms(体验不一致 bug)。
|
|
* 本 composable 统一默认 3000ms,支持调用方按需传 durationMs。
|
|
*
|
|
* 用法:
|
|
* const { toast, showToast } = useToast()
|
|
* showToast('保存成功')
|
|
* showToast('导入失败', 'error', 4000)
|
|
* // template: <div v-if="toast.visible" class="toast ...">{{ toast.msg }}</div>
|
|
*/
|
|
import { reactive, onUnmounted } from 'vue'
|
|
|
|
export type ToastType = 'info' | 'error' | 'warning'
|
|
|
|
export interface ToastState {
|
|
visible: boolean
|
|
msg: string
|
|
type: ToastType
|
|
}
|
|
|
|
let _timer: ReturnType<typeof setTimeout> | null = null
|
|
|
|
export function useToast(defaultDurationMs = 3000) {
|
|
const toast = reactive<ToastState>({
|
|
visible: false,
|
|
msg: '',
|
|
type: 'info',
|
|
})
|
|
|
|
function showToast(msg: string, type: ToastType = 'info', durationMs?: number) {
|
|
toast.msg = msg
|
|
toast.type = type
|
|
toast.visible = true
|
|
if (_timer) clearTimeout(_timer)
|
|
_timer = setTimeout(() => {
|
|
toast.visible = false
|
|
}, durationMs ?? defaultDurationMs)
|
|
}
|
|
|
|
function hideToast() {
|
|
if (_timer) {
|
|
clearTimeout(_timer)
|
|
_timer = null
|
|
}
|
|
toast.visible = false
|
|
}
|
|
|
|
onUnmounted(() => {
|
|
if (_timer) {
|
|
clearTimeout(_timer)
|
|
_timer = null
|
|
}
|
|
})
|
|
|
|
return { toast, showToast, hideToast }
|
|
}
|