import { Message } from '@arco-design/web-vue'; export type BaseMessageType = 'success' | 'error' | 'warning' | 'info'; export type BaseMessageOptions = { /** 显示时长 ms */ duration?: number; /** 是否显示关闭按钮 */ closable?: boolean; /** 悬停时重置倒计时 */ resetOnHover?: boolean; }; type MessageConfigLike = { content: any; duration?: number; closable?: boolean; resetOnHover?: boolean; [key: string]: any; }; /** 全局默认:可手动关闭;错误/警告多停留约 5s(合计 8s) */ const GLOBAL_MESSAGE_DEFAULTS: Record< 'info' | 'success' | 'warning' | 'error' | 'normal', { duration: number; closable: boolean; resetOnHover: boolean } > = { info: { duration: 3000, closable: true, resetOnHover: true }, success: { duration: 3000, closable: true, resetOnHover: true }, warning: { duration: 8000, closable: true, resetOnHover: true }, error: { duration: 8000, closable: true, resetOnHover: true }, normal: { duration: 3000, closable: true, resetOnHover: true }, }; type PatchableType = keyof typeof GLOBAL_MESSAGE_DEFAULTS; let messageDefaultsInstalled = false; function mergeMessageConfig( type: PatchableType, config: string | MessageConfigLike, ): MessageConfigLike { const defaults = GLOBAL_MESSAGE_DEFAULTS[type]; if (typeof config === 'string') { return { content: config, ...defaults, }; } return { ...defaults, ...config, duration: config.duration ?? defaults.duration, closable: config.closable ?? defaults.closable, resetOnHover: config.resetOnHover ?? defaults.resetOnHover, }; } /** 安装全局 Message 默认行为(幂等)。覆盖 Message.* 与 $baseMessage。 */ export function installGlobalMessageDefaults() { if (messageDefaultsInstalled) return; messageDefaultsInstalled = true; (Object.keys(GLOBAL_MESSAGE_DEFAULTS) as PatchableType[]).forEach((type) => { const original = (Message[type] as any).bind(Message); (Message as any)[type] = (config: string | MessageConfigLike, appContext?: any) => { return original(mergeMessageConfig(type, config), appContext); }; }); } // 被任何路径 import 时即安装,保证 request 拦截器等直接 Message.error 也生效 installGlobalMessageDefaults(); /** * 全局消息提示 * @param message 消息内容 * @param type 消息类型 * @param options 可覆盖全局默认(duration / closable / resetOnHover) */ export const baseMessage = ( message: string, type: BaseMessageType = 'info', options?: BaseMessageOptions, ) => { Message[type]({ content: message, ...options, }); }; export const $baseMessage = baseMessage; export default baseMessage;