diff --git a/src/components/empty_prompt/empty_prompt.styles.ts b/src/components/empty_prompt/empty_prompt.styles.ts index e29db4bd508c..44663248fdea 100644 --- a/src/components/empty_prompt/empty_prompt.styles.ts +++ b/src/components/empty_prompt/empty_prompt.styles.ts @@ -20,7 +20,7 @@ export const euiEmptyPromptStyles = (euiThemeContext: UseEuiTheme) => { const { euiTheme } = euiThemeContext; const generatePaddingStyles = (property = 'padding') => ({ - none: css``, + none: null, s: css` ${property}: ${euiPaddingSize(euiThemeContext, 's')} `, diff --git a/src/components/empty_prompt/empty_prompt.tsx b/src/components/empty_prompt/empty_prompt.tsx index 8993aa2424cc..fb919eecbf71 100644 --- a/src/components/empty_prompt/empty_prompt.tsx +++ b/src/components/empty_prompt/empty_prompt.tsx @@ -6,11 +6,16 @@ * Side Public License, v 1. */ -import React, { FunctionComponent, ReactElement, ReactNode } from 'react'; +import React, { + FunctionComponent, + ReactElement, + ReactNode, + useMemo, +} from 'react'; import classNames from 'classnames'; import { useEuiTheme } from '../../services'; -import { CommonProps, keysOf } from '../common'; +import { CommonProps } from '../common'; import { EuiTitle, EuiTitleSize } from '../title'; import { EuiFlexGroup, EuiFlexItem } from '../flex'; import { EuiSpacer } from '../spacer'; @@ -21,15 +26,7 @@ import { EuiPanel, _EuiPanelDivlike } from '../panel/panel'; import { euiEmptyPromptStyles } from './empty_prompt.styles'; -const paddingSizeToClassNameMap = { - none: null, - s: 'euiEmptyPrompt--paddingSmall', - m: 'euiEmptyPrompt--paddingMedium', - l: 'euiEmptyPrompt--paddingLarge', -}; - -export const PADDING_SIZES = keysOf(paddingSizeToClassNameMap); - +export const PADDING_SIZES = ['none', 's', 'm', 'l'] as const; export type PaddingSize = (typeof PADDING_SIZES)[number]; export type EuiEmptyPromptProps = CommonProps & @@ -99,51 +96,55 @@ export const EuiEmptyPrompt: FunctionComponent = ({ footer, ...rest }) => { + const classes = classNames('euiEmptyPrompt', className); const euiTheme = useEuiTheme(); - const styles = euiEmptyPromptStyles(euiTheme); + const styles = useMemo(() => euiEmptyPromptStyles(euiTheme), [euiTheme]); const cssStyles = [styles.euiEmptyPrompt, styles[layout]]; + const mainStyles = [ + styles.main.euiEmptyPrompt__main, + styles.main[layout], + styles.main[paddingSize], + layout === 'horizontal' && styles.main.horizontalPadding[paddingSize], + ]; + const contentStyles = [ + styles.content.euiEmptyPrompt__content, + styles.content[layout], + ]; - const isVerticalLayout = layout === 'vertical'; // Default the iconColor to `subdued`, // otherwise try to match the iconColor with the panel color unless iconColor is specified const iconColor = _iconColor ?? (isNamedColor(color) ? color : 'subdued'); + const iconNode = useMemo(() => { + if (!iconType && !icon) return null; + + const iconStyles = [styles.icon.euiEmptyPrompt__icon, styles.icon[layout]]; + return ( +
+ {iconType ? ( + + ) : ( + icon + )} +
+ ); + }, [icon, iconType, iconColor, layout, styles.icon]); - const iconNode = iconType ? ( - - ) : ( - icon - ); - - let titleNode; - let bodyNode; - if (body || title) { - if (title) { - titleNode = {title}; - } - - if (body) { - bodyNode = ( - <> - {title && } - {body} - - ); - } - } - - let actionsNode; - if (actions) { - let actionsRow; + const actionsNode = useMemo(() => { + if (!actions) return null; if (Array.isArray(actions)) { - actionsRow = ( + const actionStyles = [ + styles.actions.euiEmptyPrompt__actions, + styles.actions[layout], + ]; + return ( {actions.map((action, index) => ( @@ -153,31 +154,24 @@ export const EuiEmptyPrompt: FunctionComponent = ({ ); } else { - actionsRow = actions; + return actions; } - - actionsNode = ( - <> - - {actionsRow} - + }, [actions, layout, styles.actions]); + + const footerNode = useMemo(() => { + if (!footer) return null; + const footerStyles = [ + styles.footer.euiEmptyPrompt__footer, + styles.footer[paddingSize], + styles.footer[color], + color === 'transparent' && !hasBorder && styles.footer.roundedBorders, + ]; + return ( +
+ {footer} +
); - } - - const contentNodes = ( - <> - {titleNode} - {bodyNode} - {actionsNode} - - ); - - const classes = classNames( - 'euiEmptyPrompt', - [`euiEmptyPrompt--${layout}`], - paddingSizeToClassNameMap[paddingSize], - className - ); + }, [footer, paddingSize, color, hasBorder, styles.footer]); return ( = ({ hasBorder={hasBorder} {...rest} > -
- {iconNode && ( -
- {iconNode} -
- )} -
- {contentNodes} +
+ {iconNode} +
+ {title && {title}} + {title && body && } + {body && {body}} + {actionsNode && (body || title) && } + {actionsNode}
- {footer && ( -
- {footer} -
- )} + {footerNode} ); };