import _ from 'lodash';
import React from 'react';
import PropTypes from 'prop-types';
import { getFirst, StandardProps } from '../../util/component-types';
import { lucidClassNames } from '../../util/style-helpers';
import LoadingIndicator from '../LoadingIndicator/LoadingIndicator';
import OverlayWrapper, {
OverlayWrapperMessage,
} from '../OverlayWrapper/OverlayWrapper';
const cx = lucidClassNames.bind('&-EmptyStateWrapper');
const { any, bool, node, string } = PropTypes;
export interface IEmptyStateWrapperBodyProps extends StandardProps {}
const EmptyStateWrapperBody = (_props: IEmptyStateWrapperBodyProps): null =>
null;
export interface IEmptyStateWrapperTitleProps extends StandardProps {}
const EmptyStateWrapperTitle = (_props: IEmptyStateWrapperTitleProps): null =>
null;
export interface IEmptyStateWrapperProps extends StandardProps {
/** *Child Element* The element to display in the body of the overlay. */
Body?: React.ReactNode;
/** *Child Element* The element to display in the title of the overlay. */
Title?: React.ReactNode | string;
/** Controls the visibility of the \`EmptyMessage\`. */
isEmpty: boolean;
/** Controls the visibility of the \`LoadingMessage\`. */
isLoading: boolean;
/** Position the `EmptyMessage` and `LoadingMessage` near the top of the container. */
anchorMessage: boolean;
}
const nonPassthroughs = [
'className',
'children',
'isEmpty',
'isLoading',
'anchorMessage',
'Body',
'Title',
'initialState',
'callbackId',
];
const defaultProps = {
isEmpty: false,
isLoading: false,
anchorMessage: false,
};
export const EmptyStateWrapper = (
props: IEmptyStateWrapperProps
): React.ReactElement => {
const {
children,
className,
isEmpty,
isLoading,
anchorMessage,
...passThroughs
} = props;
const emptyMessageBodyProp = _.get(
getFirst(props, EmptyStateWrapperBody),
'props'
);
const emptyMessageTitleProp = _.get(
getFirst(props, EmptyStateWrapperTitle),
'props',
{ children: 'You have no data.' }
);
return isLoading ? (
{children}
) : (
{emptyMessageBodyProp &&
}
{children}
);
};
EmptyStateWrapper._isPrivate = true;
EmptyStateWrapper.peek = {
description: `A wrapper which can display either a \`LoadingIndicator\` or \`OverlayWrapper\`.`,
categories: ['utility'],
madeFrom: ['LoadingIndicator', 'OverlayWrapper'],
};
EmptyStateWrapper.displayName = 'EmptyStateWrapper';
EmptyStateWrapper.defaultProps = defaultProps;
EmptyStateWrapper.propTypes = {
/**
Class names that are appended to the defaults.
*/
className: string,
/**
Any valid React children.
*/
children: node,
/**
Controls the visibility of the \`EmptyMessage\`.
*/
isEmpty: bool,
/**
Controls the visibility of the \`LoadingMessage\`.
*/
isLoading: bool,
/**
Position the \`EmptyMessage\` and \`LoadingMessage\` near the top of the container.
*/
anchorMessage: bool,
/**
* Child Element* The element to display in the body of the overlay.
*/
Body: any,
/**
* Child Element* The element to display in the title of the overlay.
*/
Title: any,
};
EmptyStateWrapperBody.displayName = 'EmptyStateWrapper.Body';
EmptyStateWrapper.Body = EmptyStateWrapperBody;
EmptyStateWrapperBody.peek = {
description: `Body content for the message to display when there is no data.`,
};
EmptyStateWrapperBody.propName = 'Body';
EmptyStateWrapperTitle.displayName = 'EmptyStateWrapper.Title';
EmptyStateWrapper.Title = EmptyStateWrapperTitle;
EmptyStateWrapperTitle.peek = {
description: `Title text for the message to display when there is no data.`,
};
EmptyStateWrapperTitle.propName = 'Title';
export default EmptyStateWrapper;