/* eslint-disable max-len */ import { DefaultTheme, styled } from '@styled-components' import React from 'react' import { SpaceProps, variant as styledVariant } from 'styled-system' import { Box } from '../../atoms/box/index.js' import { Button } from '../../atoms/button/index.js' import { Icon, IconProps } from '../../atoms/icon/index.js' import { Text } from '../../atoms/text/index.js' import { cssClass } from '../../utils/css-class.js' /** * Prop Types of a MessageBox component. * Apart from those defined below it extends all {@link SpaceProps} * * @memberof MessageBox * @alias MessageBoxProps */ type MessageBoxProps = { /** Triggered when user clicks close button. If not given close button won't be seen */ onCloseClick?: () => void /** Title content of a message */ message?: string /** * Variant * @default 'info' */ variant?: 'danger' | 'warning' | 'success' | 'info' /** Icon which will be seen in the title */ icon?: IconProps['icon'] /** Size variant */ size?: 'sm' /** Optional html style property */ style?: Record /** Optional children, when given component will be expanded */ children?: React.ReactNode } type Props = SpaceProps & MessageBoxProps export { Props as MessageBoxProps } const sizeVariants = styledVariant({ prop: 'size', variants: { sm: { boxShadow: 'none', [`& > ${cssClass('Button')}`]: { margin: '0px', }, }, }, }) const StyledMessageBox: any = styled(Box)` line-height: ${({ theme }) => theme.lineHeights.default}; border-radius: 4px; color: ${({ theme }) => theme.colors.text}; padding: 12px 22px; white-space: pre-wrap; & .${cssClass('Icon')} { display: flex; } ${sizeVariants}; ` /** * @classdesc * * * * Component responsible for rendering standard danger/info/success * messages. * * It has 2 size versions: default and small. Also it can either contain or * don't contain children, which causes different look. * * ### Usage * * ```javascript * import { MessageBox, MessageBoxProps } from '@adminjs/design-system' * ``` * * @component * @subcategory Molecules * @hideconstructor * @see MessageBoxProps * @see {@link https://storybook.adminjs.co/?path=/story/designsystem-molecules-messagebox--default Storybook} * @example Different variants * return ( * * alert('close clicked')} /> * alert('close clicked')} /> * alert('close clicked')} /> * * ) * @example Different variants with children * return ( * * alert('close clicked')}> * With inside text * * alert('close clicked')}> * With inside text * * alert('close clicked')}> * With inside text * * * ) * @example Small with an icon and inside text * return ( * * alert('close clicked')} * > * With inside text * * * ) * @section design-system */ export const MessageBox: React.FC = (props) => { const { onCloseClick, message, icon, children, variant = 'info', size, ...other } = props const variantIcon: Record = { success: 'Check', danger: 'XCircle', info: 'Info', warning: 'AlertCircle', } const variantBg: Record = { success: 'successLight', danger: 'errorLight', info: 'infoLight', warning: 'warningLight', } const variantIconBg: Record = { success: 'success', danger: 'error', info: 'info', warning: 'warning', } return ( {variantIcon && ( )} {message} {onCloseClick && ( )} {children} ) } MessageBox.displayName = 'MessageBox' export default MessageBox