import * as React from 'react';
import CheckCircleFilled from '@ant-design/icons/CheckCircleFilled';
import CloseCircleFilled from '@ant-design/icons/CloseCircleFilled';
import ExclamationCircleFilled from '@ant-design/icons/ExclamationCircleFilled';
import InfoCircleFilled from '@ant-design/icons/InfoCircleFilled';
import LoadingOutlined from '@ant-design/icons/LoadingOutlined';
import { Notice } from '@rc-component/notification';
import type { NoticeProps } from '@rc-component/notification/lib/Notice';
import { clsx } from 'clsx';
import { useMergeSemantic } from '../_util/hooks';
import { cloneElement } from '../_util/reactNode';
import { useComponentConfig } from '../config-provider/context';
import useCSSVarCls from '../config-provider/hooks/useCSSVarCls';
import type {
ArgsClassNamesType,
ArgsStylesType,
MessageSemanticClassNames,
MessageSemanticStyles,
NoticeType,
} from './interface';
import useStyle from './style';
export const TypeIcon = {
info: ,
success: ,
error: ,
warning: ,
loading: ,
};
export interface PureContentProps {
prefixCls: string;
type?: NoticeType;
icon?: React.ReactNode;
classNames?: MessageSemanticClassNames;
styles?: MessageSemanticStyles;
}
export const PureContent: React.FC> = (props) => {
const { prefixCls, type, icon, children, classNames: pureContentClassNames, styles } = props;
const iconElement = icon || (type && TypeIcon[type]);
const iconNode = cloneElement>(iconElement, (currentProps) => {
const mergedStyle: React.CSSProperties = { ...currentProps?.style, ...styles?.icon };
return {
className: clsx(currentProps.className, pureContentClassNames?.icon),
style: mergedStyle,
};
});
return (
{iconNode}
{children}
);
};
export interface PurePanelProps
extends Omit,
Omit {
prefixCls?: string;
classNames?: ArgsClassNamesType;
styles?: ArgsStylesType;
}
/** @private Internal Component. Do not use in your production. */
const PurePanel: React.FC = (props) => {
const {
prefixCls: staticPrefixCls,
className,
style,
type,
icon,
content,
classNames: messageClassNames,
styles,
...restProps
} = props;
const {
getPrefixCls,
className: contextClassName,
style: contextStyle,
classNames: contextClassNames,
styles: contextStyles,
} = useComponentConfig('message');
const prefixCls = staticPrefixCls || getPrefixCls('message');
const rootCls = useCSSVarCls(prefixCls);
const [hashId, cssVarCls] = useStyle(prefixCls, rootCls);
const [mergedClassNames, mergedStyles] = useMergeSemantic<
ArgsClassNamesType,
ArgsStylesType,
PurePanelProps
>([contextClassNames, messageClassNames], [contextStyles, styles], {
props,
});
return (
{content}
}
/>
);
};
export default PurePanel;