From 6eb4d8f5c550423a8f40ed8cecf9aea7aac9ed43 Mon Sep 17 00:00:00 2001 From: Cherry7 <79909910+CCherry07@users.noreply.github.com> Date: Fri, 5 May 2023 09:59:57 +0800 Subject: [PATCH] Feat(use): add useMessage useNotification (#6527) * feat(Message): add useMessage hook * feat(Notification): add useNotification hook * feat(Message): add Hook demo * feat(Notification): add Hook demo * test(Message): update demo snap * test(Notification): update demo snap * docs(Message): update docs with FAQ * docs(Notification): update docs with FAQ --- components/_util/util.ts | 19 ++ components/message/PurePanel.tsx | 79 ++++++ .../__tests__/__snapshots__/demo.test.js.snap | 8 + components/message/demo/hook.vue | 31 +++ components/message/demo/index.vue | 3 + components/message/index.en-US.md | 31 +++ components/message/index.tsx | 6 +- components/message/index.zh-CN.md | 31 +++ components/message/interface.ts | 48 ++++ components/message/useMessage.tsx | 228 +++++++++++++++++ components/notification/PurePanel.tsx | 109 +++++++++ .../__tests__/__snapshots__/demo.test.js.snap | 28 +++ components/notification/demo/hook.vue | 61 +++++ components/notification/demo/index.vue | 3 + components/notification/index.en-US.md | 31 +++ components/notification/index.tsx | 4 + components/notification/index.zh-CN.md | 31 +++ components/notification/interface.ts | 61 +++++ components/notification/useNotification.tsx | 154 ++++++++++++ components/notification/util.ts | 73 ++++++ .../vc-notification/HookNotification.tsx | 230 ++++++++++++++++++ components/vc-notification/Notification.tsx | 13 +- components/vc-notification/index.ts | 5 +- .../vc-notification/useNotification.tsx | 184 ++++++++++++++ 24 files changed, 1465 insertions(+), 6 deletions(-) create mode 100644 components/message/PurePanel.tsx create mode 100644 components/message/demo/hook.vue create mode 100644 components/message/interface.ts create mode 100644 components/message/useMessage.tsx create mode 100644 components/notification/PurePanel.tsx create mode 100644 components/notification/demo/hook.vue create mode 100644 components/notification/interface.ts create mode 100644 components/notification/useNotification.tsx create mode 100644 components/notification/util.ts create mode 100644 components/vc-notification/HookNotification.tsx create mode 100644 components/vc-notification/useNotification.tsx 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`] = `