monday-ui-react-core
Version:
Official monday.com UI resources for application development in React.js
74 lines (70 loc) • 2.23 kB
JSX
/* eslint-disable react/jsx-props-no-spreading */
import React, { cloneElement, useRef, useCallback } from "react";
import classNames from "classnames";
import { CSSTransition } from "react-transition-group";
import useOnClickOutside from "../../../hooks/useClickOutside";
import { chainFunctions } from "../../../utils/function-utils";
import "./DialogContent.scss";
import useKeyEvent from "../../../hooks/useKeyEvent";
const transitionOptions = {};
const NOOP = () => {};
const EMPTY_OBJECT = {};
export const DialogContent = React.forwardRef(
(
{
onEsc = NOOP,
children,
position,
wrapperClassName,
isOpen = false,
startingEdge,
animationType = "expand",
onMouseEnter = NOOP,
onMouseLeave = NOOP,
onClickOutside = NOOP,
onClick = NOOP,
showDelay,
styleObject = EMPTY_OBJECT
},
forwardRef
) => {
const ref = useRef(null);
const onOutSideClick = useCallback(
event => {
if (isOpen) {
return onClickOutside(event);
}
},
[isOpen, onClickOutside]
);
useKeyEvent({ keys: ["Esc", "Escape"], callback: onEsc });
useOnClickOutside({ callback: onOutSideClick, ref });
if (animationType) {
transitionOptions.classNames = `monday-style-animation-${animationType}`;
}
return (
<span
className={classNames("monday-style-dialog-content-wrapper", wrapperClassName)}
ref={forwardRef}
style={styleObject}
onClickCapture={onClick}
>
<CSSTransition {...transitionOptions} in={isOpen} appear={!!animationType} timeout={showDelay}>
<div
className={classNames("monday-style-dialog-content-component", position, {
[`edge-${startingEdge}`]: startingEdge
})}
ref={ref}
>
{React.Children.toArray(children).map(child => {
return cloneElement(child, {
onMouseEnter: chainFunctions([child.props.onMouseEnter, onMouseEnter]),
onMouseLeave: chainFunctions([child.props.onMouseLeave, onMouseLeave])
});
})}
</div>
</CSSTransition>
</span>
);
}
);