UNPKG

@kiwicom/orbit-components

Version:

Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com's products.

106 lines (105 loc) 3.62 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; exports.__esModule = true; exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _react2 = require("@floating-ui/react"); var _useRandomId = _interopRequireDefault(require("../../hooks/useRandomId")); var _useStateWithTimeout = _interopRequireDefault(require("../../hooks/useStateWithTimeout")); var _TooltipContent = _interopRequireDefault(require("./components/TooltipContent")); var _TooltipWrapper = _interopRequireDefault(require("./components/TooltipWrapper")); const TooltipPrimitive = ({ children, enabled = true, tooltipShown, tabIndex = "0", onShow, dataTest, id, renderInPortal = true, size = "small", content, error, help, stopPropagation = false, removeUnderlinedText, block = false, placement, noFlip, offset }) => { const [shown, setShown] = React.useState(false); const [referenceElement, setReferenceElement] = React.useState(null); const [render, setRender, setRenderWithTimeout, clearRenderTimeout] = (0, _useStateWithTimeout.default)(false, 200); const tooltipId = (0, _useRandomId.default)(); const handleEsc = React.useCallback(ev => { if (ev.key === "Escape") { setShown(false); setRenderWithTimeout(false); document.removeEventListener("keydown", handleEsc); } }, [setRenderWithTimeout]); const handleOut = React.useCallback(() => { setShown(false); setRenderWithTimeout(false); document.removeEventListener("keydown", handleEsc); }, [handleEsc, setRenderWithTimeout]); const handleIn = React.useCallback(() => { setRender(true); setShown(true); if (onShow) onShow(); clearRenderTimeout(); document.addEventListener("keydown", handleEsc); }, [setRender, onShow, clearRenderTimeout, handleEsc]); const handleClick = React.useCallback(ev => { if (stopPropagation) { ev.stopPropagation(); } }, [stopPropagation]); React.useEffect(() => { if (tooltipShown) { handleIn(); } else { handleOut(); } }, [tooltipShown, handleIn, handleOut]); const handleOutMobile = React.useCallback(() => { setRenderWithTimeout(false); }, [setRenderWithTimeout]); if (!enabled) return /*#__PURE__*/React.createElement(React.Fragment, null, children); const tooltip = /*#__PURE__*/React.createElement(_TooltipContent.default, { parent: children, dataTest: dataTest, id: id, shown: shown, size: size, error: error, help: help, tooltipId: id || tooltipId, onClick: handleClick, onClose: handleOut, onCloseMobile: handleOutMobile, onEnter: handleIn, placement: placement, noFlip: noFlip, offset: offset, referenceElement: referenceElement }, content); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_TooltipWrapper.default, { onMouseEnter: handleIn, onMouseLeave: handleOut, onClick: handleClick, onFocus: handleIn, onBlur: handleOut, ref: setReferenceElement, "aria-describedby": shown ? id || tooltipId : undefined, tabIndex: enabled ? Number(tabIndex) : undefined, enabled: enabled, removeUnderlinedText: removeUnderlinedText, block: block }, children), enabled && render && (renderInPortal ? /*#__PURE__*/React.createElement(_react2.FloatingPortal, { id: "tooltips" }, tooltip) : tooltip)); }; var _default = exports.default = TooltipPrimitive;