@i-novus/ui-core
Version:
Базовые UI компоненты
37 lines (36 loc) • 2.46 kB
JavaScript
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 }));
});