import { FC, useState } from 'react'; import { Box, BoxProps, IconButton } from '@mui/material'; import { Close as CloseIcon, Error as ErrorIcon, Info as InfoIcon, Warning as WarningIcon, } from '@mui/icons-material'; import { BLACK, BORDER_RADIUS, GREY, PURPLE, RED, TEXT, } from '../lib/consts/DEFAULT_THEME'; import { BodyText } from './Text'; type MessageBoxType = 'error' | 'info' | 'warning'; type MessageBoxOptionalProps = { isAllowClose?: boolean; type?: MessageBoxType; }; type MessageBoxProps = BoxProps & MessageBoxOptionalProps & { text: string; }; const MESSAGE_BOX_CLASS_PREFIX = 'MessageBox'; const MESSAGE_BOX_CLASSES: Record = { error: `${MESSAGE_BOX_CLASS_PREFIX}-error`, info: `${MESSAGE_BOX_CLASS_PREFIX}-info`, warning: `${MESSAGE_BOX_CLASS_PREFIX}-warning`, }; const MESSAGE_BOX_TYPE_MAP_TO_ICON = { error: , info: , warning: , }; const MESSAGE_BOX_DEFAULT_PROPS: Required = { isAllowClose: false, type: 'info', }; const MessageBox: FC = ({ isAllowClose, type = MESSAGE_BOX_DEFAULT_PROPS.type, text, ...boxProps }) => { const { sx: boxSx } = boxProps; const [isShow, setIsShow] = useState(true); const buildMessageBoxClasses = (messageBoxType: MessageBoxType) => MESSAGE_BOX_CLASSES[messageBoxType]; const buildMessageIcon = (messageBoxType: MessageBoxType) => MESSAGE_BOX_TYPE_MAP_TO_ICON[messageBoxType] === undefined ? MESSAGE_BOX_TYPE_MAP_TO_ICON.info : MESSAGE_BOX_TYPE_MAP_TO_ICON[messageBoxType]; const buildMessage = (message: string, messageBoxType: MessageBoxType) => ( ); const combinedBoxSx: BoxProps['sx'] = { alignItems: 'center', borderRadius: BORDER_RADIUS, display: 'flex', flexDirection: 'row', padding: '.3em .6em', '& > *': { color: TEXT, }, '& > :first-child': { marginRight: '.3em', }, '& > :nth-child(2)': { flexGrow: 1, }, [`&.${MESSAGE_BOX_CLASSES.error}`]: { backgroundColor: RED, }, [`&.${MESSAGE_BOX_CLASSES.info}`]: { backgroundColor: GREY, '& > *': { color: `${BLACK}`, }, }, [`&.${MESSAGE_BOX_CLASSES.warning}`]: { backgroundColor: PURPLE, }, ...boxSx, }; return isShow ? ( {buildMessageIcon(type)} {buildMessage(text, type)} {isAllowClose && ( { setIsShow(false); }} > )} ) : ( <> ); }; MessageBox.defaultProps = MESSAGE_BOX_DEFAULT_PROPS; export type { MessageBoxProps, MessageBoxType }; export default MessageBox;