import { Message } from '@arco-design/web-vue' import type { MessageConfig, MessageReturn } from '@arco-design/web-vue/es/message/interface' // Frozen API (Phase 005). Naive-style call sites migrate here; extend this // adapter instead of importing Arco's Message directly in views/components. // Naive: message.success(text, { duration }) — Arco only accepts // (config, appContext), so options must be merged into the config object. export interface AppMessageOptions { content: string duration?: number closable?: boolean } export type AppMessageContent = string | AppMessageOptions export interface AppMessageCallOptions { duration?: number closable?: boolean } function toConfig(content: AppMessageContent, options?: AppMessageCallOptions): MessageConfig { const config: MessageConfig = typeof content === 'string' ? { content } : { ...content } if (options?.duration !== undefined) config.duration = options.duration if (options?.closable !== undefined) config.closable = options.closable return config } // Naive's MessageReactive exposes destroy(); Arco's MessageReturn only // exposes close(). Expose both so migrated call sites can use either. export type AppMessageReturn = MessageReturn & { destroy: () => void } function wrap(ret: MessageReturn): AppMessageReturn { return { ...ret, destroy: () => ret.close() } } export function useMessage() { return { success: (content: AppMessageContent, options?: AppMessageCallOptions) => wrap(Message.success(toConfig(content, options))), error: (content: AppMessageContent, options?: AppMessageCallOptions) => wrap(Message.error(toConfig(content, options))), warning: (content: AppMessageContent, options?: AppMessageCallOptions) => wrap(Message.warning(toConfig(content, options))), info: (content: AppMessageContent, options?: AppMessageCallOptions) => wrap(Message.info(toConfig(content, options))), loading: (content: AppMessageContent, options?: AppMessageCallOptions) => wrap(Message.loading(toConfig(content, options))), } } export type AppMessage = ReturnType