diff --git a/components/_util/util.ts b/components/_util/util.ts index 7be837e532..aff3788321 100644 --- a/components/_util/util.ts +++ b/components/_util/util.ts @@ -78,5 +78,24 @@ export function renderHelper>( } return v ?? defaultV; } +export function wrapPromiseFn(openFn: (resolve: VoidFunction) => VoidFunction) { + let closeFn: VoidFunction; + + const closePromise = new Promise(resolve => { + closeFn = openFn(() => { + resolve(true); + }); + }); + + const result: any = () => { + closeFn?.(); + }; + + result.then = (filled: VoidFunction, rejected: VoidFunction) => + closePromise.then(filled, rejected); + result.promise = closePromise; + + return result; +} export { isOn, cacheStringFunction, camelize, hyphenate, capitalize, resolvePropValue }; diff --git a/components/message/PurePanel.tsx b/components/message/PurePanel.tsx new file mode 100644 index 0000000000..5ce5b45002 --- /dev/null +++ b/components/message/PurePanel.tsx @@ -0,0 +1,79 @@ +import Notice from '../vc-notification/Notice'; +import type { NoticeProps } from '../vc-notification/Notice'; +import useStyle from './style'; +import type { NoticeType } from './interface'; +import { + CheckCircleFilled, + CloseCircleFilled, + ExclamationCircleFilled, + InfoCircleFilled, + LoadingOutlined, +} from '@ant-design/icons-vue'; +import type { VueNode } from '../_util/type'; +import classNames from '../_util/classNames'; +import { useConfigContextInject } from '../config-provider/context'; +import { computed, defineComponent } from 'vue'; + +export const TypeIcon = { + info: , + success: , + error: , + warning: , + loading: , +}; + +export interface PureContentProps { + prefixCls: string; + type?: NoticeType; + icon?: VueNode; + children: VueNode; +} + +export const PureContent = defineComponent({ + name: 'PureContent', + inheritAttrs: false, + props: ['prefixCls', 'type', 'icon'] as any, + + setup(props, { slots }) { + return () => ( +
+ {props.icon || TypeIcon[props.type!]} + {slots.default?.()} +
+ ); + }, +}); + +export interface PurePanelProps + extends Omit, + Omit { + prefixCls?: string; +} + +/** @private Internal Component. Do not use in your production. */ + +export default defineComponent({ + name: 'PurePanel', + inheritAttrs: false, + props: ['prefixCls', 'class', 'type', 'icon', 'content'] as any, + setup(props, { slots, attrs }) { + const { getPrefixCls } = useConfigContextInject(); + const prefixCls = computed(() => props.staticPrefixCls || getPrefixCls('message')); + const [, hashId] = useStyle(prefixCls); + return ( + + + {slots.default?.()} + + + ); + }, +}); diff --git a/components/message/__tests__/__snapshots__/demo.test.js.snap b/components/message/__tests__/__snapshots__/demo.test.js.snap index fd9720aca0..e5c9a68372 100644 --- a/components/message/__tests__/__snapshots__/demo.test.js.snap +++ b/components/message/__tests__/__snapshots__/demo.test.js.snap @@ -12,6 +12,14 @@ exports[`renders ./components/message/demo/duration.vue correctly 1`] = ` `; +exports[`renders ./components/message/demo/hook.vue correctly 1`] = ` + + + +`; + exports[`renders ./components/message/demo/info.vue correctly 1`] = `