UNPKG

2.68 kBJavaScriptView Raw
1"use client";
2
3import React, { useContext } from 'react';
4import classNames from 'classnames';
5import { devUseWarning } from '../_util/warning';
6import { ConfigContext } from '../config-provider';
7import useMessage from '../message/useMessage';
8import useModal from '../modal/useModal';
9import useNotification from '../notification/useNotification';
10import AppContext, { AppConfigContext } from './context';
11import useStyle from './style';
12const useApp = () => React.useContext(AppContext);
13const App = props => {
14 const {
15 prefixCls: customizePrefixCls,
16 children,
17 className,
18 rootClassName,
19 message,
20 notification,
21 style,
22 component = 'div'
23 } = props;
24 const {
25 getPrefixCls
26 } = useContext(ConfigContext);
27 const prefixCls = getPrefixCls('app', customizePrefixCls);
28 const [wrapCSSVar, hashId, cssVarCls] = useStyle(prefixCls);
29 const customClassName = classNames(hashId, prefixCls, className, rootClassName, cssVarCls);
30 const appConfig = useContext(AppConfigContext);
31 const mergedAppConfig = React.useMemo(() => ({
32 message: Object.assign(Object.assign({}, appConfig.message), message),
33 notification: Object.assign(Object.assign({}, appConfig.notification), notification)
34 }), [message, notification, appConfig.message, appConfig.notification]);
35 const [messageApi, messageContextHolder] = useMessage(mergedAppConfig.message);
36 const [notificationApi, notificationContextHolder] = useNotification(mergedAppConfig.notification);
37 const [ModalApi, ModalContextHolder] = useModal();
38 const memoizedContextValue = React.useMemo(() => ({
39 message: messageApi,
40 notification: notificationApi,
41 modal: ModalApi
42 }), [messageApi, notificationApi, ModalApi]);
43 // https://github.com/ant-design/ant-design/issues/48802#issuecomment-2097813526
44 devUseWarning('App')(!(cssVarCls && component === false), 'usage', 'When using cssVar, ensure `component` is assigned a valid React component string.');
45 // ============================ Render ============================
46 const Component = component === false ? React.Fragment : component;
47 const rootProps = {
48 className: customClassName,
49 style
50 };
51 return wrapCSSVar(/*#__PURE__*/React.createElement(AppContext.Provider, {
52 value: memoizedContextValue
53 }, /*#__PURE__*/React.createElement(AppConfigContext.Provider, {
54 value: mergedAppConfig
55 }, /*#__PURE__*/React.createElement(Component, Object.assign({}, component === false ? undefined : rootProps), ModalContextHolder, messageContextHolder, notificationContextHolder, children))));
56};
57if (process.env.NODE_ENV !== 'production') {
58 App.displayName = 'App';
59}
60App.useApp = useApp;
61export default App;
\No newline at end of file