Files
AllinSSL/frontend/packages/vue/naive-ui/src/hooks/useMessage.tsx
2026-01-13 17:47:39 +08:00

84 lines
2.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { computed, getCurrentInstance } from 'vue'
import { useMessage as useNaiveMessage, createDiscreteApi, type MessageOptions } from 'naive-ui'
import { useTheme } from '../theme'
import type { MessageApiExtended } from '../types/message'
/**
* 消息提示钩子函数,兼容组件内和非组件环境
*
* 在组件中使用时,使用 Naive UI 的 useMessage
* 在非组件环境中,使用 createDiscreteApi 创建消息实例
*/
export function useMessage(): MessageApiExtended {
// 判断是否在setup中使用
const instance = getCurrentInstance()
// 在setup中使用原生useMessage
if (instance && instance?.setupContext) {
const naiveMessage = useNaiveMessage()
return {
...naiveMessage,
request: (data: { status: boolean; message: string }, options?: MessageOptions) => {
if (data.status) {
return naiveMessage.success(data.message, options)
} else {
return naiveMessage.error(data.message, options)
}
},
}
}
// 在非组件环境中使用createDiscreteApi
const { theme, themeOverrides } = useTheme()
// 创建configProviderProps
const configProviderProps = computed(() => ({
theme: theme.value,
themeOverrides: themeOverrides.value,
}))
// 创建discreteMessage实例
const { message, unmount } = createDiscreteApi(['message'], { configProviderProps })
// 创建包装函数添加unmount到onAfterLeave
const wrapMethod =
(method: any) =>
(content: string, options: MessageOptions = {}) => {
const newOptions = {
...options,
onAfterLeave: () => {
options.onAfterLeave?.()
},
}
return method(content, newOptions)
}
// 包装所有消息方法
const wrappedMessage = {
...message,
info: wrapMethod(message.info),
success: wrapMethod(message.success),
warning: wrapMethod(message.warning),
error: wrapMethod(message.error),
loading: wrapMethod(message.loading),
request: (data: { status: boolean; message: string }, options: MessageOptions = {}) => {
const newOptions = {
...options,
onAfterLeave: () => {
options.onAfterLeave?.()
},
}
if (data.status) {
return wrapMethod(message.success)(data.message, newOptions)
} else {
return wrapMethod(message.error)(data.message, newOptions)
}
},
} as MessageApiExtended
return wrappedMessage
}
export default useMessage