import * as React from 'react'; import * as PropTypes from 'prop-types'; // @ts-ignore import _omit from 'lodash/omit'; // @ts-ignore import { useUniqueId } from '../uniqueId'; import { Box } from '../primitives'; import { Omit } from '../types'; import ActionButtons, { ActionButtonsProps, actionButtonsPropTypes } from '../Button/ActionButtons'; import { ButtonProps, buttonPropTypes } from '../Button/Button'; import DialogDialog, { DialogDialogProps, LocalDialogDialogProps, dialogDialogPropTypes, dialogDialogDefaultProps } from './DialogDialog'; import DialogContent, { DialogContentProps } from './DialogContent'; import DialogHeader, { DialogHeaderProps } from './DialogHeader'; import DialogFooter, { DialogFooterProps } from './DialogFooter'; import DialogTitle, { DialogTitleProps } from './DialogTitle'; import DialogClose, { DialogCloseProps } from './DialogClose'; import DialogIcon, { DialogIconProps } from './DialogIcon'; export type LocalDialogProps = LocalDialogDialogProps & { actionButtonsProps?: ActionButtonsProps; a11yDescriptionId?: string; a11yTitleId?: string; children: React.ReactNode; className?: string; closeButtonProps?: Omit; footer?: string | React.ReactElement; hasScroll?: boolean; onClickClose?: () => void; showActionButtons?: boolean; showCloseButton?: boolean; title?: string | React.ReactElement; type?: string; }; export type DialogProps = LocalDialogProps & DialogDialogProps; export type DialogComponents = { Dialog: React.FunctionComponent; Content: React.FunctionComponent; Header: React.FunctionComponent; Footer: React.FunctionComponent; Title: React.FunctionComponent; Close: React.FunctionComponent; Icon: React.FunctionComponent; }; export const Dialog: React.FunctionComponent & DialogComponents = ({ a11yDescriptionId: _a11yDescriptionId, a11yTitleId: _a11yTitleId, actionButtonsProps, children, closeButtonProps, footer, hasScroll, onClickClose, showActionButtons, showCloseButton, title, type, ...props }) => { const titleId = useUniqueId('Dialog'); const descriptionId = useUniqueId('Dialog'); const a11yDescriptionId = _a11yDescriptionId || descriptionId; const a11yTitleId = _a11yTitleId || titleId; return ( {title && ( {typeof title === 'string' ? ( {type && } {title} ) : ( title )} {showCloseButton && } )} {children} {(footer || showActionButtons) && ( {footer && {footer}} {showActionButtons && ( )} )} ); }; Dialog.Dialog = DialogDialog; Dialog.Header = DialogHeader; Dialog.Content = DialogContent; Dialog.Footer = DialogFooter; Dialog.Title = DialogTitle; Dialog.Close = DialogClose; Dialog.Icon = DialogIcon; export const dialogPropTypes = { actionButtonsProps: PropTypes.shape(actionButtonsPropTypes), a11yDescriptionId: PropTypes.string, a11yTitleId: PropTypes.string, children: PropTypes.node.isRequired, className: PropTypes.string, closeButtonProps: PropTypes.shape(_omit(buttonPropTypes, 'children')), footer: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), hasScroll: PropTypes.bool, onClickClose: PropTypes.func, showActionButtons: PropTypes.bool, showCloseButton: PropTypes.bool, title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), type: PropTypes.string, ...dialogDialogPropTypes }; Dialog.propTypes = dialogPropTypes; export const dialogDefaultProps = { ...dialogDialogDefaultProps, actionButtonsProps: {}, a11yDescriptionId: undefined, a11yTitleId: undefined, className: undefined, closeButtonProps: {}, footer: undefined, hasScroll: false, onClickClose: undefined, showActionButtons: false, showCloseButton: false, title: undefined, type: undefined }; Dialog.defaultProps = dialogDefaultProps; // @ts-ignore const C: React.FunctionComponent & DialogComponents = Dialog; export default C;