UNPKG

monday-ui-react-core

Version:

Official monday.com UI resources for application development in React.js

160 lines (154 loc) • 5.23 kB
import { useRef, forwardRef, useMemo } from "react"; import PropTypes from "prop-types"; import cx from "classnames"; import useMergeRefs from "../../hooks/useMergeRefs"; import { DialogPositions } from "../../constants/sizes"; import Tooltip from "../Tooltip/Tooltip"; import { DIALOG_ANIMATION_TYPES } from "../../constants/AnimationTypes"; import Button from "../Button/Button"; import TipseenTitle from "./TipseenTitle"; import { BEMClass } from "../../helpers/bem-helper"; import Icon from "../Icon/Icon"; import CloseSmall from "../Icon/Icons/components/CloseSmall"; import { TOOLTIP_JUSTIFY_TYPES } from "../Tooltip/TooltipConstants"; import "./Tipseen.scss"; import { TIPSEEN_CLOSE_BUTTON_ARIA_LABEL } from "./TipseenConstants"; const TIPSEEN_BASE_CSS_CLASS = "monday-style-tipseen"; const bemHelper = BEMClass(TIPSEEN_BASE_CSS_CLASS); const Tipseen = forwardRef( ( { className, id, position, animationType, hideDelay, showDelay, title, isCloseButtonHidden, onClose, closeAriaLabel, children, content, justify, containerSelector, hideTrigger, isCloseButtonOnImage, showTrigger, width, moveBy, hideWhenReferenceHidden }, ref ) => { const componentRef = useRef(null); const mergedRef = useMergeRefs({ refs: [ref, componentRef] }); const overrideCloseAriaLabel = closeAriaLabel || TIPSEEN_CLOSE_BUTTON_ARIA_LABEL; const tooltipContent = useMemo( () => ( <div className={TIPSEEN_BASE_CSS_CLASS}> <div className={bemHelper({ element: "header" })}> {isCloseButtonHidden ? null : ( <Button className={cx(bemHelper({ element: "close-button" }), { [bemHelper({ element: "close-button", state: "on-image" })]: isCloseButtonOnImage })} onClick={onClose} size={Button.sizes.SMALL} kind={Button.kinds.TERTIARY} color={isCloseButtonOnImage ? Button.colors.ON_INVERTED_BACKGROUND : Button.colors.ON_PRIMARY_COLOR} ariaLabel={overrideCloseAriaLabel} > <Icon clickable={false} icon={CloseSmall} iconSize={20} ignoreFocusStyle /> </Button> )} <TipseenTitle text={title} className={bemHelper({ element: "title" })} /> </div> <div className={bemHelper({ element: "content" })}>{content}</div> </div> ), [content, isCloseButtonHidden, isCloseButtonOnImage, onClose, overrideCloseAriaLabel, title] ); return ( <div ref={mergedRef} id={id}> <Tooltip className={cx(`${TIPSEEN_BASE_CSS_CLASS}-wrapper`, className, { [`${TIPSEEN_BASE_CSS_CLASS}-wrapper--without-custom-width`]: !width })} style={width ? { width } : undefined} shouldShowOnMount position={position} animationType={animationType} hideDelay={hideDelay} showDelay={showDelay} hideTrigger={hideTrigger} showTrigger={showTrigger} content={tooltipContent} theme={Tooltip.themes.Primary} justify={justify} containerSelector={containerSelector} disableDialogSlide={false} moveBy={moveBy} hideWhenReferenceHidden={hideWhenReferenceHidden} > {children} </Tooltip> </div> ); } ); Tipseen.positions = { LEFT: DialogPositions.LEFT, RIGHT: DialogPositions.RIGHT, TOP: DialogPositions.TOP, BOTTOM: DialogPositions.BOTTOM }; Tipseen.animationTypes = DIALOG_ANIMATION_TYPES; Tipseen.justifyTypes = TOOLTIP_JUSTIFY_TYPES; Tipseen.propTypes = { className: PropTypes.string, id: PropTypes.string, position: PropTypes.oneOf([ Tipseen.positions.LEFT, Tipseen.positions.RIGHT, Tipseen.positions.TOP, Tipseen.positions.BOTTOM ]), animationType: PropTypes.oneOf([Tipseen.animationTypes.EXPAND, Tipseen.animationTypes.OPACITY_AND_SLIDE]), hideDelay: PropTypes.number, showDelay: PropTypes.number, title: PropTypes.string, isCloseButtonHidden: PropTypes.bool, children: PropTypes.oneOfType([PropTypes.element, PropTypes.string]), containerSelector: PropTypes.string, // eslint-disable-next-line react/no-unused-prop-types hideTrigger: PropTypes.array, // eslint-disable-next-line react/no-unused-prop-types showTrigger: PropTypes.array, justify: PropTypes.oneOf([Tipseen.justifyTypes.START, Tipseen.justifyTypes.CENTER, Tipseen.justifyTypes.END]), width: PropTypes.number, moveBy: PropTypes.shape({ main: PropTypes.number, secondary: PropTypes.number }), hideWhenReferenceHidden: PropTypes.bool }; Tipseen.defaultProps = { className: "", id: "", position: Tipseen.positions.BOTTOM, animationType: Tipseen.animationTypes.EXPAND, hideDelay: 0, showDelay: 0, title: undefined, isCloseButtonHidden: false, children: null, containerSelector: undefined, hideTrigger: [], showTrigger: [], justify: Tipseen.justifyTypes.CENTER, width: undefined, moveBy: undefined, hideWhenReferenceHidden: false }; export default Tipseen;