/* eslint-disable react/prop-types */
import _, { omit } from 'lodash';
import React from 'react';
import PropTypes from 'prop-types';
import { lucidClassNames } from '../../util/style-helpers';
import { getFirst, StandardProps } from '../../util/component-types';
import LoadingIcon from '../Icon/LoadingIcon/LoadingIcon';
const cx = lucidClassNames.bind('&-LoadingMessage');
const { any, node, string } = PropTypes;
/** Loading Message Icon */
export interface ILoadingMessageIconProps extends StandardProps {
description?: string;
}
const LoadingMessageIcon = (_props: ILoadingMessageIconProps): null => null;
LoadingMessageIcon.displayName = 'LoadingMessage.Icon';
LoadingMessageIcon.peek = {
description: `Renders the \`Icon\` element passed in.`,
};
LoadingMessageIcon.propName = 'Icon';
LoadingMessageIcon.propTypes = {
description: string,
children: any,
};
/** Loading Message Title */
export interface ILoadingMessageTitleProps extends StandardProps {
description?: string;
}
const LoadingMessageTitle = (_props: ILoadingMessageTitleProps): null => null;
LoadingMessageTitle.displayName = 'LoadingMessage.Title';
LoadingMessageTitle.peek = {
description: `Renders an \`
\` that represents the title of the \`LoadingMessage\`. Defaults to the string "Loading".`,
};
LoadingMessageTitle.propName = 'Title';
LoadingMessageTitle.propTypes = {
description: string,
children: any,
};
/** Loading Message Body */
export interface ILoadingMessageBodyProps extends StandardProps {
description?: string;
}
const LoadingMessageBody = (_props: ILoadingMessageBodyProps): null => null;
LoadingMessageBody.displayName = 'LoadingMessage.Body';
LoadingMessageBody.peek = {
description: `Renders a \`\` that represents the body of the \`LoadingMessage\`.`,
};
LoadingMessageBody.propName = 'Body';
LoadingMessageBody.propTypes = {
description: string,
children: any,
};
/** Loading Message */
export interface ILoadingMessageProps
extends StandardProps,
React.DetailedHTMLProps<
React.HTMLAttributes,
HTMLDivElement
> {
/** Custom Icon element (alias for `LoadingMessage.Icon`) */
Icon?: React.ReactNode;
/** Custom Title element (alias for `LoadingMessage.Title`) */
Title?: React.ReactNode;
/** Custom Body element (alias for `LoadingMessage.Body`) */
Body?: React.ReactNode;
}
export const LoadingMessage = (
props: ILoadingMessageProps
): React.ReactElement => {
const { className, ...passThroughs } = props;
const { Icon, Title, Body } = LoadingMessage;
const defaultTitle = 'Loading';
const iconElement = getFirst(props, Icon);
const iconChildren = _.get(iconElement, 'props.children', );
const titleElement = getFirst(props, Title);
const titleChildren = _.get(titleElement, 'props.children');
const bodyElement = getFirst(props, Body);
const bodyChildren = _.get(bodyElement, 'props.children', null);
return (
{iconChildren}
{!_.isNull(titleChildren) && (
{titleChildren || defaultTitle}
)}
{bodyChildren && {bodyChildren}}
);
};
LoadingMessage.Icon = LoadingMessageIcon;
LoadingMessage.Title = LoadingMessageTitle;
LoadingMessage.Body = LoadingMessageBody;
LoadingMessage._isPrivate = true;
LoadingMessage.displayName = 'LoadingMessage';
LoadingMessage.peek = {
description: `A loading message.`,
categories: ['communication'],
madeFrom: ['LoadingIcon'],
};
LoadingMessage.propTypes = {
/**
Class names that are appended to the defaults.
*/
className: string,
/**
Any valid React children.
*/
children: node,
/**
Custom Icon element (alias for \`LoadingMessage.Icon\`)
*/
Icon: node,
/**
Custom Title element (alias for \`LoadingMessage.Title\`)
*/
Title: node,
/**
Custom Body element (alias for \`LoadingMessage.Body\`)
*/
Body: node,
};
export default LoadingMessage;