import React, { CSSProperties, HTMLAttributes, ReactNode, useState } from 'react' import classnames from 'classnames' import { usePrefix } from '../ConfigProvider' import { concat } from '../utils' import { CloseIcon, CheckCircleIcon, InfoIcon, TipIcon, CloseCircleIcon } from '../icons' import { EnvProvider } from '../Link/env' import { WithRef } from '../utils/type' export type AlertType = 'default' | 'info' | 'error' | 'success' | 'warning' export type AlertClosableObject = { icon?: ReactNode, onClose?(): void } export type AlertClosable = boolean | AlertClosableObject export type AlertProps = { /** 左侧 icon */ icon?: ReactNode type?: AlertType message: ReactNode desc?: ReactNode /** * 是否可关闭 & 自定义关闭按钮和 onClose * * 如果为 `true` 则会用默认的关闭图标 * * @default undefined */ closable?: AlertClosable className?: string style?: CSSProperties /** * 根元素的 html 属性 */ rootHtmlProps?: WithRef, HTMLDivElement> } export default function Alert(props: AlertProps) { const { className, message, desc, icon, type = 'default', closable, rootHtmlProps, style, ...rest } = props const [visible, setVisible] = useState(true) const prefix = usePrefix('alert') const typePrefix = concat(prefix, type) const iconPrefix = concat(prefix, 'icon') const contentPrefix = concat(prefix, 'content') const closePrefix = concat(prefix, 'close') const descPrefix = concat(contentPrefix, 'desc') const innerIcon = icon === true ? getIconByType(type) : icon const innerCloseIcon = getCloseIcon(closable) function handleClose() { if (closable === true) { setVisible(false) return } if (typeof closable === 'object') { setVisible(false) closable.onClose?.() } } const cls = classnames( className, prefix, typePrefix, desc && concat(prefix, 'has-desc'), rootHtmlProps?.className ) if (visible === false) { return null } return (
{icon &&
{innerIcon}
}
{message} {desc &&
{desc}
}
{innerCloseIcon && {innerCloseIcon}}
) } function getIconByType(type: AlertType) { switch (type) { case 'info': default: return case 'success': return case 'error': return case 'warning': return } } function getCloseIcon(closable?: AlertClosable) { if (closable === true) { return } if (typeof closable === 'object') { return closable.icon ?? } return null }