UNPKG

@i-novus/ui-core

Version:

Базовые UI компоненты

37 lines (36 loc) 2.46 kB
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime"; import { cloneElement, forwardRef, useCallback, useEffect, useRef, useState, } from 'react'; import classNames from 'classnames'; import { useConfigProvider } from '../../core'; import { Tooltip } from '../Tooltip'; import { getActiveElement } from '../../utils/get-active-dom-node'; const DEFAULT_GET_CONTAINER = () => document?.body; export const Body = forwardRef((props, ref) => { const { components, open: openExternal = false, visible = true, onOpenChange: setIsOpenExternal, onClose: onCloseExternal, prefix, children, className, childrenWrapperClassName, trigger = 'click', size = 'sm', getContainer = DEFAULT_GET_CONTAINER, disabled = false, readOnly = false, afterShow, afterHide, returnFocusRef, onCaptureSetFocusAfterTabKeyDown, ...restProps } = props; const { Header, Content, Footer } = components; const trapContainerRef = useRef(null); const { getPrefix, root } = useConfigProvider(); const prefixCls = getPrefix(prefix); const [openInternal, setOpenInternal] = useState(openExternal); const hasExternalOpenProp = 'open' in props; const onOpenChangeInternal = useCallback((open) => { if (disabled || readOnly) { return; } if (!hasExternalOpenProp) { setOpenInternal(open); } setIsOpenExternal?.(open); }, [disabled, hasExternalOpenProp, readOnly, setIsOpenExternal]); const onCloseInternal = useCallback(() => { onOpenChangeInternal(false); onCloseExternal?.(); }, [onCloseExternal, onOpenChangeInternal]); useEffect(() => { setOpenInternal(openExternal); if (!openExternal && trapContainerRef.current?.contains(getActiveElement())) { returnFocusRef?.current?.focus(); } }, [openExternal, returnFocusRef]); return (_jsx(Tooltip, { ...restProps, ref: ref, afterShow: afterShow, afterHide: afterHide, visible: visible, className: classNames(root, `${prefixCls}-popover-default`, `${prefixCls}-popover_${size}`, className), childrenWrapperClassName: childrenWrapperClassName, content: (_jsxs("div", { ref: trapContainerRef, tabIndex: -1, children: [Header && cloneElement(Header, { onClose: onCloseInternal }), Content, Footer] })), isOpen: openInternal, setIsOpen: onOpenChangeInternal, getContainer: getContainer, openOnClick: trigger === 'click', clickable: true, noArrow: true, children: children })); });